@@ -457,11 +457,9 @@ func testSyncStateDBWithPvtdatastore(t *testing.T) {
457
457
map [string ]uint64 {"coll" : 0 },
458
458
conf ,
459
459
)
460
- defer provider .Close ()
461
460
testLedgerid := "testLedger"
462
461
bg , gb := testutil .NewBlockGenerator (t , testLedgerid , false )
463
462
ledger , _ := provider .Create (gb )
464
- defer ledger .Close ()
465
463
466
464
// create and commit two data block (both with missing pvtdata)
467
465
blockAndPvtdata1 , pvtdata1 := prepareNextBlockWithMissingPvtDataForTest (t , ledger , bg , "SimulateForBlk1" ,
@@ -476,28 +474,75 @@ func testSyncStateDBWithPvtdatastore(t *testing.T) {
476
474
477
475
assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata2 , & lgr.CommitOptions {}))
478
476
477
+ blockAndPvtdata3 , pvtdata3 := prepareNextBlockWithMissingPvtDataForTest (t , ledger , bg , "SimulateForBlk3" ,
478
+ map [string ]string {"key1" : "value1.3" , "key2" : "value2.3" , "key3" : "value3.3" },
479
+ map [string ]string {"key1" : "pvtValue1.3" , "key2" : "pvtValue2.3" , "key3" : "pvtValue3.3" })
480
+
481
+ blockAndPvtdata3 .Block .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ][0 ] = byte (peer .TxValidationCode_PHANTOM_READ_CONFLICT )
482
+ assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata3 , & lgr.CommitOptions {}))
483
+
484
+ blockAndPvtdata4 , pvtdata4 := prepareNextBlockWithMissingPvtDataForTest (t , ledger , bg , "SimulateForBlk4" ,
485
+ map [string ]string {"key4" : "value4" },
486
+ map [string ]string {"key4" : "pvtValue4" })
487
+
488
+ assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata4 , & lgr.CommitOptions {}))
489
+
490
+ blockAndPvtdata5 , pvtdata5 := prepareNextBlockWithMissingPvtDataForTest (t , ledger , bg , "SimulateForBlk5" ,
491
+ map [string ]string {"key5" : "value4" },
492
+ map [string ]string {"key5" : "pvtValue5" })
493
+
494
+ assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata5 , & lgr.CommitOptions {}))
495
+
479
496
txSim , err := ledger .NewTxSimulator ("test" )
480
497
assert .NoError (t , err )
481
498
value , err := txSim .GetPrivateData ("ns" , "coll" , "key1" )
482
499
_ , ok := err .(* txmgr.ErrPvtdataNotAvailable )
483
500
assert .True (t , ok )
484
501
assert .Nil (t , value )
485
502
503
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key4" )
504
+ _ , ok = err .(* txmgr.ErrPvtdataNotAvailable )
505
+ assert .True (t , ok )
506
+ assert .Nil (t , value )
507
+
508
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key5" )
509
+ _ , ok = err .(* txmgr.ErrPvtdataNotAvailable )
510
+ assert .True (t , ok )
511
+ assert .Nil (t , value )
512
+
486
513
blocksPvtData := map [uint64 ][]* lgr.TxPvtData {
487
514
1 : {
488
515
pvtdata1 ,
489
516
},
490
517
2 : {
491
518
pvtdata2 ,
492
519
},
520
+ 3 : {
521
+ pvtdata3 ,
522
+ },
523
+ 4 : {
524
+ pvtdata4 ,
525
+ },
526
+ 5 : {
527
+ pvtdata5 ,
528
+ },
493
529
}
494
530
495
531
assert .NoError (t , ledger .(* kvLedger ).blockStore .CommitPvtDataOfOldBlocks (blocksPvtData ))
532
+ // ensure that the pvtdata of the invalid transaction in block 3 got stored in the
533
+ // pvtdataStore
534
+ pvtdata , _ := ledger .GetPvtDataByNum (3 , nil )
535
+ assert .NotNil (t , pvtdata )
536
+ assert .Equal (t , 1 , len (pvtdata ))
537
+ assert .True (t , pvtdata [0 ].Has ("ns" , "coll" ))
496
538
497
539
// Now, assume that peer fails here before committing the pvtData to stateDB
498
540
ledger .Close ()
499
541
provider .Close ()
500
542
543
+ // Rollback to block 3
544
+ RollbackKVLedger (conf .RootFSPath , testLedgerid , 3 )
545
+
501
546
// Here the peer comes online and calls NewKVLedger to get a handler for the ledger
502
547
// StateDB and HistoryDB should be recovered before returning from NewKVLedger call
503
548
provider = testutilNewProviderWithCollectionConfig (
@@ -506,13 +551,44 @@ func testSyncStateDBWithPvtdatastore(t *testing.T) {
506
551
map [string ]uint64 {"coll" : 0 },
507
552
conf ,
508
553
)
509
- ledger , _ = provider .Open (testLedgerid )
554
+ defer provider .Close ()
555
+
556
+ ledger , err = provider .Open (testLedgerid )
557
+ assert .NoError (t , err )
558
+ defer ledger .Close ()
510
559
511
560
txSim , err = ledger .NewTxSimulator ("test" )
512
561
assert .NoError (t , err )
513
562
value , err = txSim .GetPrivateData ("ns" , "coll" , "key1" )
514
563
assert .NoError (t , err )
564
+ // the value should match the string provided in the block 2 (i.e., pvtValue1.2)
565
+ // rather than block 3 (i.e., pvtValue1.3)
515
566
assert .Equal (t , value , []byte ("pvtValue1.2" ))
567
+
568
+ // block 4 is not committed yet
569
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key4" )
570
+ assert .Nil (t , err )
571
+ assert .Nil (t , value )
572
+
573
+ // block 5 is not committed yet
574
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key5" )
575
+ assert .Nil (t , err )
576
+ assert .Nil (t , value )
577
+ txSim .Done ()
578
+
579
+ // recommit block 4 & 5
580
+ assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata4 , & lgr.CommitOptions {FetchPvtDataFromLedger : true }))
581
+ assert .NoError (t , ledger .CommitWithPvtData (blockAndPvtdata5 , & lgr.CommitOptions {FetchPvtDataFromLedger : true }))
582
+
583
+ txSim , err = ledger .NewTxSimulator ("test" )
584
+ assert .NoError (t , err )
585
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key4" )
586
+ assert .NoError (t , err )
587
+ assert .Equal (t , value , []byte ("pvtValue4" ))
588
+
589
+ value , err = txSim .GetPrivateData ("ns" , "coll" , "key5" )
590
+ assert .NoError (t , err )
591
+ assert .Equal (t , value , []byte ("pvtValue5" ))
516
592
}
517
593
518
594
func TestLedgerWithCouchDbEnabledWithBinaryAndJSONData (t * testing.T ) {
0 commit comments