Skip to content

Commit 3045bf4

Browse files
committed
[FAB-9746] Ledger: Metadata - level-statedb support
This CR includes - Enhancement in statedb data struct to encapsulate metadata - Introducing a proto message for encapsulating version, metadata, and value - Enhancement to the encoding/decoding so as to handle both the old and new format of encoding the value field in the leveldb Change-Id: Iac530f3045fef80c4dbb5c09bfe1de41ccc4bb97 Signed-off-by: manish <manish.sethi@gmail.com>
1 parent fa0d1e2 commit 3045bf4

File tree

10 files changed

+293
-121
lines changed

10 files changed

+293
-121
lines changed

core/ledger/kvledger/txmgmt/statedb/statedb.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
Copyright IBM Corp. All Rights Reserved.
3+
34
SPDX-License-Identifier: Apache-2.0
45
*/
56

@@ -81,8 +82,9 @@ type CompositeKey struct {
8182

8283
// VersionedValue encloses value and corresponding version
8384
type VersionedValue struct {
84-
Value []byte
85-
Version *version.Height
85+
Value []byte
86+
Metadata []byte
87+
Version *version.Height
8688
}
8789

8890
// VersionedKV encloses key and corresponding VersionedValue
@@ -131,17 +133,17 @@ func (batch *UpdateBatch) Get(ns string, key string) *VersionedValue {
131133
return vv
132134
}
133135

134-
// Put adds a VersionedKV
136+
// Put adds a key with value only. The metadata is assumed to be nil
135137
func (batch *UpdateBatch) Put(ns string, key string, value []byte, version *version.Height) {
136138
if value == nil {
137-
panic("Nil value not allowed")
139+
panic("Nil value not allowed. Instead call 'Delete' function")
138140
}
139-
batch.Update(ns, key, &VersionedValue{value, version})
141+
batch.Update(ns, key, &VersionedValue{value, nil, version})
140142
}
141143

142144
// Delete deletes a Key and associated value
143145
func (batch *UpdateBatch) Delete(ns string, key string, version *version.Height) {
144-
batch.Update(ns, key, &VersionedValue{nil, version})
146+
batch.Update(ns, key, &VersionedValue{nil, nil, version})
145147
}
146148

147149
// Exists checks whether the given key exists in the batch
@@ -236,7 +238,7 @@ func (itr *nsIterator) Next() (QueryResult, error) {
236238
key := itr.sortedKeys[itr.nextIndex]
237239
vv := itr.nsUpdates.m[key]
238240
itr.nextIndex++
239-
return &VersionedKV{CompositeKey{itr.ns, key}, VersionedValue{vv.Value, vv.Version}}, nil
241+
return &VersionedKV{CompositeKey{itr.ns, key}, VersionedValue{vv.Value, vv.Metadata, vv.Version}}, nil
240242
}
241243

242244
// Close implements the method from QueryResult interface

core/ledger/kvledger/txmgmt/statedb/statedb_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,19 @@ func TestUpdateBatchIterator(t *testing.T) {
105105
batch.Put("ns2", "key4", []byte("value4"), version.NewHeight(2, 1))
106106

107107
checkItrResults(t, batch.GetRangeScanIterator("ns1", "key2", "key3"), []*VersionedKV{
108-
{CompositeKey{"ns1", "key2"}, VersionedValue{[]byte("value2"), version.NewHeight(1, 2)}},
108+
{CompositeKey{"ns1", "key2"}, VersionedValue{[]byte("value2"), nil, version.NewHeight(1, 2)}},
109109
})
110110

111111
checkItrResults(t, batch.GetRangeScanIterator("ns2", "key0", "key8"), []*VersionedKV{
112-
{CompositeKey{"ns2", "key4"}, VersionedValue{[]byte("value4"), version.NewHeight(2, 1)}},
113-
{CompositeKey{"ns2", "key5"}, VersionedValue{[]byte("value5"), version.NewHeight(2, 2)}},
114-
{CompositeKey{"ns2", "key6"}, VersionedValue{[]byte("value6"), version.NewHeight(2, 3)}},
112+
{CompositeKey{"ns2", "key4"}, VersionedValue{[]byte("value4"), nil, version.NewHeight(2, 1)}},
113+
{CompositeKey{"ns2", "key5"}, VersionedValue{[]byte("value5"), nil, version.NewHeight(2, 2)}},
114+
{CompositeKey{"ns2", "key6"}, VersionedValue{[]byte("value6"), nil, version.NewHeight(2, 3)}},
115115
})
116116

117117
checkItrResults(t, batch.GetRangeScanIterator("ns2", "", ""), []*VersionedKV{
118-
{CompositeKey{"ns2", "key4"}, VersionedValue{[]byte("value4"), version.NewHeight(2, 1)}},
119-
{CompositeKey{"ns2", "key5"}, VersionedValue{[]byte("value5"), version.NewHeight(2, 2)}},
120-
{CompositeKey{"ns2", "key6"}, VersionedValue{[]byte("value6"), version.NewHeight(2, 3)}},
118+
{CompositeKey{"ns2", "key4"}, VersionedValue{[]byte("value4"), nil, version.NewHeight(2, 1)}},
119+
{CompositeKey{"ns2", "key5"}, VersionedValue{[]byte("value5"), nil, version.NewHeight(2, 2)}},
120+
{CompositeKey{"ns2", "key6"}, VersionedValue{[]byte("value6"), nil, version.NewHeight(2, 3)}},
121121
})
122122

123123
checkItrResults(t, batch.GetRangeScanIterator("non-existing-ns", "", ""), nil)

core/ledger/kvledger/txmgmt/statedb/stateleveldb/msgs/storage.pb.go

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
syntax = "proto3";
8+
9+
option go_package = "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb/msgs";
10+
11+
package msgs;
12+
13+
message VersionedValueProto {
14+
bytes version_bytes = 1;
15+
bytes value = 2;
16+
bytes metadata = 3;
17+
}

core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ func (vdb *versionedDB) GetState(namespace string, key string) (*statedb.Version
8989
if dbVal == nil {
9090
return nil, nil
9191
}
92-
val, ver := DecodeValue(dbVal)
93-
return &statedb.VersionedValue{Value: val, Version: ver}, nil
92+
return decodeValue(dbVal)
9493
}
9594

9695
// GetVersion implements method in VersionedDB interface
@@ -149,7 +148,11 @@ func (vdb *versionedDB) ApplyUpdates(batch *statedb.UpdateBatch, height *version
149148
if vv.Value == nil {
150149
dbBatch.Delete(compositeKey)
151150
} else {
152-
dbBatch.Put(compositeKey, EncodeValue(vv.Value, vv.Version))
151+
encodedVal, err := encodeValue(vv)
152+
if err != nil {
153+
return err
154+
}
155+
dbBatch.Put(compositeKey, encodedVal)
153156
}
154157
}
155158
}
@@ -201,10 +204,15 @@ func (scanner *kvScanner) Next() (statedb.QueryResult, error) {
201204
dbValCopy := make([]byte, len(dbVal))
202205
copy(dbValCopy, dbVal)
203206
_, key := splitCompositeKey(dbKey)
204-
value, version := DecodeValue(dbValCopy)
207+
vv, err := decodeValue(dbValCopy)
208+
if err != nil {
209+
return nil, err
210+
}
205211
return &statedb.VersionedKV{
206-
CompositeKey: statedb.CompositeKey{Namespace: scanner.namespace, Key: key},
207-
VersionedValue: statedb.VersionedValue{Value: value, Version: version}}, nil
212+
CompositeKey: statedb.CompositeKey{Namespace: scanner.namespace, Key: key},
213+
// TODO remove dereferrencing below by changing the type of the field
214+
// `VersionedValue` in `statedb.VersionedKV` to a pointer
215+
VersionedValue: *vv}, nil
208216
}
209217

210218
func (scanner *kvScanner) Close() {

core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb_test.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,6 @@ func TestIterator(t *testing.T) {
5656
commontests.TestIterator(t, env.DBProvider)
5757
}
5858

59-
func TestEncodeDecodeValueAndVersion(t *testing.T) {
60-
testValueAndVersionEncoding(t, []byte("value1"), version.NewHeight(1, 2))
61-
testValueAndVersionEncoding(t, []byte{}, version.NewHeight(50, 50))
62-
}
63-
64-
func testValueAndVersionEncoding(t *testing.T, value []byte, version *version.Height) {
65-
encodedValue := EncodeValue(value, version)
66-
val, ver := DecodeValue(encodedValue)
67-
testutil.AssertEquals(t, val, value)
68-
testutil.AssertEquals(t, ver, version)
69-
}
70-
7159
func TestCompositeKey(t *testing.T) {
7260
testCompositeKey(t, "ledger1", "ns", "key")
7361
testCompositeKey(t, "ledger2", "ns", "")

core/ledger/kvledger/txmgmt/statedb/stateleveldb/util.go

Lines changed: 0 additions & 35 deletions
This file was deleted.

core/ledger/kvledger/txmgmt/statedb/stateleveldb/util_test.go

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)