Skip to content

Commit e3b9601

Browse files
committed
[FAB-14207] extract extensions from protos/ledger
SetRawReads and SetMerkelSummary were moved to txmgmt/rwsetutil. Other functions were, whereappropriate, were relocated to the point of use. Change-Id: Id4775f5ccb9f673bfd5136af42203d76d9fe695e Signed-off-by: Matthew Sykes <sykesmat@us.ibm.com>
1 parent 22fea9a commit e3b9601

File tree

17 files changed

+199
-200
lines changed

17 files changed

+199
-200
lines changed

core/ledger/kvledger/hashcheck_pvtdata.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func findValidAndInvalidTxPvtData(txPvtData *ledger.TxPvtData, txRWSet *rwsetuti
103103
toDeleteNsColl = append(toDeleteNsColl, invalidNsColl...)
104104
}
105105
for _, nsColl := range toDeleteNsColl {
106-
txPvtData.WriteSet.Remove(nsColl.ns, nsColl.coll)
106+
removeCollFromTxPvtReadWriteSet(txPvtData.WriteSet, nsColl.ns, nsColl.coll)
107107
}
108108
if len(txPvtData.WriteSet.NsPvtRwset) == 0 {
109109
// denotes that all namespaces had
@@ -113,6 +113,33 @@ func findValidAndInvalidTxPvtData(txPvtData *ledger.TxPvtData, txRWSet *rwsetuti
113113
return txPvtData, invalidPvtData
114114
}
115115

116+
// Remove removes the rwset for the given <ns, coll> tuple. If after this removal,
117+
// there are no more collection in the namespace <ns>, the whole namespace entry is removed
118+
func removeCollFromTxPvtReadWriteSet(p *rwset.TxPvtReadWriteSet, ns, coll string) {
119+
for i := 0; i < len(p.NsPvtRwset); i++ {
120+
n := p.NsPvtRwset[i]
121+
if n.Namespace != ns {
122+
continue
123+
}
124+
removeCollFromNsPvtWriteSet(n, coll)
125+
if len(n.CollectionPvtRwset) == 0 {
126+
p.NsPvtRwset = append(p.NsPvtRwset[:i], p.NsPvtRwset[i+1:]...)
127+
}
128+
return
129+
}
130+
}
131+
132+
func removeCollFromNsPvtWriteSet(n *rwset.NsPvtReadWriteSet, collName string) {
133+
for i := 0; i < len(n.CollectionPvtRwset); i++ {
134+
c := n.CollectionPvtRwset[i]
135+
if c.CollectionName != collName {
136+
continue
137+
}
138+
n.CollectionPvtRwset = append(n.CollectionPvtRwset[:i], n.CollectionPvtRwset[i+1:]...)
139+
return
140+
}
141+
}
142+
116143
type nsColl struct {
117144
ns, coll string
118145
}

core/ledger/kvledger/hashcheck_pvtdata_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,61 @@ func produceSamplePvtdata(t *testing.T, txNum uint64, nsColls []string, values [
156156
assert.NoError(t, err)
157157
return &ledger.TxPvtData{SeqInBlock: txNum, WriteSet: simRes.PvtSimulationResults}, pubSimulationResultsBytes
158158
}
159+
160+
func TestRemoveCollFromTxPvtReadWriteSet(t *testing.T) {
161+
txpvtrwset := testutilConstructSampleTxPvtRwset(
162+
[]*testNsColls{
163+
{ns: "ns-1", colls: []string{"coll-1", "coll-2"}},
164+
{ns: "ns-2", colls: []string{"coll-3", "coll-4"}},
165+
},
166+
)
167+
168+
removeCollFromTxPvtReadWriteSet(txpvtrwset, "ns-1", "coll-1")
169+
assert.Equal(
170+
t,
171+
testutilConstructSampleTxPvtRwset(
172+
[]*testNsColls{
173+
{ns: "ns-1", colls: []string{"coll-2"}},
174+
{ns: "ns-2", colls: []string{"coll-3", "coll-4"}},
175+
},
176+
),
177+
txpvtrwset,
178+
)
179+
180+
removeCollFromTxPvtReadWriteSet(txpvtrwset, "ns-1", "coll-2")
181+
assert.Equal(
182+
t,
183+
testutilConstructSampleTxPvtRwset(
184+
[]*testNsColls{
185+
{ns: "ns-2", colls: []string{"coll-3", "coll-4"}},
186+
},
187+
),
188+
txpvtrwset,
189+
)
190+
}
191+
192+
func testutilConstructSampleTxPvtRwset(nsCollsList []*testNsColls) *rwset.TxPvtReadWriteSet {
193+
txPvtRwset := &rwset.TxPvtReadWriteSet{}
194+
for _, nsColls := range nsCollsList {
195+
ns := nsColls.ns
196+
nsdata := &rwset.NsPvtReadWriteSet{
197+
Namespace: ns,
198+
CollectionPvtRwset: []*rwset.CollectionPvtReadWriteSet{},
199+
}
200+
txPvtRwset.NsPvtRwset = append(txPvtRwset.NsPvtRwset, nsdata)
201+
for _, coll := range nsColls.colls {
202+
nsdata.CollectionPvtRwset = append(nsdata.CollectionPvtRwset,
203+
&rwset.CollectionPvtReadWriteSet{
204+
CollectionName: coll,
205+
Rwset: []byte(fmt.Sprintf("pvtrwset-for-%s-%s", ns, coll)),
206+
},
207+
)
208+
}
209+
}
210+
return txPvtRwset
211+
}
212+
213+
type testNsColls struct {
214+
ns string
215+
colls []string
216+
}

protos/ledger/rwset/kvrwset/tests/kv_rwset_test.go renamed to core/ledger/kvledger/txmgmt/rwsetutil/kv_rwset_test.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
11
/*
22
Copyright IBM Corp. 2016 All Rights Reserved.
33
4-
Licensed under the Apache License, Version 2.0 (the "License");
5-
you may not use this file except in compliance with the License.
6-
You may obtain a copy of the License at
7-
8-
http://www.apache.org/licenses/LICENSE-2.0
9-
10-
Unless required by applicable law or agreed to in writing, software
11-
distributed under the License is distributed on an "AS IS" BASIS,
12-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-
See the License for the specific language governing permissions and
14-
limitations under the License.
4+
SPDX-License-Identifier: Apache-2.0
155
*/
166

17-
package kvrwset
7+
package rwsetutil
188

199
import (
2010
"io/ioutil"
@@ -26,7 +16,7 @@ import (
2616
"github.com/stretchr/testify/assert"
2717
)
2818

29-
const binaryTestFileName = "kvrwsetV1ProtoBytes"
19+
const binaryTestFileName = "testdata/kvrwsetV1ProtoBytes"
3020

3121
// TestKVRWSetV1BackwardCompatible passes if the 'KVRWSet' messgae declared in the latest version
3222
// is able to unmarshal the protobytes that are produced by the 'KVRWSet' proto message declared in
@@ -53,13 +43,13 @@ func PrepareBinaryFileSampleKVRWSetV1(t *testing.T) {
5343

5444
func constructSampleKVRWSet() *kvrwset.KVRWSet {
5545
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "k0", EndKey: "k9", ItrExhausted: true}
56-
rqi1.SetRawReads([]*kvrwset.KVRead{
46+
SetRawReads(rqi1, []*kvrwset.KVRead{
5747
{Key: "k1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}},
5848
{Key: "k2", Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
5949
})
6050

6151
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "k00", EndKey: "k90", ItrExhausted: true}
62-
rqi2.SetMerkelSummary(&kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
52+
SetMerkelSummary(rqi2, &kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
6353
return &kvrwset.KVRWSet{
6454
Reads: []*kvrwset.KVRead{{Key: "key1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
6555
RangeQueriesInfo: []*kvrwset.RangeQueryInfo{rqi1, rqi2},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package rwsetutil
8+
9+
import "github.com/hyperledger/fabric/protos/ledger/rwset/kvrwset"
10+
11+
// SetRawReads sets the 'readsInfo' field to raw KVReads performed by the query
12+
func SetRawReads(rqi *kvrwset.RangeQueryInfo, kvReads []*kvrwset.KVRead) {
13+
rqi.ReadsInfo = &kvrwset.RangeQueryInfo_RawReads{
14+
RawReads: &kvrwset.QueryReads{
15+
KvReads: kvReads,
16+
},
17+
}
18+
}
19+
20+
// SetMerkelSummary sets the 'readsInfo' field to merkle summary of the raw KVReads of query results
21+
func SetMerkelSummary(rqi *kvrwset.RangeQueryInfo, merkleSummary *kvrwset.QueryReadsMerkleSummary) {
22+
rqi.ReadsInfo = &kvrwset.RangeQueryInfo_ReadsMerkleHashes{ReadsMerkleHashes: merkleSummary}
23+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package rwsetutil
8+
9+
import (
10+
"testing"
11+
12+
"github.com/hyperledger/fabric/protos/ledger/rwset/kvrwset"
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestSetRawReads(t *testing.T) {
17+
rqi := &kvrwset.RangeQueryInfo{StartKey: "start", EndKey: "end"}
18+
kvReads := []*kvrwset.KVRead{{Key: "key1"}, {Key: "key2"}}
19+
20+
expected := &kvrwset.RangeQueryInfo{
21+
StartKey: "start",
22+
EndKey: "end",
23+
ReadsInfo: &kvrwset.RangeQueryInfo_RawReads{
24+
RawReads: &kvrwset.QueryReads{KvReads: kvReads},
25+
},
26+
}
27+
28+
SetRawReads(rqi, kvReads)
29+
assert.Equal(t, expected, rqi)
30+
}
31+
32+
func TestSetMerkelSummary(t *testing.T) {
33+
rqi := &kvrwset.RangeQueryInfo{StartKey: "start", EndKey: "end"}
34+
merkleSummary := &kvrwset.QueryReadsMerkleSummary{MaxDegree: 12, MaxLevel: 99}
35+
36+
expected := &kvrwset.RangeQueryInfo{
37+
StartKey: "start",
38+
EndKey: "end",
39+
ReadsInfo: &kvrwset.RangeQueryInfo_ReadsMerkleHashes{ReadsMerkleHashes: merkleSummary},
40+
}
41+
42+
SetMerkelSummary(rqi, merkleSummary)
43+
assert.Equal(t, expected, rqi)
44+
}

core/ledger/kvledger/txmgmt/rwsetutil/rwset_builder_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ func TestTxSimulationResultWithOnlyPubData(t *testing.T) {
3333

3434
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "bKey", EndKey: "", ItrExhausted: false, ReadsInfo: nil}
3535
rqi1.EndKey = "eKey"
36-
rqi1.SetRawReads([]*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
36+
SetRawReads(rqi1, []*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
3737
rqi1.ItrExhausted = true
3838
rwSetBuilder.AddToRangeQuerySet("ns1", rqi1)
3939

4040
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "bKey", EndKey: "", ItrExhausted: false, ReadsInfo: nil}
4141
rqi2.EndKey = "eKey"
42-
rqi2.SetRawReads([]*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
42+
SetRawReads(rqi2, []*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
4343
rqi2.ItrExhausted = true
4444
rwSetBuilder.AddToRangeQuerySet("ns1", rqi2)
4545

4646
rqi3 := &kvrwset.RangeQueryInfo{StartKey: "bKey", EndKey: "", ItrExhausted: true, ReadsInfo: nil}
4747
rqi3.EndKey = "eKey1"
48-
rqi3.SetRawReads([]*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
48+
SetRawReads(rqi3, []*kvrwset.KVRead{NewKVRead("bKey1", version.NewHeight(2, 3)), NewKVRead("bKey2", version.NewHeight(2, 4))})
4949
rwSetBuilder.AddToRangeQuerySet("ns1", rqi3)
5050

5151
rwSetBuilder.AddToReadSet("ns2", "key2", version.NewHeight(1, 2))

core/ledger/kvledger/txmgmt/rwsetutil/rwset_proto_util_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ func TestTxRWSetMarshalUnmarshal(t *testing.T) {
3131
txRwSet := &TxRwSet{}
3232

3333
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "k0", EndKey: "k9", ItrExhausted: true}
34-
rqi1.SetRawReads([]*kvrwset.KVRead{
34+
SetRawReads(rqi1, []*kvrwset.KVRead{
3535
{Key: "k1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}},
3636
{Key: "k2", Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
3737
})
3838

3939
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "k00", EndKey: "k90", ItrExhausted: true}
40-
rqi2.SetMerkelSummary(&kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
40+
SetMerkelSummary(rqi2, &kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
4141

4242
txRwSet.NsRwSets = []*NsRwSet{
4343
{NameSpace: "ns1", KvRwSet: &kvrwset.KVRWSet{
@@ -155,13 +155,13 @@ func sampleNsRwSetWithNoCollHashedRWs(ns string) *NsRwSet {
155155

156156
func sampleKvRwSet() *kvrwset.KVRWSet {
157157
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "k0", EndKey: "k9", ItrExhausted: true}
158-
rqi1.SetRawReads([]*kvrwset.KVRead{
158+
SetRawReads(rqi1, []*kvrwset.KVRead{
159159
{Key: "k1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}},
160160
{Key: "k2", Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
161161
})
162162

163163
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "k00", EndKey: "k90", ItrExhausted: true}
164-
rqi2.SetMerkelSummary(&kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
164+
SetMerkelSummary(rqi2, &kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
165165
return &kvrwset.KVRWSet{
166166
Reads: []*kvrwset.KVRead{{Key: "key1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
167167
RangeQueriesInfo: []*kvrwset.RangeQueryInfo{rqi1},

core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/helper.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,10 @@ func (h *queryHelper) addRangeQueryInfo() {
300300
return
301301
}
302302
if results != nil {
303-
itr.rangeQueryInfo.SetRawReads(results)
303+
rwsetutil.SetRawReads(itr.rangeQueryInfo, results)
304304
}
305305
if hash != nil {
306-
itr.rangeQueryInfo.SetMerkelSummary(hash)
306+
rwsetutil.SetMerkelSummary(itr.rangeQueryInfo, hash)
307307
}
308308
h.rwsetBuilder.AddToRangeQuerySet(itr.ns, itr.rangeQueryInfo)
309309
}

0 commit comments

Comments
 (0)