github.com/ewagmig/fabric@v2.1.1+incompatible/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  
    12  	"github.com/hyperledger/fabric/core/ledger"
    13  	"github.com/hyperledger/fabric/core/ledger/kvledger"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestGetMissingPvtDataAfterRollback(t *testing.T) {
    18  	env := newEnv(t)
    19  	defer env.cleanup()
    20  	env.initLedgerMgmt()
    21  	h := env.newTestHelperCreateLgr("ledger1", t)
    22  
    23  	collConf := []*collConf{{name: "coll1", btl: 5}}
    24  
    25  	// deploy cc1 with 'collConf'
    26  	h.simulateDeployTx("cc1", collConf)
    27  	h.cutBlockAndCommitLegacy()
    28  
    29  	// pvtdata simulation
    30  	h.simulateDataTx("", func(s *simulator) {
    31  		s.setPvtdata("cc1", "coll1", "key1", "value1")
    32  	})
    33  	// another pvtdata simulation
    34  	h.simulateDataTx("", func(s *simulator) {
    35  		s.setPvtdata("cc1", "coll1", "key2", "value2")
    36  	})
    37  
    38  	h.causeMissingPvtData(0)
    39  	blk2 := h.cutBlockAndCommitLegacy()
    40  
    41  	h.verifyPvtState("cc1", "coll1", "key2", "value2") // key2 should have been committed
    42  	h.simulateDataTx("", func(s *simulator) {
    43  		h.assertError(s.GetPrivateData("cc1", "coll1", "key1")) // key1 would be stale with respect to hashed version
    44  	})
    45  
    46  	// verify missing pvtdata info
    47  	h.verifyBlockAndPvtDataSameAs(2, blk2)
    48  	expectedMissingPvtDataInfo := make(ledger.MissingPvtDataInfo)
    49  	expectedMissingPvtDataInfo.Add(2, 0, "cc1", "coll1")
    50  	h.verifyMissingPvtDataSameAs(2, expectedMissingPvtDataInfo)
    51  
    52  	// commit block 3
    53  	h.simulateDataTx("", func(s *simulator) {
    54  		s.setPvtdata("cc1", "coll1", "key3", "value2")
    55  	})
    56  	blk3 := h.cutBlockAndCommitLegacy()
    57  
    58  	// commit block 4
    59  	h.simulateDataTx("", func(s *simulator) {
    60  		s.setPvtdata("cc1", "coll1", "key3", "value2")
    61  	})
    62  	blk4 := h.cutBlockAndCommitLegacy()
    63  
    64  	// verify missing pvtdata info
    65  	h.verifyMissingPvtDataSameAs(5, expectedMissingPvtDataInfo)
    66  
    67  	// rollback ledger to block 2
    68  	h.verifyLedgerHeight(5)
    69  	env.closeLedgerMgmt()
    70  	err := kvledger.RollbackKVLedger(env.initializer.Config.RootFSPath, "ledger1", 2)
    71  	assert.NoError(t, err)
    72  	env.initLedgerMgmt()
    73  
    74  	h = env.newTestHelperOpenLgr("ledger1", t)
    75  	h.verifyLedgerHeight(3)
    76  
    77  	// verify block & pvtdata
    78  	h.verifyBlockAndPvtDataSameAs(2, blk2)
    79  	// when the pvtdata store is ahead of blockstore,
    80  	// missing pvtdata info for block 2 would not be returned.
    81  	h.verifyMissingPvtDataSameAs(5, nil)
    82  
    83  	// recommit block 3
    84  	assert.NoError(t, h.lgr.CommitLegacy(blk3, &ledger.CommitOptions{}))
    85  	// when the pvtdata store is ahead of blockstore,
    86  	// missing pvtdata info for block 2 would not be returned.
    87  	h.verifyMissingPvtDataSameAs(5, nil)
    88  
    89  	// recommit block 4
    90  	assert.NoError(t, h.lgr.CommitLegacy(blk4, &ledger.CommitOptions{}))
    91  	// once the pvtdata store and blockstore becomes equal,
    92  	// missing pvtdata info for block 2 would be returned.
    93  	h.verifyMissingPvtDataSameAs(5, expectedMissingPvtDataInfo)
    94  }