From e90504fe6211eca08472e71243513dc6e08b51fc Mon Sep 17 00:00:00 2001 From: Piotr Tabor Date: Thu, 29 Apr 2021 09:34:54 +0200 Subject: [PATCH] Unify shared code (and constants) with cindex package. --- etcdctl/ctlv3/command/migrate_command.go | 3 ++- server/etcdserver/cindex/cindex.go | 25 +++++++++++++++++++----- server/mvcc/kvstore.go | 7 +++---- server/mvcc/util.go | 21 -------------------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/etcdctl/ctlv3/command/migrate_command.go b/etcdctl/ctlv3/command/migrate_command.go index 33e87c09e..deba3c2ff 100644 --- a/etcdctl/ctlv3/command/migrate_command.go +++ b/etcdctl/ctlv3/command/migrate_command.go @@ -36,6 +36,7 @@ import ( "go.etcd.io/etcd/server/v3/etcdserver/api/snap" "go.etcd.io/etcd/server/v3/etcdserver/api/v2error" "go.etcd.io/etcd/server/v3/etcdserver/api/v2store" + "go.etcd.io/etcd/server/v3/etcdserver/cindex" "go.etcd.io/etcd/server/v3/mvcc" "go.etcd.io/etcd/server/v3/mvcc/backend" "go.etcd.io/etcd/server/v3/wal" @@ -91,7 +92,7 @@ func migrateCommandFunc(cmd *cobra.Command, args []string) { }() readKeys(reader, be) - mvcc.UpdateConsistentIndex(be, index) + cindex.UpdateConsistentIndex(be.BatchTx(), index) err := <-errc if err != nil { fmt.Println("failed to transform keys") diff --git a/server/etcdserver/cindex/cindex.go b/server/etcdserver/cindex/cindex.go index ed5c14b56..25bbeb872 100644 --- a/server/etcdserver/cindex/cindex.go +++ b/server/etcdserver/cindex/cindex.go @@ -80,11 +80,7 @@ func (ci *consistentIndex) UnsafeSave(tx backend.BatchTx) { // Never save 0 as it means that we didn't loaded the real index yet. return } - bs := make([]byte, 8) // this is kept on stack (not heap) so its quick. - binary.BigEndian.PutUint64(bs, index) - // put the index into the underlying backend - // tx has been locked in TxnBegin, so there is no need to lock it again - tx.UnsafePut(MetaBucketName, ConsistentIndexKeyName, bs) + unsafeUpdateConsistentIndex(tx, index) } func (ci *consistentIndex) SetBatchTx(tx backend.BatchTx) { @@ -130,3 +126,22 @@ func ReadConsistentIndex(tx backend.ReadTx) uint64 { defer tx.Unlock() return unsafeReadConsistentIndex(tx) } + +func unsafeUpdateConsistentIndex(tx backend.BatchTx, index uint64) { + bs := make([]byte, 8) // this is kept on stack (not heap) so its quick. + binary.BigEndian.PutUint64(bs, index) + // put the index into the underlying backend + // tx has been locked in TxnBegin, so there is no need to lock it again + tx.UnsafePut(MetaBucketName, ConsistentIndexKeyName, bs) +} + +func UpdateConsistentIndex(tx backend.BatchTx, index uint64) { + tx.Lock() + defer tx.Unlock() + + oldi := unsafeReadConsistentIndex(tx) + if index <= oldi { + return + } + unsafeUpdateConsistentIndex(tx, index) +} diff --git a/server/mvcc/kvstore.go b/server/mvcc/kvstore.go index 2256902fe..ac79b07b1 100644 --- a/server/mvcc/kvstore.go +++ b/server/mvcc/kvstore.go @@ -35,9 +35,8 @@ import ( var ( keyBucketName = []byte("key") - metaBucketName = []byte("meta") + metaBucketName = cindex.MetaBucketName - consistentIndexKeyName = []byte("consistent_index") scheduledCompactKeyName = []byte("scheduledCompactRev") finishedCompactKeyName = []byte("finishedCompactRev") @@ -128,7 +127,7 @@ func NewStore(lg *zap.Logger, b backend.Backend, le lease.Lessor, ci cindex.Cons tx := s.b.BatchTx() tx.Lock() tx.UnsafeCreateBucket(keyBucketName) - tx.UnsafeCreateBucket(metaBucketName) + cindex.UnsafeCreateMetaBucket(tx) tx.Unlock() s.b.ForceCommit() @@ -308,7 +307,7 @@ func init() { DefaultIgnores = map[backend.IgnoreKey]struct{}{ // consistent index might be changed due to v2 internal sync, which // is not controllable by the user. - {Bucket: string(metaBucketName), Key: string(consistentIndexKeyName)}: {}, + {Bucket: string(metaBucketName), Key: string(cindex.ConsistentIndexKeyName)}: {}, } } diff --git a/server/mvcc/util.go b/server/mvcc/util.go index fad79c572..254676090 100644 --- a/server/mvcc/util.go +++ b/server/mvcc/util.go @@ -15,33 +15,12 @@ package mvcc import ( - "encoding/binary" "fmt" "go.etcd.io/etcd/api/v3/mvccpb" "go.etcd.io/etcd/server/v3/mvcc/backend" ) -func UpdateConsistentIndex(be backend.Backend, index uint64) { - tx := be.BatchTx() - tx.Lock() - defer tx.Unlock() - - var oldi uint64 - _, vs := tx.UnsafeRange(metaBucketName, consistentIndexKeyName, nil, 0) - if len(vs) != 0 { - oldi = binary.BigEndian.Uint64(vs[0]) - } - - if index <= oldi { - return - } - - bs := make([]byte, 8) - binary.BigEndian.PutUint64(bs, index) - tx.UnsafePut(metaBucketName, consistentIndexKeyName, bs) -} - func WriteKV(be backend.Backend, kv mvccpb.KeyValue) { ibytes := newRevBytes() revToBytes(revision{main: kv.ModRevision}, ibytes)