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  }