Skip to content

Commit 47f4ee3

Browse files
author
conghonglei
committed
[FAB-2897] make txn index within block starting at 0
Change-Id: I9e33f6a177511f6cbb5a1ff5e20188008d2efae6 Signed-off-by: conghonglei <[email protected]>
1 parent a076bba commit 47f4ee3

File tree

8 files changed

+77
-74
lines changed

8 files changed

+77
-74
lines changed

common/ledger/blkstorage/fsblkstorage/blockfile_mgr_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ func TestBlockfileMgrGetTxByBlockNumTranNum(t *testing.T) {
165165
blkfileMgrWrapper.addBlocks(blocks)
166166
for blockIndex, blk := range blocks {
167167
for tranIndex, txEnvelopeBytes := range blk.Data.Data {
168-
// blockNum starts with 1, tranNum starts with 1
169-
txEnvelopeFromFileMgr, err := blkfileMgrWrapper.blockfileMgr.retrieveTransactionByBlockNumTranNum(uint64(blockIndex), uint64(tranIndex+1))
168+
// blockNum and tranNum both start with 0
169+
txEnvelopeFromFileMgr, err := blkfileMgrWrapper.blockfileMgr.retrieveTransactionByBlockNumTranNum(uint64(blockIndex), uint64(tranIndex))
170170
testutil.AssertNoError(t, err, "Error while retrieving tx from blkfileMgr")
171171
txEnvelope, err := putil.GetEnvelopeFromBlock(txEnvelopeBytes)
172172
testutil.AssertNoError(t, err, "Error while unmarshalling tx")

common/ledger/blkstorage/fsblkstorage/blockindex.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,12 @@ func (index *blockIndex) indexBlock(blockIdxInfo *blockIdxInfo) error {
132132
if _, ok := index.indexItemsMap[blkstorage.IndexableAttrBlockNumTranNum]; ok {
133133
for txIterator, txoffset := range txOffsets {
134134
txFlp := newFileLocationPointer(flp.fileSuffixNum, flp.offset, txoffset.loc)
135-
logger.Debugf("Adding txLoc [%s] for tx number:[%d] ID: [%s] to blockNumTranNum index", txFlp, txIterator+1, txoffset.txID)
135+
logger.Debugf("Adding txLoc [%s] for tx number:[%d] ID: [%s] to blockNumTranNum index", txFlp, txIterator, txoffset.txID)
136136
txFlpBytes, marshalErr := txFlp.marshal()
137137
if marshalErr != nil {
138138
return marshalErr
139139
}
140-
batch.Put(constructBlockNumTranNumKey(blockIdxInfo.blockNum, uint64(txIterator+1)), txFlpBytes)
140+
batch.Put(constructBlockNumTranNumKey(blockIdxInfo.blockNum, uint64(txIterator)), txFlpBytes)
141141
}
142142
}
143143

common/ledger/blkstorage/fsblkstorage/blockindex_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func testBlockIndexSelectiveIndexing(t *testing.T, indexItems []blkstorage.Index
179179
}
180180

181181
//test 'retrieveTrasnactionsByBlockNumTranNum
182-
txEnvelope2, err := blockfileMgr.retrieveTransactionByBlockNumTranNum(0, 1)
182+
txEnvelope2, err := blockfileMgr.retrieveTransactionByBlockNumTranNum(0, 0)
183183
if testutil.Contains(indexItems, blkstorage.IndexableAttrBlockNumTranNum) {
184184
testutil.AssertNoError(t, err, "Error while retrieving tx by blockNum and tranNum")
185185
txEnvelopeBytes2 := blocks[0].Data.Data[0]

core/ledger/kvledger/history/historydb/historyleveldb/historyleveldb.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,12 @@ func (historyDB *historyDB) Commit(block *common.Block) error {
103103

104104
// write each tran's write set to history db
105105
for _, envBytes := range block.Data.Data {
106-
tranNo++
107106

108107
// If the tran is marked as invalid, skip it
109-
// Note, tranNo starts at 1 for height, while tranIndex starts at 0 for invalid array
110-
if txsFilter.IsInvalid(int(tranNo) - 1) {
108+
if txsFilter.IsInvalid(int(tranNo)) {
111109
logger.Debugf("Channel [%s]: Skipping history write for invalid transaction number %d",
112110
historyDB.dbName, tranNo)
111+
tranNo++
113112
continue
114113
}
115114

@@ -163,6 +162,7 @@ func (historyDB *historyDB) Commit(block *common.Block) error {
163162
} else {
164163
logger.Debugf("Skipping transaction [%d] since it is not an endorsement transaction\n", tranNo)
165164
}
165+
tranNo++
166166
}
167167

168168
// add savepoint for recovery purpose

core/ledger/kvledger/txmgmt/txmgr/commontests/txmgr_test.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"fmt"
2222
"testing"
2323

24+
"os"
25+
2426
"github.com/hyperledger/fabric/common/ledger/testutil"
2527
"github.com/hyperledger/fabric/core/ledger"
2628
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
@@ -29,6 +31,7 @@ import (
2931

3032
func TestMain(m *testing.M) {
3133
ledgertestutil.SetupCoreYAMLConfig("./../../../../../../peer")
34+
os.Exit(m.Run())
3235
}
3336

3437
func TestTxSimulatorWithNoExistingData(t *testing.T) {
@@ -106,9 +109,9 @@ func testTxSimulatorWithExistingData(t *testing.T, env testEnv) {
106109

107110
// verify the versions of keys in persistence
108111
vv, _ := env.getVDB().GetState("ns1", "key1")
109-
testutil.AssertEquals(t, vv.Version, version.NewHeight(1, 1))
112+
testutil.AssertEquals(t, vv.Version, version.NewHeight(1, 0))
110113
vv, _ = env.getVDB().GetState("ns1", "key2")
111-
testutil.AssertEquals(t, vv.Version, version.NewHeight(0, 1))
114+
testutil.AssertEquals(t, vv.Version, version.NewHeight(0, 0))
112115
}
113116

114117
func TestTxValidation(t *testing.T) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (txmgr *LockBasedTxMgr) Commit() error {
9595
}
9696
defer func() { txmgr.batch = nil }()
9797
if err := txmgr.db.ApplyUpdates(txmgr.batch,
98-
version.NewHeight(txmgr.currentBlock.Header.Number, uint64(len(txmgr.currentBlock.Data.Data)))); err != nil {
98+
version.NewHeight(txmgr.currentBlock.Header.Number, uint64(len(txmgr.currentBlock.Data.Data)-1))); err != nil {
9999
return err
100100
}
101101
logger.Debugf("Updates committed to state database")

core/ledger/kvledger/txmgmt/validator/statebasedval/state_based_validator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (v *Validator) ValidateAndPrepareBatch(block *common.Block, doMVCCValidatio
127127

128128
//txRWSet != nil => t is valid
129129
if txRWSet != nil {
130-
committingTxHeight := version.NewHeight(block.Header.Number, uint64(txIndex+1))
130+
committingTxHeight := version.NewHeight(block.Header.Number, uint64(txIndex))
131131
addWriteSetToBatch(txRWSet, committingTxHeight, updates)
132132
txsFilter.SetFlag(txIndex, peer.TxValidationCode_VALID)
133133
}

core/ledger/kvledger/txmgmt/validator/statebasedval/state_based_validator_test.go

+62-62
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,24 @@ func TestValidator(t *testing.T) {
4545

4646
//populate db with initial data
4747
batch := statedb.NewUpdateBatch()
48-
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 1))
49-
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 2))
50-
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 3))
51-
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 4))
52-
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 5))
53-
db.ApplyUpdates(batch, version.NewHeight(1, 5))
48+
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 0))
49+
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 1))
50+
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 2))
51+
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 3))
52+
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 4))
53+
db.ApplyUpdates(batch, version.NewHeight(1, 4))
5454

