github.com/defanghe/fabric@v2.1.1+incompatible/core/ledger/kvledger/upgrade_dbs_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package kvledger
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  	"path/filepath"
    13  	"testing"
    14  
    15  	"github.com/hyperledger/fabric/common/ledger/dataformat"
    16  	"github.com/hyperledger/fabric/common/ledger/testutil"
    17  	"github.com/hyperledger/fabric/common/ledger/util/leveldbhelper"
    18  	"github.com/stretchr/testify/require"
    19  )
    20  
    21  func TestUpgradeDBs(t *testing.T) {
    22  	conf, cleanup := testConfig(t)
    23  	defer cleanup()
    24  	provider := testutilNewProvider(conf, t)
    25  
    26  	// upgrade should fail when provider is still open
    27  	err := UpgradeDBs(conf.RootFSPath)
    28  	require.Error(t, err, "as another peer node command is executing, wait for that command to complete its execution or terminate it before retrying")
    29  	provider.Close()
    30  
    31  	// load v11 ledger data for upgrade
    32  	rootFSPath := conf.RootFSPath
    33  	require.NoError(t, testutil.Unzip("tests/testdata/v11/sample_ledgers/ledgersData.zip", rootFSPath, false))
    34  	v11LedgerIDs := getLedgerIDs(t, rootFSPath)
    35  	require.NoError(t, UpgradeIDStoreFormat(rootFSPath))
    36  
    37  	err = UpgradeDBs(rootFSPath)
    38  	require.NoError(t, err)
    39  
    40  	// verify idStore has formatKey and metadata entries
    41  	idStore, err := openIDStore(LedgerProviderPath(conf.RootFSPath))
    42  	require.NoError(t, err)
    43  	formatVersion, err := idStore.db.Get(formatKey)
    44  	require.NoError(t, err)
    45  	require.Equal(t, []byte(dataformat.Version20), formatVersion)
    46  	metadataLedgerIDs, err := idStore.getActiveLedgerIDs()
    47  	require.NoError(t, err)
    48  	require.ElementsMatch(t, v11LedgerIDs, metadataLedgerIDs)
    49  	idStore.close()
    50  
    51  	// verify blockstoreIndex, configHistory, history, state, bookkeeper dbs are deleted
    52  	_, err = os.Stat(filepath.Join(BlockStorePath(rootFSPath), "index"))
    53  	require.Equal(t, os.IsNotExist(err), true)
    54  	_, err = os.Stat(ConfigHistoryDBPath(rootFSPath))
    55  	require.Equal(t, os.IsNotExist(err), true)
    56  	_, err = os.Stat(HistoryDBPath(rootFSPath))
    57  	require.Equal(t, os.IsNotExist(err), true)
    58  	_, err = os.Stat(StateDBPath(rootFSPath))
    59  	require.Equal(t, os.IsNotExist(err), true)
    60  	_, err = os.Stat(BookkeeperDBPath(rootFSPath))
    61  	require.Equal(t, os.IsNotExist(err), true)
    62  
    63  	// upgrade again should be successful
    64  	err = UpgradeDBs(rootFSPath)
    65  	require.NoError(t, err)
    66  }
    67  
    68  func TestUpgradeIDStoreWrongFormat(t *testing.T) {
    69  	conf, cleanup := testConfig(t)
    70  	conf.HistoryDBConfig.Enabled = false
    71  	defer cleanup()
    72  	provider := testutilNewProvider(conf, t)
    73  
    74  	// change format to a wrong value
    75  	err := provider.idStore.db.Put(formatKey, []byte("x.0"), true)
    76  	provider.Close()
    77  	require.NoError(t, err)
    78  
    79  	err = UpgradeIDStoreFormat(conf.RootFSPath)
    80  	expectedErr := &dataformat.ErrVersionMismatch{
    81  		ExpectedVersion: "",
    82  		Version:         "x.0",
    83  		DBInfo:          fmt.Sprintf("leveldb for channel-IDs at [%s]", LedgerProviderPath(conf.RootFSPath)),
    84  	}
    85  	require.EqualError(t, err, expectedErr.Error())
    86  }
    87  
    88  // getLedgerIDs returns ledger ids using ledgerKeyPrefix (available in both old format and new format)
    89  func getLedgerIDs(t *testing.T, rootFSPath string) []string {
    90  	dbPath := LedgerProviderPath(rootFSPath)
    91  	db := leveldbhelper.CreateDB(&leveldbhelper.Conf{DBPath: dbPath})
    92  	db.Open()
    93  	idStore := &idStore{db, dbPath}
    94  	defer db.Close()
    95  	itr := db.GetIterator(ledgerKeyPrefix, ledgerKeyStop)
    96  	defer itr.Release()
    97  	var ledgerIDs []string
    98  	for itr.Next() {
    99  		require.NoError(t, itr.Error())
   100  		ledgerIDs = append(ledgerIDs, idStore.decodeLedgerID(itr.Key(), ledgerKeyPrefix))
   101  	}
   102  	return ledgerIDs
   103  }