From da82a6916dfa5282b611fe2bc92d062182663627 Mon Sep 17 00:00:00 2001 From: adeyemi Date: Thu, 12 Dec 2024 14:50:20 -0800 Subject: [PATCH] server: fix unexported-return using interfaces Signed-off-by: adeyemi --- server/auth/store.go | 2 +- server/auth/store_test.go | 9 ++++++--- server/etcdserver/adapters.go | 2 +- server/storage/mvcc/kvstore.go | 1 + server/storage/mvcc/watchable_store.go | 2 +- server/storage/mvcc/watchable_store_test.go | 21 +++++++++++++-------- server/storage/schema/auth.go | 2 +- server/storage/schema/schema.go | 6 ++---- server/storage/wal/version.go | 8 +++++++- 9 files changed, 33 insertions(+), 20 deletions(-) diff --git a/server/auth/store.go b/server/auth/store.go index ed3026383780..ee1a9012cbf0 100644 --- a/server/auth/store.go +++ b/server/auth/store.go @@ -938,7 +938,7 @@ func (as *authStore) IsAuthEnabled() bool { } // NewAuthStore creates a new AuthStore. -func NewAuthStore(lg *zap.Logger, be AuthBackend, tp TokenProvider, bcryptCost int) *authStore { +func NewAuthStore(lg *zap.Logger, be AuthBackend, tp TokenProvider, bcryptCost int) AuthStore { if lg == nil { lg = zap.NewNop() } diff --git a/server/auth/store_test.go b/server/auth/store_test.go index c8cd5cad7cc1..cf7bc370cd2a 100644 --- a/server/auth/store_test.go +++ b/server/auth/store_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" "golang.org/x/crypto/bcrypt" "google.golang.org/grpc/metadata" @@ -116,12 +117,14 @@ func setupAuthStore(t *testing.T) (store *authStore, teardownfunc func(t *testin // The UserAdd function cannot generate old etcd version user data (user's option is nil) // add special users through the underlying interface - addUserWithNoOption(as) + asImpl, ok := as.(*authStore) + require.Truef(t, ok, "addUserWithNoOption: needs an AuthStore implementation") + addUserWithNoOption(asImpl) tearDown := func(_ *testing.T) { as.Close() } - return as, tearDown + return asImpl, tearDown } func addUserWithNoOption(as *authStore) { @@ -136,7 +139,7 @@ func addUserWithNoOption(as *authStore) { as.refreshRangePermCache(tx) } -func enableAuthAndCreateRoot(as *authStore) error { +func enableAuthAndCreateRoot(as AuthStore) error { _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "root", HashedPassword: encodePassword("root"), Options: &authpb.UserAddOptions{NoPassword: false}}) if err != nil { return err diff --git a/server/etcdserver/adapters.go b/server/etcdserver/adapters.go index 35660a27bd0b..bc9790bc2e68 100644 --- a/server/etcdserver/adapters.go +++ b/server/etcdserver/adapters.go @@ -33,7 +33,7 @@ type serverVersionAdapter struct { *EtcdServer } -func NewServerVersionAdapter(s *EtcdServer) *serverVersionAdapter { +func NewServerVersionAdapter(s *EtcdServer) serverversion.Server { return &serverVersionAdapter{ EtcdServer: s, } diff --git a/server/storage/mvcc/kvstore.go b/server/storage/mvcc/kvstore.go index 3e1226c9174a..992143c2c98d 100644 --- a/server/storage/mvcc/kvstore.go +++ b/server/storage/mvcc/kvstore.go @@ -82,6 +82,7 @@ type store struct { // NewStore returns a new store. It is useful to create a store inside // mvcc pkg. It should only be used for testing externally. +// revive:disable-next-line:unexported-return this is used internally in the mvcc pkg func NewStore(lg *zap.Logger, b backend.Backend, le lease.Lessor, cfg StoreConfig) *store { if lg == nil { lg = zap.NewNop() diff --git a/server/storage/mvcc/watchable_store.go b/server/storage/mvcc/watchable_store.go index ee47c2c6d72e..06375b9a2fb5 100644 --- a/server/storage/mvcc/watchable_store.go +++ b/server/storage/mvcc/watchable_store.go @@ -76,7 +76,7 @@ var _ WatchableKV = (*watchableStore)(nil) // cancel operations. type cancelFunc func() -func New(lg *zap.Logger, b backend.Backend, le lease.Lessor, cfg StoreConfig) *watchableStore { +func New(lg *zap.Logger, b backend.Backend, le lease.Lessor, cfg StoreConfig) WatchableKV { s := newWatchableStore(lg, b, le, cfg) s.wg.Add(2) go s.syncWatchersLoop() diff --git a/server/storage/mvcc/watchable_store_test.go b/server/storage/mvcc/watchable_store_test.go index a418c6c78fe2..50de7466ac7f 100644 --- a/server/storage/mvcc/watchable_store_test.go +++ b/server/storage/mvcc/watchable_store_test.go @@ -44,7 +44,7 @@ func TestWatch(t *testing.T) { defer w.Close() w.Watch(0, testKey, nil, 0) - if !s.synced.contains(string(testKey)) { + if !s.(*watchableStore).synced.contains(string(testKey)) { // the key must have had an entry in synced t.Errorf("existence = false, want true") } @@ -67,7 +67,7 @@ func TestNewWatcherCancel(t *testing.T) { t.Error(err) } - if s.synced.contains(string(testKey)) { + if s.(*watchableStore).synced.contains(string(testKey)) { // the key shoud have been deleted t.Errorf("existence = true, want false") } @@ -340,7 +340,9 @@ func TestWatchNoEventLossOnCompact(t *testing.T) { require.NoError(t, err) } // fill up w.Chan() with 1 buf via 2 compacted watch response - s.syncWatchers([]mvccpb.Event{}) + sImpl, ok := s.(*watchableStore) + require.Truef(t, ok, "TestWatchNoEventLossOnCompact: needs a WatchableKV implementation") + sImpl.syncWatchers([]mvccpb.Event{}) for len(watchers) > 0 { resp := <-w.Chan() @@ -355,7 +357,7 @@ func TestWatchNoEventLossOnCompact(t *testing.T) { require.Equalf(t, nextRev, ev.Kv.ModRevision, "got event revision %d but want %d for watcher with watch ID %d", ev.Kv.ModRevision, nextRev, resp.WatchID) nextRev++ } - if nextRev == s.rev()+1 { + if nextRev == sImpl.rev()+1 { delete(watchers, resp.WatchID) } } @@ -566,10 +568,13 @@ func TestWatchBatchUnsynced(t *testing.T) { } assert.Equal(t, tc.expectRevisionBatches, revisionBatches) - s.store.revMu.Lock() - defer s.store.revMu.Unlock() - assert.Equal(t, 1, s.synced.size()) - assert.Equal(t, 0, s.unsynced.size()) + sImpl, ok := s.(*watchableStore) + require.Truef(t, ok, "TestWatchBatchUnsynced: needs a WatchableKV implementation") + + sImpl.store.revMu.Lock() + defer sImpl.store.revMu.Unlock() + assert.Equal(t, 1, sImpl.synced.size()) + assert.Equal(t, 0, sImpl.unsynced.size()) }) } } diff --git a/server/storage/schema/auth.go b/server/storage/schema/auth.go index 96ca881c5c89..b91b6eb6ac05 100644 --- a/server/storage/schema/auth.go +++ b/server/storage/schema/auth.go @@ -40,7 +40,7 @@ type authBackend struct { var _ auth.AuthBackend = (*authBackend)(nil) -func NewAuthBackend(lg *zap.Logger, be backend.Backend) *authBackend { +func NewAuthBackend(lg *zap.Logger, be backend.Backend) auth.AuthBackend { return &authBackend{ be: be, lg: lg, diff --git a/server/storage/schema/schema.go b/server/storage/schema/schema.go index b87b73cc8319..4247864b178e 100644 --- a/server/storage/schema/schema.go +++ b/server/storage/schema/schema.go @@ -22,6 +22,7 @@ import ( "go.etcd.io/etcd/api/v3/version" "go.etcd.io/etcd/server/v3/storage/backend" + "go.etcd.io/etcd/server/v3/storage/wal" ) // Validate checks provided backend to confirm that schema used is supported. @@ -47,10 +48,7 @@ func localBinaryVersion() semver.Version { return semver.Version{Major: v.Major, Minor: v.Minor} } -type WALVersion interface { - // MinimalEtcdVersion returns minimal etcd version able to interpret WAL log. - MinimalEtcdVersion() *semver.Version -} +type WALVersion = wal.Version // Migrate updates storage schema to provided target version. // Downgrading requires that provided WAL doesn't contain unsupported entries. diff --git a/server/storage/wal/version.go b/server/storage/wal/version.go index 985926503037..7fc316d07c34 100644 --- a/server/storage/wal/version.go +++ b/server/storage/wal/version.go @@ -29,9 +29,15 @@ import ( "go.etcd.io/raft/v3/raftpb" ) +// Version defines the wal version interface. +type Version interface { + // MinimalEtcdVersion returns minimal etcd version able to interpret WAL log. + MinimalEtcdVersion() *semver.Version +} + // ReadWALVersion reads remaining entries from opened WAL and returns struct // that implements schema.WAL interface. -func ReadWALVersion(w *WAL) (*walVersion, error) { +func ReadWALVersion(w *WAL) (Version, error) { _, _, ents, err := w.ReadAll() if err != nil { return nil, err