From 43c1b44875092b4b32a26fe9b8a8a66c209815e3 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 | 4 +++- server/auth/store_test.go | 8 +++++--- server/etcdserver/adapters.go | 2 +- server/etcdserver/apply/apply.go | 1 + server/mock/mockstorage/storage_recorder.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/alarm.go | 1 + server/storage/schema/auth.go | 2 +- server/storage/schema/membership.go | 1 + server/storage/wal/version.go | 1 + 12 files changed, 31 insertions(+), 15 deletions(-) diff --git a/server/auth/store.go b/server/auth/store.go index ed302638378..cfacfb001c5 100644 --- a/server/auth/store.go +++ b/server/auth/store.go @@ -36,6 +36,8 @@ import ( "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) +var _ AuthStore = (*authStore)(nil) + var ( rootPerm = authpb.Permission{PermType: authpb.READWRITE, Key: []byte{}, RangeEnd: []byte{0}} @@ -938,7 +940,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 b6b81be568d..bf708805cd6 100644 --- a/server/auth/store_test.go +++ b/server/auth/store_test.go @@ -113,12 +113,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) { @@ -133,7 +135,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 35660a27bd0..bc9790bc2e6 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/etcdserver/apply/apply.go b/server/etcdserver/apply/apply.go index e45d53e17b1..caa180e332a 100644 --- a/server/etcdserver/apply/apply.go +++ b/server/etcdserver/apply/apply.go @@ -403,6 +403,7 @@ type applierMembership struct { snapshotServer SnapshotServer } +// revive:disable-next-line:unexported-return remove when merging https://github.com/etcd-io/etcd/pull/19340/files func NewApplierMembership(lg *zap.Logger, cluster *membership.RaftCluster, snapshotServer SnapshotServer) *applierMembership { return &applierMembership{ lg: lg, diff --git a/server/mock/mockstorage/storage_recorder.go b/server/mock/mockstorage/storage_recorder.go index 41d2952e8a1..8bb3eb8aa15 100644 --- a/server/mock/mockstorage/storage_recorder.go +++ b/server/mock/mockstorage/storage_recorder.go @@ -27,10 +27,12 @@ type storageRecorder struct { dbPath string // must have '/' suffix if set } +// revive:disable-next-line:unexported-return https://github.com/etcd-io/etcd/pull/19341/files func NewStorageRecorder(db string) *storageRecorder { return &storageRecorder{&testutil.RecorderBuffered{}, db} } +// revive:disable-next-line:unexported-return remove when merging https://github.com/etcd-io/etcd/pull/19341/files func NewStorageRecorderStream(db string) *storageRecorder { return &storageRecorder{testutil.NewRecorderStream(), db} } diff --git a/server/storage/mvcc/kvstore.go b/server/storage/mvcc/kvstore.go index 44c2a625204..77c50226257 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 17f4260e4bf..0a7cb02513f 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 a418c6c78fe..50de7466ac7 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/alarm.go b/server/storage/schema/alarm.go index 6e81d0f4671..8bd8568ba05 100644 --- a/server/storage/schema/alarm.go +++ b/server/storage/schema/alarm.go @@ -26,6 +26,7 @@ type alarmBackend struct { be backend.Backend } +// revive:disable-next-line:unexported-return remove when merging https://github.com/etcd-io/etcd/pull/19342/files func NewAlarmBackend(lg *zap.Logger, be backend.Backend) *alarmBackend { return &alarmBackend{ lg: lg, diff --git a/server/storage/schema/auth.go b/server/storage/schema/auth.go index 96ca881c5c8..b91b6eb6ac0 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/membership.go b/server/storage/schema/membership.go index c79ab8b76a9..3eae23fce2b 100644 --- a/server/storage/schema/membership.go +++ b/server/storage/schema/membership.go @@ -37,6 +37,7 @@ type membershipBackend struct { be backend.Backend } +// revive:disable-next-line:unexported-return remove when merging https://github.com/etcd-io/etcd/pull/19343/files func NewMembershipBackend(lg *zap.Logger, be backend.Backend) *membershipBackend { return &membershipBackend{ lg: lg, diff --git a/server/storage/wal/version.go b/server/storage/wal/version.go index 1c0775bde55..5522ce3752a 100644 --- a/server/storage/wal/version.go +++ b/server/storage/wal/version.go @@ -31,6 +31,7 @@ import ( // ReadWALVersion reads remaining entries from opened WAL and returns struct // that implements schema.WAL interface. +// revive:disable-next-line:unexported-return remove when merging https://github.com/etcd-io/etcd/pull/19350/files func ReadWALVersion(w *WAL) (*walVersion, error) { _, _, ents, err := w.ReadAll() if err != nil {