5555
validator := NewValidator(db)
5656

5757
//rwset1 should be valid
5858
rwsetBuilder1 := rwsetutil.NewRWSetBuilder()
59-
rwsetBuilder1.AddToReadSet("ns1", "key1", version.NewHeight(1, 1))
59+
rwsetBuilder1.AddToReadSet("ns1", "key1", version.NewHeight(1, 0))
6060
rwsetBuilder1.AddToReadSet("ns2", "key2", nil)
6161
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder1.GetTxReadWriteSet()}, []int{})
6262

6363
//rwset2 should not be valid
6464
rwsetBuilder2 := rwsetutil.NewRWSetBuilder()
65-
rwsetBuilder2.AddToReadSet("ns1", "key1", version.NewHeight(1, 2))
65+
rwsetBuilder2.AddToReadSet("ns1", "key1", version.NewHeight(1, 1))
6666
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder2.GetTxReadWriteSet()}, []int{0})
6767

6868
//rwset3 should not be valid
@@ -72,11 +72,11 @@ func TestValidator(t *testing.T) {
7272

7373
// rwset4 and rwset5 within same block - rwset4 should be valid and makes rwset5 as invalid
7474
rwsetBuilder4 := rwsetutil.NewRWSetBuilder()
75-
rwsetBuilder4.AddToReadSet("ns1", "key1", version.NewHeight(1, 1))
75+
rwsetBuilder4.AddToReadSet("ns1", "key1", version.NewHeight(1, 0))
7676
rwsetBuilder4.AddToWriteSet("ns1", "key1", []byte("value1_new"))
7777

7878
rwsetBuilder5 := rwsetutil.NewRWSetBuilder()
79-
rwsetBuilder5.AddToReadSet("ns1", "key1", version.NewHeight(1, 1))
79+
rwsetBuilder5.AddToReadSet("ns1", "key1", version.NewHeight(1, 0))
8080
checkValidation(t, validator,
8181
[]*rwsetutil.TxRwSet{rwsetBuilder4.GetTxReadWriteSet(), rwsetBuilder5.GetTxReadWriteSet()}, []int{1})
8282
}
@@ -90,52 +90,52 @@ func TestPhantomValidation(t *testing.T) {
9090

9191
//populate db with initial data
9292
batch := statedb.NewUpdateBatch()
93-
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 1))
94-
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 2))
95-
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 3))
96-
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 4))
97-
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 5))
98-
db.ApplyUpdates(batch, version.NewHeight(1, 5))
93+
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 0))
94+
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 1))
95+
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 2))
96+
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 3))
97+
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 4))
98+
db.ApplyUpdates(batch, version.NewHeight(1, 4))
9999

