github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/core/ledger/kvledger/tests/missing_pvtdata_retrieval_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package tests 8 9 import ( 10 "testing" 11 "time" 12 13 "github.com/osdi23p228/fabric/bccsp/sw" 14 "github.com/osdi23p228/fabric/core/container/externalbuilder" 15 "github.com/osdi23p228/fabric/core/ledger" 16 "github.com/osdi23p228/fabric/core/ledger/kvledger" 17 "github.com/osdi23p228/fabric/core/ledger/ledgermgmt" 18 "github.com/stretchr/testify/require" 19 ) 20 21 func TestGetMissingPvtData(t *testing.T) { 22 setup := func(h *testhelper) (*ledger.BlockAndPvtData, ledger.MissingPvtDataInfo) { 23 collConf := []*collConf{{ 24 name: "coll1", 25 btl: 5, 26 }} 27 28 // deploy cc1 with 'collConf' 29 h.simulateDeployTx("cc1", collConf) 30 h.cutBlockAndCommitLegacy() 31 32 // pvtdata simulation 33 h.simulateDataTx("", func(s *simulator) { 34 s.setPvtdata("cc1", "coll1", "key1", "value1") 35 }) 36 // another pvtdata simulation 37 h.simulateDataTx("", func(s *simulator) { 38 s.setPvtdata("cc1", "coll1", "key2", "value2") 39 }) 40 // another pvtdata simulation 41 h.simulateDataTx("", func(s *simulator) { 42 s.setPvtdata("cc1", "coll1", "key3", "value3") 43 }) 44 45 // two transactions are missing some pvtdata 46 h.causeMissingPvtData(0) 47 h.causeMissingPvtData(2) 48 blk2 := h.cutBlockAndCommitLegacy() 49 50 h.verifyPvtState("cc1", "coll1", "key2", "value2") // key2 should have been committed 51 h.simulateDataTx("", func(s *simulator) { 52 h.assertError(s.GetPrivateData("cc1", "coll1", "key1")) // key1 would be stale with respect to hashed version 53 }) 54 h.simulateDataTx("", func(s *simulator) { 55 h.assertError(s.GetPrivateData("cc1", "coll1", "key3")) // key3 would be stale with respect to hashed version 56 }) 57 58 // verify missing pvtdata info 59 h.verifyBlockAndPvtDataSameAs(2, blk2) 60 expectedMissingPvtDataInfo := make(ledger.MissingPvtDataInfo) 61 expectedMissingPvtDataInfo.Add(2, 0, "cc1", "coll1") 62 expectedMissingPvtDataInfo.Add(2, 2, "cc1", "coll1") 63 h.verifyMissingPvtDataSameAs(2, expectedMissingPvtDataInfo) 64 65 return blk2, expectedMissingPvtDataInfo 66 } 67 68 t.Run("get missing data after rollback", func(t *testing.T) { 69 env := newEnv(t) 70 defer env.cleanup() 71 env.initLedgerMgmt() 72 h := env.newTestHelperCreateLgr("ledger1", t) 73 74 blk, expectedMissingPvtDataInfo := setup(h) 75 76 // commit block 3 77 h.simulateDataTx("", func(s *simulator) { 78 s.setPvtdata("cc1", "coll1", "key4", "value4") 79 }) 80 blk3 := h.cutBlockAndCommitLegacy() 81 82 // commit block 4 83 h.simulateDataTx("", func(s *simulator) { 84 s.setPvtdata("cc1", "coll1", "key5", "value5") 85 }) 86 blk4 := h.cutBlockAndCommitLegacy() 87 88 // verify missing pvtdata info 89 h.verifyMissingPvtDataSameAs(5, expectedMissingPvtDataInfo) 90 91 // rollback ledger to block 2 92 h.verifyLedgerHeight(5) 93 env.closeLedgerMgmt() 94 err := kvledger.RollbackKVLedger(env.initializer.Config.RootFSPath, "ledger1", 2) 95 require.NoError(t, err) 96 env.initLedgerMgmt() 97 98 h = env.newTestHelperOpenLgr("ledger1", t) 99 h.verifyLedgerHeight(3) 100 101 // verify block & pvtdata 102 h.verifyBlockAndPvtDataSameAs(2, blk) 103 // when the pvtdata store is ahead of blockstore, 104 // missing pvtdata info for block 2 would not be returned. 105 h.verifyMissingPvtDataSameAs(5, nil) 106 107 // recommit block 3 108 require.NoError(t, h.lgr.CommitLegacy(blk3, &ledger.CommitOptions{})) 109 // when the pvtdata store is ahead of blockstore, 110 // missing pvtdata info for block 2 would not be returned. 111 h.verifyMissingPvtDataSameAs(5, nil) 112 113 // recommit block 4 114 require.NoError(t, h.lgr.CommitLegacy(blk4, &ledger.CommitOptions{})) 115 // once the pvtdata store and blockstore becomes equal, 116 // missing pvtdata info for block 2 would be returned. 117 h.verifyMissingPvtDataSameAs(5, expectedMissingPvtDataInfo) 118 }) 119 120 t.Run("get deprioritized missing data", func(t *testing.T) { 121 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 122 require.NoError(t, err) 123 124 initializer := &ledgermgmt.Initializer{ 125 Config: &ledger.Config{ 126 PrivateDataConfig: &ledger.PrivateDataConfig{ 127 MaxBatchSize: 5000, 128 BatchesInterval: 1000, 129 PurgeInterval: 100, 130 DeprioritizedDataReconcilerInterval: 120 * time.Minute, 131 }, 132 }, 133 HashProvider: cryptoProvider, 134 EbMetadataProvider: &externalbuilder.MetadataProvider{ 135 DurablePath: "testdata", 136 }, 137 } 138 env := newEnvWithInitializer(t, initializer) 139 defer env.cleanup() 140 env.initLedgerMgmt() 141 h := env.newTestHelperCreateLgr("ledger1", t) 142 143 _, expectedMissingPvtDataInfo := setup(h) 144 145 h.commitPvtDataOfOldBlocks(nil, expectedMissingPvtDataInfo) 146 for i := 0; i < 5; i++ { 147 h.verifyMissingPvtDataSameAs(int(2), ledger.MissingPvtDataInfo{}) 148 } 149 150 env.closeLedgerMgmt() 151 env.initializer.Config.PrivateDataConfig.DeprioritizedDataReconcilerInterval = 0 * time.Second 152 env.initLedgerMgmt() 153 154 h = env.newTestHelperOpenLgr("ledger1", t) 155 for i := 0; i < 5; i++ { 156 h.verifyMissingPvtDataSameAs(2, expectedMissingPvtDataInfo) 157 } 158 159 env.closeLedgerMgmt() 160 env.initializer.Config.PrivateDataConfig.DeprioritizedDataReconcilerInterval = 120 * time.Minute 161 env.initLedgerMgmt() 162 163 h = env.newTestHelperOpenLgr("ledger1", t) 164 for i := 0; i < 5; i++ { 165 h.verifyMissingPvtDataSameAs(2, ledger.MissingPvtDataInfo{}) 166 } 167 }) 168 }