Browse Source

etcd: remove assertion when creating bucket and value with the same key

This commit removes an assertion which is not needed because with etcd
we can safely create keys and values with the same key since they are
stored under different keys in the DB. This saves us one unnecessary Get
on every Put.
master
Andras Banki-Horvath 3 years ago
parent
commit
96caa6f242
No known key found for this signature in database
GPG Key ID: 80E5375C094198D8
  1. 8
      kvdb/debug.go
  2. 8
      kvdb/etcd/debug.go
  3. 8
      kvdb/etcd/nodebug.go
  4. 29
      kvdb/etcd/readwrite_bucket.go
  5. 10
      kvdb/etcd_test.go
  6. 8
      kvdb/nodebug.go

8
kvdb/debug.go

@ -0,0 +1,8 @@
// +build dev
package kvdb
const (
// Switch on extra debug code.
etcdDebug = true
)

8
kvdb/etcd/debug.go

@ -0,0 +1,8 @@
// +build dev
package etcd
const (
// Switch on extra debug code.
etcdDebug = true
)

8
kvdb/etcd/nodebug.go

@ -0,0 +1,8 @@
// +build !dev
package etcd
const (
// Switch off extra debug code.
etcdDebug = false
)

29
kvdb/etcd/readwrite_bucket.go

@ -118,6 +118,10 @@ func (b *readWriteBucket) NestedReadWriteBucket(key []byte) walletdb.ReadWriteBu
// assertNoValue checks if the value for the passed key exists.
func (b *readWriteBucket) assertNoValue(key []byte) error {
if !etcdDebug {
return nil
}
val, err := b.tx.stm.Get(string(makeValueKey(b.id, key)))
if err != nil {
return err
@ -130,6 +134,24 @@ func (b *readWriteBucket) assertNoValue(key []byte) error {
return nil
}
// assertNoBucket checks if the bucket for the passed key exists.
func (b *readWriteBucket) assertNoBucket(key []byte) error {
if !etcdDebug {
return nil
}
val, err := b.tx.stm.Get(string(makeBucketKey(b.id, key)))
if err != nil {
return err
}
if val != nil {
return walletdb.ErrIncompatibleValue
}
return nil
}
// CreateBucket creates and returns a new nested bucket with the given
// key. Returns ErrBucketExists if the bucket already exists,
// ErrBucketNameRequired if the key is empty, or ErrIncompatibleValue
@ -272,15 +294,10 @@ func (b *readWriteBucket) Put(key, value []byte) error {
return walletdb.ErrKeyRequired
}
val, err := b.tx.stm.Get(string(makeBucketKey(b.id, key)))
if err != nil {
if err := b.assertNoBucket(key); err != nil {
return err
}
if val != nil {
return walletdb.ErrIncompatibleValue
}
// Update the transaction with the new value.
b.tx.stm.Put(string(makeValueKey(b.id, key)), string(value))

10
kvdb/etcd_test.go

@ -19,6 +19,7 @@ var (
func TestEtcd(t *testing.T) {
tests := []struct {
name string
debugOnly bool
test func(*testing.T, walletdb.DB)
expectedDb map[string]string
}{
@ -103,8 +104,9 @@ func TestEtcd(t *testing.T) {
test: testBucketSequence,
},
{
name: "key clash",
test: testKeyClash,
name: "key clash",
debugOnly: true,
test: testKeyClash,
expectedDb: map[string]string{
bkey("apple"): bval("apple"),
bkey("apple", "banana"): bval("apple", "banana"),
@ -137,6 +139,10 @@ func TestEtcd(t *testing.T) {
for _, test := range tests {
test := test
if test.debugOnly && !etcdDebug {
continue
}
t.Run(test.name, func(t *testing.T) {
t.Parallel()

8
kvdb/nodebug.go

@ -0,0 +1,8 @@
// +build !dev
package kvdb
const (
// Switch off extra debug code.
etcdDebug = false
)
Loading…
Cancel
Save