100100
validator := NewValidator(db)
101101

102102
//rwset1 should be valid
103103
rwsetBuilder1 := rwsetutil.NewRWSetBuilder()
104104
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key4", ItrExhausted: true}
105105
rqi1.SetRawReads([]*kvrwset.KVRead{
106-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
107-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 3))})
106+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
107+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2))})
108108
rwsetBuilder1.AddToRangeQuerySet("ns1", rqi1)
109109
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder1.GetTxReadWriteSet()}, []int{})
110110

111111
//rwset2 should not be valid - Version of key4 changed
112112
rwsetBuilder2 := rwsetutil.NewRWSetBuilder()
113113
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key4", ItrExhausted: false}
114114
rqi2.SetRawReads([]*kvrwset.KVRead{
115-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
116-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 3)),
117-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3))})
115+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
116+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2)),
117+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 2))})
118118
rwsetBuilder2.AddToRangeQuerySet("ns1", rqi2)
119-
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder2.GetTxReadWriteSet()}, []int{1})
119+
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder2.GetTxReadWriteSet()}, []int{0})
120120

121121
//rwset3 should not be valid - simulate key3 got commited to db
122122
rwsetBuilder3 := rwsetutil.NewRWSetBuilder()
123123
rqi3 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key4", ItrExhausted: false}
124124
rqi3.SetRawReads([]*kvrwset.KVRead{
125-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
126-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 4))})
125+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
126+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3))})
127127
rwsetBuilder3.AddToRangeQuerySet("ns1", rqi3)
128-
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder3.GetTxReadWriteSet()}, []int{1})
128+
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder3.GetTxReadWriteSet()}, []int{0})
129129

