github.com/ewagmig/fabric@v2.1.1+incompatible/core/ledger/kvledger/tests/rebuild_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  
    13  func TestRebuildComponents(t *testing.T) {
    14  	env := newEnv(t)
    15  	defer env.cleanup()
    16  	env.initLedgerMgmt()
    17  
    18  	h1, h2 := env.newTestHelperCreateLgr("ledger1", t), env.newTestHelperCreateLgr("ledger2", t)
    19  	dataHelper := newSampleDataHelper(t)
    20  
    21  	dataHelper.populateLedger(h1)
    22  	dataHelper.populateLedger(h2)
    23  
    24  	dataHelper.verifyLedgerContent(h1)
    25  	dataHelper.verifyLedgerContent(h2)
    26  
    27  	t.Run("rebuild only statedb",
    28  		func(t *testing.T) {
    29  			env.closeAllLedgersAndDrop(rebuildableStatedb)
    30  			h1, h2 := env.newTestHelperOpenLgr("ledger1", t), env.newTestHelperOpenLgr("ledger2", t)
    31  			dataHelper.verifyLedgerContent(h1)
    32  			dataHelper.verifyLedgerContent(h2)
    33  		},
    34  	)
    35  
    36  	t.Run("rebuild statedb and config history",
    37  		func(t *testing.T) {
    38  			env.closeAllLedgersAndDrop(rebuildableStatedb | rebuildableConfigHistory)
    39  			h1, h2 := env.newTestHelperOpenLgr("ledger1", t), env.newTestHelperOpenLgr("ledger2", t)
    40  			dataHelper.verifyLedgerContent(h1)
    41  			dataHelper.verifyLedgerContent(h2)
    42  		},
    43  	)
    44  
    45  	t.Run("rebuild statedb and block index",
    46  		func(t *testing.T) {
    47  			env.closeAllLedgersAndDrop(rebuildableStatedb | rebuildableBlockIndex)
    48  			h1, h2 := env.newTestHelperOpenLgr("ledger1", t), env.newTestHelperOpenLgr("ledger2", t)
    49  			dataHelper.verifyLedgerContent(h1)
    50  			dataHelper.verifyLedgerContent(h2)
    51  		},
    52  	)
    53  
    54  	t.Run("rebuild statedb and historydb",
    55  		func(t *testing.T) {
    56  			env.closeAllLedgersAndDrop(rebuildableStatedb | rebuildableHistoryDB)
    57  			h1, h2 := env.newTestHelperOpenLgr("ledger1", t), env.newTestHelperOpenLgr("ledger2", t)
    58  			dataHelper.verifyLedgerContent(h1)
    59  			dataHelper.verifyLedgerContent(h2)
    60  		},
    61  	)
    62  }
    63  
    64  func TestRebuildComponentsWithBTL(t *testing.T) {
    65  	env := newEnv(t)
    66  	defer env.cleanup()
    67  	env.initLedgerMgmt()
    68  	h := env.newTestHelperCreateLgr("ledger1", t)
    69  	collConf := []*collConf{{name: "coll1", btl: 0}, {name: "coll2", btl: 1}}
    70  
    71  	// deploy cc1 with 'collConf'
    72  	h.simulateDeployTx("cc1", collConf)
    73  	h.cutBlockAndCommitLegacy()
    74  
    75  	// commit pvtdata writes in block 2.
    76  	h.simulateDataTx("", func(s *simulator) {
    77  		s.setPvtdata("cc1", "coll1", "key1", "value1") // (key1 would never expire)
    78  		s.setPvtdata("cc1", "coll2", "key2", "value2") // (key2 would expire at block 4)
    79  	})
    80  	blk2 := h.cutBlockAndCommitLegacy()
    81  
    82  	// After commit of block 2
    83  	h.verifyPvtState("cc1", "coll1", "key1", "value1") // key1 should still exist in the state
    84  	h.verifyPvtState("cc1", "coll2", "key2", "value2") // key2 should still exist in the state
    85  	h.verifyBlockAndPvtDataSameAs(2, blk2)             // key1 and key2 should still exist in the pvtdata storage
    86  
    87  	// commit 2 more blocks with some random key/vals
    88  
    89  	for i := 0; i < 2; i++ {
    90  		h.simulateDataTx("", func(s *simulator) {
    91  			s.setPvtdata("cc1", "coll1", "someOtherKey", "someOtherVal")
    92  			s.setPvtdata("cc1", "coll2", "someOtherKey", "someOtherVal")
    93  		})
    94  		h.cutBlockAndCommitLegacy()
    95  	}
    96  
    97  	// After commit of block 4
    98  	h.verifyPvtState("cc1", "coll1", "key1", "value1")                  // key1 should still exist in the state
    99  	h.verifyPvtState("cc1", "coll2", "key2", "")                        // key2 should have been purged from the state
   100  	h.verifyBlockAndPvtData(2, nil, func(r *retrievedBlockAndPvtdata) { // retrieve the pvtdata for block 2 from pvtdata storage
   101  		r.pvtdataShouldContain(0, "cc1", "coll1", "key1", "value1") // key1 should still exist in the pvtdata storage
   102  		r.pvtdataShouldNotContain("cc1", "coll2")                   // <cc1, coll2> shold have been purged from the pvtdata storage
   103  	})
   104  
   105  	// rebuild statedb and bookkeeper
   106  	env.closeAllLedgersAndDrop(rebuildableStatedb | rebuildableBookkeeper)
   107  
   108  	h = env.newTestHelperOpenLgr("ledger1", t)
   109  	h.verifyPvtState("cc1", "coll1", "key1", "value1")                  // key1 should still exist in the state
   110  	h.verifyPvtState("cc1", "coll2", "key2", "")                        // key2 should have been purged from the state
   111  	h.verifyBlockAndPvtData(2, nil, func(r *retrievedBlockAndPvtdata) { // retrieve the pvtdata for block 2 from pvtdata storage
   112  		r.pvtdataShouldContain(0, "cc1", "coll1", "key1", "value1") // key1 should still exist in the pvtdata storage
   113  		r.pvtdataShouldNotContain("cc1", "coll2")                   // <cc1, coll2> shold have been purged from the pvtdata storage
   114  	})
   115  
   116  	// commit pvtdata writes in block 5.
   117  	h.simulateDataTx("", func(s *simulator) {
   118  		s.setPvtdata("cc1", "coll1", "key3", "value1") // (key3 would never expire)
   119  		s.setPvtdata("cc1", "coll2", "key4", "value2") // (key4 would expire at block 7)
   120  	})
   121  	h.cutBlockAndCommitLegacy()
   122  
   123  	// commit 2 more blocks with some random key/vals
   124  	for i := 0; i < 2; i++ {
   125  		h.simulateDataTx("", func(s *simulator) {
   126  			s.setPvtdata("cc1", "coll1", "someOtherKey", "someOtherVal")
   127  			s.setPvtdata("cc1", "coll2", "someOtherKey", "someOtherVal")
   128  		})
   129  		h.cutBlockAndCommitLegacy()
   130  	}
   131  
   132  	// After commit of block 7
   133  	h.verifyPvtState("cc1", "coll1", "key3", "value1")                  // key3 should still exist in the state
   134  	h.verifyPvtState("cc1", "coll2", "key4", "")                        // key4 should have been purged from the state
   135  	h.verifyBlockAndPvtData(5, nil, func(r *retrievedBlockAndPvtdata) { // retrieve the pvtdata for block 2 from pvtdata storage
   136  		r.pvtdataShouldContain(0, "cc1", "coll1", "key3", "value1") // key3 should still exist in the pvtdata storage
   137  		r.pvtdataShouldNotContain("cc1", "coll2")                   // <cc1, coll2> shold have been purged from the pvtdata storage
   138  	})
   139  }