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.
This commit is contained in:
parent
11a44a94b1
commit
96caa6f242
8
kvdb/debug.go
Normal file
8
kvdb/debug.go
Normal file
@ -0,0 +1,8 @@
|
||||
// +build dev
|
||||
|
||||
package kvdb
|
||||
|
||||
const (
|
||||
// Switch on extra debug code.
|
||||
etcdDebug = true
|
||||
)
|
8
kvdb/etcd/debug.go
Normal file
8
kvdb/etcd/debug.go
Normal file
@ -0,0 +1,8 @@
|
||||
// +build dev
|
||||
|
||||
package etcd
|
||||
|
||||
const (
|
||||
// Switch on extra debug code.
|
||||
etcdDebug = true
|
||||
)
|
8
kvdb/etcd/nodebug.go
Normal file
8
kvdb/etcd/nodebug.go
Normal file
@ -0,0 +1,8 @@
|
||||
// +build !dev
|
||||
|
||||
package etcd
|
||||
|
||||
const (
|
||||
// Switch off extra debug code.
|
||||
etcdDebug = false
|
||||
)
|
@ -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))
|
||||
|
||||
|
@ -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
Normal file
8
kvdb/nodebug.go
Normal file
@ -0,0 +1,8 @@
|
||||
// +build !dev
|
||||
|
||||
package kvdb
|
||||
|
||||
const (
|
||||
// Switch off extra debug code.
|
||||
etcdDebug = false
|
||||
)
|
Loading…
Reference in New Issue
Block a user