130130
// //Remove a key in rwset4 and rwset5 should become invalid
131131
rwsetBuilder4 := rwsetutil.NewRWSetBuilder()
132132
rwsetBuilder4.AddToWriteSet("ns1", "key3", nil)
133133
rwsetBuilder5 := rwsetutil.NewRWSetBuilder()
134134
rqi5 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key4", ItrExhausted: false}
135135
rqi5.SetRawReads([]*kvrwset.KVRead{
136-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
137-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 3)),
138-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 4))})
136+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
137+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2)),
138+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3))})
139139
rwsetBuilder5.AddToRangeQuerySet("ns1", rqi5)
140140
checkValidation(t, validator, []*rwsetutil.TxRwSet{
141141
rwsetBuilder4.GetTxReadWriteSet(), rwsetBuilder5.GetTxReadWriteSet()}, []int{1})
@@ -147,9 +147,9 @@ func TestPhantomValidation(t *testing.T) {
147147
rwsetBuilder7 := rwsetutil.NewRWSetBuilder()
148148
rqi7 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key4", ItrExhausted: false}
149149
rqi7.SetRawReads([]*kvrwset.KVRead{
150-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
151-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 3)),
152-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 4))})
150+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
151+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2)),
152+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3))})
153153
rwsetBuilder7.AddToRangeQuerySet("ns1", rqi7)
154154
checkValidation(t, validator, []*rwsetutil.TxRwSet{
155155
rwsetBuilder6.GetTxReadWriteSet(), rwsetBuilder7.GetTxReadWriteSet()}, []int{1})
@@ -164,29 +164,29 @@ func TestPhantomHashBasedValidation(t *testing.T) {
164164

165165
//populate db with initial data
166166
batch := statedb.NewUpdateBatch()
167-
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 1))
168-
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 2))
169-
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 3))
170-
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 4))
171-
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 5))
172-
batch.Put("ns1", "key6", []byte("value6"), version.NewHeight(1, 6))
173-
batch.Put("ns1", "key7", []byte("value7"), version.NewHeight(1, 7))
174-
batch.Put("ns1", "key8", []byte("value8"), version.NewHeight(1, 8))
175-
batch.Put("ns1", "key9", []byte("value9"), version.NewHeight(1, 9))
176-
db.ApplyUpdates(batch, version.NewHeight(1, 9))
167+
batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 0))
168+
batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 1))
169+
batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 2))
170+
batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 3))
171+
batch.Put("ns1", "key5", []byte("value5"), version.NewHeight(1, 4))
172+
batch.Put("ns1", "key6", []byte("value6"), version.NewHeight(1, 5))
173+
batch.Put("ns1", "key7", []byte("value7"), version.NewHeight(1, 6))
174+
batch.Put("ns1", "key8", []byte("value8"), version.NewHeight(1, 7))
175+
batch.Put("ns1", "key9", []byte("value9"), version.NewHeight(1, 8))
176+
db.ApplyUpdates(batch, version.NewHeight(1, 8))
177177

178178
validator := NewValidator(db)
179179

