github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/delete_partial_ledgers_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package kvledger
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/hechain20/hechain/core/ledger/kvledger/msgs"
    13  	"github.com/hechain20/hechain/core/ledger/mock"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestDeleteUnderDeletionLedger(t *testing.T) {
    18  	conf, cleanup := testConfig(t)
    19  	conf.HistoryDBConfig.Enabled = true
    20  	defer cleanup()
    21  
    22  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    23  	defer provider.Close()
    24  
    25  	// Set up a ledger and mark it as "under deletion."  This emulates the
    26  	// state when a peer was in the process of unjoining a channel and the
    27  	// unjoin operation crashed mid delete.
    28  	ledgerID := constructTestLedger(t, provider, 0)
    29  	verifyLedgerIDExists(t, provider, ledgerID, msgs.Status_ACTIVE)
    30  
    31  	// doom the newly created ledger
    32  	require.NoError(t, provider.idStore.updateLedgerStatus(ledgerID, msgs.Status_UNDER_DELETION))
    33  	verifyLedgerIDExists(t, provider, ledgerID, msgs.Status_UNDER_DELETION)
    34  
    35  	// explicitly call the delete on the provider.
    36  	provider.deletePartialLedgers()
    37  
    38  	// goodbye, ledger.
    39  	verifyLedgerDoesNotExist(t, provider, ledgerID)
    40  }
    41  
    42  func TestDeletePartialLedgers(t *testing.T) {
    43  	conf, cleanup := testConfig(t)
    44  	conf.HistoryDBConfig.Enabled = true
    45  	defer cleanup()
    46  
    47  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    48  	defer provider.Close()
    49  
    50  	targetStatus := []msgs.Status{
    51  		msgs.Status_ACTIVE,
    52  		msgs.Status_UNDER_DELETION,
    53  		msgs.Status_ACTIVE,
    54  		msgs.Status_UNDER_DELETION,
    55  		msgs.Status_UNDER_CONSTRUCTION,
    56  	}
    57  
    58  	constructPartialLedgers(t, provider, targetStatus)
    59  
    60  	// delete the under deletion ledgers
    61  	err := provider.deletePartialLedgers()
    62  	require.NoError(t, err)
    63  
    64  	verifyPartialLedgers(t, provider, targetStatus)
    65  }
    66  
    67  func TestNewProviderDeletesPartialLedgers(t *testing.T) {
    68  	conf, cleanup := testConfig(t)
    69  	conf.HistoryDBConfig.Enabled = true
    70  	defer cleanup()
    71  
    72  	provider := testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    73  
    74  	targetStatus := []msgs.Status{
    75  		msgs.Status_ACTIVE,
    76  		msgs.Status_UNDER_DELETION,
    77  		msgs.Status_UNDER_CONSTRUCTION,
    78  		msgs.Status_ACTIVE,
    79  		msgs.Status_UNDER_DELETION,
    80  	}
    81  
    82  	constructPartialLedgers(t, provider, targetStatus)
    83  
    84  	// Close and re-open the provider.  The initialization should have scrubbed the partial ledgers.
    85  	provider.Close()
    86  	provider = testutilNewProvider(conf, t, &mock.DeployedChaincodeInfoProvider{})
    87  	defer provider.Close()
    88  
    89  	verifyPartialLedgers(t, provider, targetStatus)
    90  }
    91  
    92  // Construct a series of test ledgers, each with a target status.
    93  func constructPartialLedgers(t *testing.T, provider *Provider, targetStatus []msgs.Status) {
    94  	for i := 0; i < len(targetStatus); i++ {
    95  		ledgerID := constructTestLedger(t, provider, i)
    96  		require.NoError(t, provider.idStore.updateLedgerStatus(ledgerID, targetStatus[i]))
    97  		verifyLedgerIDExists(t, provider, ledgerID, targetStatus[i])
    98  	}
    99  }
   100  
   101  // Check that all UNDER_CONSTRUCTION and UNDER_DELETION ledgers were scrubbed.
   102  func verifyPartialLedgers(t *testing.T, provider *Provider, targetStatus []msgs.Status) {
   103  	// Also double-check that deleted ledgers do not appear in the provider listing.
   104  	activeLedgers, err := provider.List()
   105  	require.NoError(t, err)
   106  
   107  	for i := 0; i < len(targetStatus); i++ {
   108  		ledgerID := constructTestLedgerID(i)
   109  		if targetStatus[i] == msgs.Status_UNDER_CONSTRUCTION || targetStatus[i] == msgs.Status_UNDER_DELETION {
   110  			verifyLedgerDoesNotExist(t, provider, ledgerID)
   111  			require.NotContains(t, ledgerID, activeLedgers)
   112  		} else {
   113  			verifyLedgerIDExists(t, provider, ledgerID, targetStatus[i])
   114  			require.Contains(t, activeLedgers, ledgerID)
   115  		}
   116  	}
   117  }