From 7bab524baeedf3f3d281a4f1839082d4c44fef75 Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Sat, 7 Nov 2015 15:05:11 +0800 Subject: [PATCH 1/3] *: add hash set check for not changed value. --- store/localstore/txn.go | 2 +- structure/hash.go | 19 +++++++++++++++---- structure/structure_test.go | 24 ++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/store/localstore/txn.go b/store/localstore/txn.go index e31ff236be..4a30423d5d 100644 --- a/store/localstore/txn.go +++ b/store/localstore/txn.go @@ -231,7 +231,7 @@ func (txn *dbTxn) Commit() error { txn.close() }() - return txn.doCommit() + return errors.Trace(txn.doCommit()) } func (txn *dbTxn) CommittedVersion() (kv.Version, error) { diff --git a/structure/hash.go b/structure/hash.go index 3162e819c4..b0f2299da6 100644 --- a/structure/hash.go +++ b/structure/hash.go @@ -105,8 +105,9 @@ func (t *TxStructure) updateHash(key []byte, field []byte, fn func(oldValue []by return errors.Trace(err) } + newMeta := meta if oldValue == nil { - meta.Length++ + newMeta.Length++ } var newValue []byte @@ -115,11 +116,21 @@ func (t *TxStructure) updateHash(key []byte, field []byte, fn func(oldValue []by return errors.Trace(err) } - if err = t.txn.Set(dataKey, newValue); err != nil { - return errors.Trace(err) + // Check if hash field has been changed. + if bytes.Compare(oldValue, newValue) != 0 { + if err = t.txn.Set(dataKey, newValue); err != nil { + return errors.Trace(err) + } } - return errors.Trace(t.txn.Set(metaKey, meta.Value())) + // Check if hash meta has been changed. + if bytes.Compare(meta.Value(), newMeta.Value()) != 0 { + if err = t.txn.Set(metaKey, newMeta.Value()); err != nil { + return errors.Trace(err) + } + } + + return nil } // HLen gets the number of fields in a hash. diff --git a/structure/structure_test.go b/structure/structure_test.go index 3b1afd348d..699bd38223 100644 --- a/structure/structure_test.go +++ b/structure/structure_test.go @@ -193,7 +193,7 @@ func (s *tesTxStructureSuite) TestHash(c *C) { value, err = tx.HGet(key, []byte("fake")) c.Assert(err, IsNil) - c.Assert(err, IsNil) + c.Assert(value, IsNil) keys, err := tx.HKeys(key) c.Assert(err, IsNil) @@ -224,13 +224,33 @@ func (s *tesTxStructureSuite) TestHash(c *C) { c.Assert(err, IsNil) c.Assert(l, Equals, int64(2)) + // Test set new value which equals to old value. + err = tx.HSet(key, []byte("1"), []byte("1")) + c.Assert(err, IsNil) + + value, err = tx.HGet(key, []byte("1")) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, []byte("1")) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(2)) + n, err = tx.HInc(key, []byte("1"), 1) c.Assert(err, IsNil) c.Assert(n, Equals, int64(2)) + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(2)) + + n, err = tx.HInc(key, []byte("1"), 1) + c.Assert(err, IsNil) + c.Assert(n, Equals, int64(3)) + n, err = tx.HGetInt64(key, []byte("1")) c.Assert(err, IsNil) - c.Assert(n, Equals, int64(2)) + c.Assert(n, Equals, int64(3)) l, err = tx.HLen(key) c.Assert(err, IsNil) From 184e4f258950df91b8e6fe31eff00b6474c50c5b Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Mon, 9 Nov 2015 10:43:37 +0800 Subject: [PATCH 2/3] structure: add more test. --- structure/structure_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/structure/structure_test.go b/structure/structure_test.go index 699bd38223..5e011aac42 100644 --- a/structure/structure_test.go +++ b/structure/structure_test.go @@ -225,6 +225,10 @@ func (s *tesTxStructureSuite) TestHash(c *C) { c.Assert(l, Equals, int64(2)) // Test set new value which equals to old value. + value, err = tx.HGet(key, []byte("1")) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, []byte("1")) + err = tx.HSet(key, []byte("1"), []byte("1")) c.Assert(err, IsNil) @@ -248,6 +252,10 @@ func (s *tesTxStructureSuite) TestHash(c *C) { c.Assert(err, IsNil) c.Assert(n, Equals, int64(3)) + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(2)) + n, err = tx.HGetInt64(key, []byte("1")) c.Assert(err, IsNil) c.Assert(n, Equals, int64(3)) From c56ef6e737bd7e072ce142575d60ec784bea8509 Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Mon, 9 Nov 2015 12:07:21 +0800 Subject: [PATCH 3/3] structure: address comment. --- structure/hash.go | 49 +++++++++++++++++-------------------- structure/structure_test.go | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/structure/hash.go b/structure/hash.go index b0f2299da6..5195c945a8 100644 --- a/structure/hash.go +++ b/structure/hash.go @@ -92,40 +92,35 @@ func (t *TxStructure) HGetInt64(key []byte, field []byte) (int64, error) { } func (t *TxStructure) updateHash(key []byte, field []byte, fn func(oldValue []byte) ([]byte, error)) error { + dataKey := t.encodeHashDataKey(key, field) + oldValue, err := t.loadHashValue(dataKey) + if err != nil { + return errors.Trace(err) + } + + newValue, err := fn(oldValue) + if err != nil { + return errors.Trace(err) + } + + // Check if new value is equal to old value. + if bytes.Equal(oldValue, newValue) { + return nil + } + + if err = t.txn.Set(dataKey, newValue); err != nil { + return errors.Trace(err) + } + metaKey := t.encodeHashMetaKey(key) meta, err := t.loadHashMeta(metaKey) if err != nil { return errors.Trace(err) } - dataKey := t.encodeHashDataKey(key, field) - var oldValue []byte - oldValue, err = t.loadHashValue(dataKey) - if err != nil { - return errors.Trace(err) - } - - newMeta := meta if oldValue == nil { - newMeta.Length++ - } - - var newValue []byte - newValue, err = fn(oldValue) - if err != nil { - return errors.Trace(err) - } - - // Check if hash field has been changed. - if bytes.Compare(oldValue, newValue) != 0 { - if err = t.txn.Set(dataKey, newValue); err != nil { - return errors.Trace(err) - } - } - - // Check if hash meta has been changed. - if bytes.Compare(meta.Value(), newMeta.Value()) != 0 { - if err = t.txn.Set(metaKey, newMeta.Value()); err != nil { + meta.Length++ + if err = t.txn.Set(metaKey, meta.Value()); err != nil { return errors.Trace(err) } } diff --git a/structure/structure_test.go b/structure/structure_test.go index 5e011aac42..76c2cdd13c 100644 --- a/structure/structure_test.go +++ b/structure/structure_test.go @@ -274,6 +274,55 @@ func (s *tesTxStructureSuite) TestHash(c *C) { err = tx.HDel(key, []byte("fake_key")) c.Assert(err, IsNil) + // Test set nil value. + value, err = tx.HGet(key, []byte("nil_key")) + c.Assert(err, IsNil) + c.Assert(value, IsNil) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(0)) + + err = tx.HSet(key, []byte("nil_key"), nil) + c.Assert(err, IsNil) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(0)) + + err = tx.HSet(key, []byte("nil_key"), []byte("1")) + c.Assert(err, IsNil) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(1)) + + value, err = tx.HGet(key, []byte("nil_key")) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, []byte("1")) + + err = tx.HSet(key, []byte("nil_key"), nil) + c.Assert(err, NotNil) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(1)) + + value, err = tx.HGet(key, []byte("nil_key")) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, []byte("1")) + + err = tx.HSet(key, []byte("nil_key"), []byte("2")) + c.Assert(err, IsNil) + + l, err = tx.HLen(key) + c.Assert(err, IsNil) + c.Assert(l, Equals, int64(1)) + + value, err = tx.HGet(key, []byte("nil_key")) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, []byte("2")) + err = txn.Commit() c.Assert(err, IsNil)