Skip to content

Commit

Permalink
meta,structure: modify structure hash API to avoid conflict on auto t…
Browse files Browse the repository at this point in the history
…able ID key (pingcap#25221)
  • Loading branch information
tiancaiamao authored Jun 10, 2021
1 parent 7e9c912 commit 537d8de
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 136 deletions.
88 changes: 4 additions & 84 deletions structure/hash.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ package structure
import (
"bytes"
"context"
"encoding/binary"
"strconv"

"github.com/pingcap/errors"
Expand All @@ -29,20 +28,6 @@ type HashPair struct {
Value []byte
}

type hashMeta struct {
FieldCount int64
}

func (meta hashMeta) Value() []byte {
buf := make([]byte, 8)
binary.BigEndian.PutUint64(buf[0:8], uint64(meta.FieldCount))
return buf
}

func (meta hashMeta) IsEmpty() bool {
return meta.FieldCount <= 0
}

// HSet sets the string value of a hash field.
func (t *TxStructure) HSet(key []byte, field []byte, value []byte) error {
if t.readWriter == nil {
Expand Down Expand Up @@ -127,48 +112,19 @@ func (t *TxStructure) updateHash(key []byte, field []byte, fn func(oldValue []by
return errors.Trace(err)
}

metaKey := t.encodeHashMetaKey(key)
meta, err := t.loadHashMeta(metaKey)
if err != nil {
return errors.Trace(err)
}

if oldValue == nil {
meta.FieldCount++
if err = t.readWriter.Set(metaKey, meta.Value()); err != nil {
return errors.Trace(err)
}
}

return nil
}

// HLen gets the number of fields in a hash.
func (t *TxStructure) HLen(key []byte) (int64, error) {
metaKey := t.encodeHashMetaKey(key)
meta, err := t.loadHashMeta(metaKey)
if err != nil {
return 0, errors.Trace(err)
}
return meta.FieldCount, nil
}

// HDel deletes one or more hash fields.
func (t *TxStructure) HDel(key []byte, fields ...[]byte) error {
if t.readWriter == nil {
return ErrWriteOnSnapshot
}
metaKey := t.encodeHashMetaKey(key)
meta, err := t.loadHashMeta(metaKey)
if err != nil || meta.IsEmpty() {
return errors.Trace(err)
}

var value []byte
for _, field := range fields {
dataKey := t.encodeHashDataKey(key, field)

value, err = t.loadHashValue(dataKey)
value, err := t.loadHashValue(dataKey)
if err != nil {
return errors.Trace(err)
}
Expand All @@ -177,18 +133,10 @@ func (t *TxStructure) HDel(key []byte, fields ...[]byte) error {
if err = t.readWriter.Delete(dataKey); err != nil {
return errors.Trace(err)
}

meta.FieldCount--
}
}

if meta.IsEmpty() {
err = t.readWriter.Delete(metaKey)
} else {
err = t.readWriter.Set(metaKey, meta.Value())
}

return errors.Trace(err)
return nil
}

// HKeys gets all the fields in a hash.
Expand Down Expand Up @@ -236,13 +184,7 @@ func (t *TxStructure) HGetLastN(key []byte, num int) ([]HashPair, error) {

// HClear removes the hash value of the key.
func (t *TxStructure) HClear(key []byte) error {
metaKey := t.encodeHashMetaKey(key)
meta, err := t.loadHashMeta(metaKey)
if err != nil || meta.IsEmpty() {
return errors.Trace(err)
}

err = t.iterateHash(key, func(field []byte, value []byte) error {
err := t.iterateHash(key, func(field []byte, value []byte) error {
k := t.encodeHashDataKey(key, field)
return errors.Trace(t.readWriter.Delete(k))
})
Expand All @@ -251,7 +193,7 @@ func (t *TxStructure) HClear(key []byte) error {
return errors.Trace(err)
}

return errors.Trace(t.readWriter.Delete(metaKey))
return nil
}

func (t *TxStructure) iterateHash(key []byte, fn func(k []byte, v []byte) error) error {
Expand Down Expand Up @@ -378,28 +320,6 @@ func (t *TxStructure) iterReverseHash(key []byte, fn func(k []byte, v []byte) (b
return nil
}

func (t *TxStructure) loadHashMeta(metaKey []byte) (hashMeta, error) {
v, err := t.reader.Get(context.TODO(), metaKey)
if kv.ErrNotExist.Equal(err) {
err = nil
}
if err != nil {
return hashMeta{}, errors.Trace(err)
}

meta := hashMeta{FieldCount: 0}
if v == nil {
return meta, nil
}

if len(v) != 8 {
return meta, ErrInvalidListMetaData
}

meta.FieldCount = int64(binary.BigEndian.Uint64(v[0:8]))
return meta, nil
}

func (t *TxStructure) loadHashValue(dataKey []byte) ([]byte, error) {
v, err := t.reader.Get(context.TODO(), dataKey)
if kv.ErrNotExist.Equal(err) {
Expand Down
52 changes: 0 additions & 52 deletions structure/structure_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,6 @@ func (s *testTxStructureSuite) TestHash(c *C) {
err = tx.HSet(key, []byte("2"), []byte("2"))
c.Assert(err, IsNil)

l, err := tx.HLen(key)
c.Assert(err, IsNil)
c.Assert(l, Equals, int64(2))

value, err := tx.HGet(key, []byte("1"))
c.Assert(err, IsNil)
c.Assert(value, DeepEquals, []byte("1"))
Expand Down Expand Up @@ -261,18 +257,10 @@ func (s *testTxStructureSuite) TestHash(c *C) {
c.Assert(err, IsNil)
c.Assert(value, IsNil)

l, err = tx.HLen(key)
c.Assert(err, IsNil)
c.Assert(l, Equals, int64(1))

n, err := tx.HInc(key, []byte("1"), 1)
c.Assert(err, IsNil)
c.Assert(n, Equals, int64(1))

l, err = tx.HLen(key)
c.Assert(err, IsNil)
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)
Expand All @@ -285,41 +273,21 @@ func (s *testTxStructureSuite) TestHash(c *C) {
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))

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))

l, err = tx.HLen(key)
c.Assert(err, IsNil)
c.Assert(l, Equals, int64(2))

err = tx.HClear(key)
c.Assert(err, IsNil)

l, err = tx.HLen(key)
c.Assert(err, IsNil)
c.Assert(l, Equals, int64(0))

err = tx.HDel(key, []byte("fake_key"))
c.Assert(err, IsNil)

Expand All @@ -328,46 +296,26 @@ func (s *testTxStructureSuite) TestHash(c *C) {
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"))
Expand Down

0 comments on commit 537d8de

Please sign in to comment.