diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index a7d320c4..253b80b3 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -25,6 +25,15 @@ jobs: with: go-version: ${{ matrix.go-version }} + - name: Check Format + run: if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi + + - name: Lint + uses: golangci/golangci-lint-action@v3.6.0 + with: + args: --verbose + version: v1.53 + - name: Build run: go build -v ./... diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..0043b022 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,44 @@ +run: + timeout: 15m + skip-files: + # Skip autogenerated files. + - ^.*\.(pb|y)\.go$ + +output: + sort-results: true + +linters: + disable-all: true + enable: + - govet + - errcheck + - gosimple + - ineffassign + + +issues: + max-same-issues: 0 + exclude-rules: + - linters: + - gocritic + text: "appendAssign" + - path: _test.go + linters: + - errcheck + - ineffassign + +linters-settings: + goimports: + local-prefixes: github.com/prometheus/prometheus + ineffassign: + rules: + - + + gofumpt: + extra-rules: true + revive: + rules: + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter + - name: unused-parameter + severity: warning + disabled: true \ No newline at end of file diff --git a/engine/batch.go b/engine/batch.go index 88a809a1..1d0207d2 100644 --- a/engine/batch.go +++ b/engine/batch.go @@ -177,4 +177,3 @@ func parseLogRecordKeyAndSeq(key []byte) ([]byte, uint64) { return realKey, seqNo } - diff --git a/engine/benchmark/benchmark_test.go b/engine/benchmark/benchmark_test.go index a3cce793..b8708ebf 100644 --- a/engine/benchmark/benchmark_test.go +++ b/engine/benchmark/benchmark_test.go @@ -31,7 +31,7 @@ func GetValue() []byte { for i := 0; i < 512; i++ { str.WriteByte(alphabet[rand.Int()%36]) } - return []byte(str.String()) + return str.Bytes() } func init() { diff --git a/engine/grpc/service/string.go b/engine/grpc/service/string.go index a13a6b3e..9f88db31 100644 --- a/engine/grpc/service/string.go +++ b/engine/grpc/service/string.go @@ -21,10 +21,7 @@ func (s *Service) IsGrpcServerRunning() bool { return false } err = conn.Close() - if err != nil { - return false - } - return true + return err == nil } // StartServer starts a grpc server @@ -32,7 +29,6 @@ func (s *Service) StartServer() { listener, err := net.Listen("tcp", s.Addr) if err != nil { panic("tcp listen error: " + err.Error()) - return } server := grpc.NewServer() dbs.RegisterFlyDBServiceServer(server, s) diff --git a/engine/index/btree.go b/engine/index/btree.go index cef7e6d6..2865e442 100644 --- a/engine/index/btree.go +++ b/engine/index/btree.go @@ -51,10 +51,8 @@ func (bt *BTree) Delete(key []byte) bool { it := &Item{key: key} oldItem := bt.tree.Delete(it) - if oldItem == nil { - return false - } - return true + + return oldItem != nil } func (bt *BTree) Size() int { diff --git a/engine/iterator.go b/engine/iterator.go index c2065401..27374357 100644 --- a/engine/iterator.go +++ b/engine/iterator.go @@ -71,7 +71,7 @@ func (it *Iterator) skipToNext() { key := it.indexIter.Key() // Check if the key has the desired prefix - if prefixLen <= len(key) && bytes.Compare(it.options.Prefix, key[:prefixLen]) == 0 { + if prefixLen <= len(key) && bytes.Equal(it.options.Prefix, key[:prefixLen]) { break } } diff --git a/lib/raft/master.go b/lib/raft/master.go index 4170245f..da3197fb 100644 --- a/lib/raft/master.go +++ b/lib/raft/master.go @@ -15,13 +15,10 @@ import ( func (m *Master) ListenSlave() { timeTick := time.NewTicker(200 * time.Millisecond) - for { - select { - case <-timeTick.C: - for k, t := range m.Heartbeat { - if t.Add(5*time.Second).Unix() < time.Now().Unix() { - delete(m.Heartbeat, k) - } + for range timeTick.C { + for k, t := range m.Heartbeat { + if t.Add(5*time.Second).Unix() < time.Now().Unix() { + delete(m.Heartbeat, k) } } } @@ -29,18 +26,15 @@ func (m *Master) ListenSlave() { func (m *Master) WaitForLeader() { timeTick := time.NewTicker(100 * time.Millisecond) - for { + for range timeTick.C { + ch := m.Raft.LeaderCh() select { - case <-timeTick.C: - ch := m.Raft.LeaderCh() - select { - case isLeader := <-ch: - if isLeader { - return - } - default: - continue + case isLeader := <-ch: + if isLeader { + return } + default: + continue } } } @@ -63,7 +57,7 @@ func (m *Master) StartGrpcServer() { } }() // graceful shutdown - sig := make(chan os.Signal) + sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGKILL) <-sig diff --git a/lib/raft/raft.go b/lib/raft/raft.go index d510c827..ab11f66a 100644 --- a/lib/raft/raft.go +++ b/lib/raft/raft.go @@ -128,18 +128,18 @@ func NewRaftCluster(masterList []string, slaveList []string) *Cluster { } func (c *Cluster) startMasters() { - for _, m := range c.Master { - m.c = c + for idx := range c.Master { + c.Master[idx].c = c //start grpc server - m.StartGrpcServer() + c.Master[idx].StartGrpcServer() //start raft - m.NewRaft() + c.Master[idx].NewRaft() //wait for leader - m.WaitForLeader() + c.Master[idx].WaitForLeader() //add slave or delete slave - go m.ListenSlave() + go c.Master[idx].ListenSlave() //listen user request, by wal - go m.ListenRequest() + go c.Master[idx].ListenRequest() } } diff --git a/lib/raft/slave.go b/lib/raft/slave.go index dbbf11d4..63d012d2 100644 --- a/lib/raft/slave.go +++ b/lib/raft/slave.go @@ -29,7 +29,7 @@ func (s *Slave) StartGrpcServer() { } }() // graceful shutdown - sig := make(chan os.Signal) + sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGKILL) <-sig diff --git a/lib/wal/wal.go b/lib/wal/wal.go index 4245eee4..cd767911 100644 --- a/lib/wal/wal.go +++ b/lib/wal/wal.go @@ -36,6 +36,9 @@ func New() (*Wal, error) { return &Wal{}, err } index, err := log.LastIndex() + if err != nil { + return &Wal{}, err + } if index == 0 { err := log.Write(1, []byte("--------------------")) if err != nil { diff --git a/protocol/tcp/server.go b/protocol/tcp/server.go index e6bcedcd..699953e9 100644 --- a/protocol/tcp/server.go +++ b/protocol/tcp/server.go @@ -19,7 +19,7 @@ type Config struct { func ListenAndServeBySignal(cfg *Config, handler tcpIF.Handler) error { closeChan := make(chan struct{}) // listen system-level signal - signalChan := make(chan os.Signal) + signalChan := make(chan os.Signal, 1) // syscall.SIGHUP: terminal closed // syscall.SIGINT: ctrl + c // syscall.SIGTERM: kill