180180
rwsetBuilder1 := rwsetutil.NewRWSetBuilder()
181181
rqi1 := &kvrwset.RangeQueryInfo{StartKey: "key2", EndKey: "key9", ItrExhausted: true}
182182
kvReadsDuringSimulation1 := []*kvrwset.KVRead{
183-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
184-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 3)),
185-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 4)),
186-
rwsetutil.NewKVRead("key5", version.NewHeight(1, 5)),
187-
rwsetutil.NewKVRead("key6", version.NewHeight(1, 6)),
188-
rwsetutil.NewKVRead("key7", version.NewHeight(1, 7)),
189-
rwsetutil.NewKVRead("key8", version.NewHeight(1, 8)),
183+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
184+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2)),
185+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3)),
186+
rwsetutil.NewKVRead("key5", version.NewHeight(1, 4)),
187+
rwsetutil.NewKVRead("key6", version.NewHeight(1, 5)),
188+
rwsetutil.NewKVRead("key7", version.NewHeight(1, 6)),
189+
rwsetutil.NewKVRead("key8", version.NewHeight(1, 7)),
190190
}
191191
rqi1.SetMerkelSummary(buildTestHashResults(t, 2, kvReadsDuringSimulation1))
192192
rwsetBuilder1.AddToRangeQuerySet("ns1", rqi1)
@@ -195,19 +195,19 @@ func TestPhantomHashBasedValidation(t *testing.T) {
195195
rwsetBuilder2 := rwsetutil.NewRWSetBuilder()
196196
rqi2 := &kvrwset.RangeQueryInfo{StartKey: "key1", EndKey: "key9", ItrExhausted: false}
197197
kvReadsDuringSimulation2 := []*kvrwset.KVRead{
198-
rwsetutil.NewKVRead("key1", version.NewHeight(1, 1)),
199-
rwsetutil.NewKVRead("key2", version.NewHeight(1, 2)),
200-
rwsetutil.NewKVRead("key3", version.NewHeight(1, 2)),
201-
rwsetutil.NewKVRead("key4", version.NewHeight(1, 4)),
202-
rwsetutil.NewKVRead("key5", version.NewHeight(1, 5)),
203-
rwsetutil.NewKVRead("key6", version.NewHeight(1, 6)),
204-
rwsetutil.NewKVRead("key7", version.NewHeight(1, 7)),
205-
rwsetutil.NewKVRead("key8", version.NewHeight(1, 8)),
206-
rwsetutil.NewKVRead("key9", version.NewHeight(1, 9)),
198+
rwsetutil.NewKVRead("key1", version.NewHeight(1, 0)),
199+
rwsetutil.NewKVRead("key2", version.NewHeight(1, 1)),
200+
rwsetutil.NewKVRead("key3", version.NewHeight(1, 1)),
201+
rwsetutil.NewKVRead("key4", version.NewHeight(1, 3)),
202+
rwsetutil.NewKVRead("key5", version.NewHeight(1, 4)),
203+
rwsetutil.NewKVRead("key6", version.NewHeight(1, 5)),
204+
rwsetutil.NewKVRead("key7", version.NewHeight(1, 6)),
205+
rwsetutil.NewKVRead("key8", version.NewHeight(1, 7)),
206+
rwsetutil.NewKVRead("key9", version.NewHeight(1, 8)),
207207
}
208208
rqi2.SetMerkelSummary(buildTestHashResults(t, 2, kvReadsDuringSimulation2))
209209
rwsetBuilder2.AddToRangeQuerySet("ns1", rqi2)
210-
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder2.GetTxReadWriteSet()}, []int{1})
210+
checkValidation(t, validator, []*rwsetutil.TxRwSet{rwsetBuilder2.GetTxReadWriteSet()}, []int{0})
211211
}
212212

213213
func checkValidation(t *testing.T, validator *Validator, rwsets []*rwsetutil.TxRwSet, invalidTxIndexes []int) {
@@ -221,15 +221,15 @@ func checkValidation(t *testing.T, validator *Validator, rwsets []*rwsetutil.TxR
221221
block.Metadata.Metadata[common.BlockMetadataIndex_TRANSACTIONS_FILTER] = util.NewTxValidationFlags(len(block.Data.Data))
222222
_, err := validator.ValidateAndPrepareBatch(block, true)
223223
txsFltr := util.TxValidationFlags(block.Metadata.Metadata[common.BlockMetadataIndex_TRANSACTIONS_FILTER])
224-
invalidTxNum := 0
224+
invalidTxs := make([]int, 0)
225225
for i := 0; i < len(block.Data.Data); i++ {
226226
if txsFltr.IsInvalid(i) {
227-
invalidTxNum++
227+
invalidTxs = append(invalidTxs, i)
228228
}
229229
}
230230
testutil.AssertNoError(t, err, "")
231-
testutil.AssertEquals(t, invalidTxNum, len(invalidTxIndexes))
232-
//TODO Add the check for exact txnum that is marked invlid when bitarray is in place
231+
testutil.AssertEquals(t, len(invalidTxs), len(invalidTxIndexes))
232+
testutil.AssertContainsAll(t, invalidTxs, invalidTxIndexes)
233233
}
234234

235235
func buildTestHashResults(t *testing.T, maxDegree int, kvReads []*kvrwset.KVRead) *kvrwset.QueryReadsMerkleSummary {

0 commit comments

Comments
 (0)