github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/unjoin_channel.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  	"github.com/hechain20/hechain/common/ledger/blkstorage"
    11  	"github.com/hechain20/hechain/common/ledger/util/leveldbhelper"
    12  	"github.com/hechain20/hechain/common/metrics/disabled"
    13  	"github.com/hechain20/hechain/core/ledger"
    14  	"github.com/hechain20/hechain/core/ledger/confighistory"
    15  	"github.com/hechain20/hechain/core/ledger/kvledger/bookkeeping"
    16  	"github.com/hechain20/hechain/core/ledger/kvledger/history"
    17  	"github.com/hechain20/hechain/core/ledger/kvledger/msgs"
    18  	"github.com/hechain20/hechain/core/ledger/kvledger/txmgmt/privacyenabledstate"
    19  	"github.com/hechain20/hechain/core/ledger/pvtdatastorage"
    20  	"github.com/hyperledger/fabric-lib-go/healthz"
    21  	"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
    22  	"github.com/hyperledger/fabric-protos-go/peer"
    23  	"github.com/pkg/errors"
    24  )
    25  
    26  // UnjoinChannel removes the data for a ledger and sets the status to UNDER_DELETION.  This function is to be
    27  // invoked while the peer is shut down.
    28  func UnjoinChannel(config *ledger.Config, ledgerID string) error {
    29  	// Ensure the routine is invoked while the peer is down.
    30  	fileLock := leveldbhelper.NewFileLock(fileLockPath(config.RootFSPath))
    31  	if err := fileLock.Lock(); err != nil {
    32  		return errors.WithMessage(err, "as another peer node command is executing,"+
    33  			" wait for that command to complete its execution or terminate it before retrying")
    34  	}
    35  	defer fileLock.Unlock()
    36  
    37  	idStore, err := openIDStore(LedgerProviderPath(config.RootFSPath))
    38  	if err != nil {
    39  		return errors.WithMessagef(err, "unjoin channel [%s]", ledgerID)
    40  	}
    41  	defer idStore.db.Close()
    42  
    43  	// Set the ledger to a pending deletion status.  If the contents of the ledger are not
    44  	// fully removed (e.g. a crash during deletion, i/o error, etc.), the deletion may be
    45  	// resumed at the next peer start.
    46  	if err := idStore.updateLedgerStatus(ledgerID, msgs.Status_UNDER_DELETION); err != nil {
    47  		return errors.WithMessagef(err, "unjoin channel [%s]", ledgerID)
    48  	}
    49  
    50  	// remove the ledger data
    51  	if err := removeLedgerData(config, ledgerID); err != nil {
    52  		return errors.WithMessagef(err, "deleting ledger [%s]", ledgerID)
    53  	}
    54  
    55  	// Delete the ledger from the ID storage after the contents have been purged.
    56  	if err := idStore.deleteLedgerID(ledgerID); err != nil {
    57  		return errors.WithMessagef(err, "deleting ledger [%s]", ledgerID)
    58  	}
    59  
    60  	logger.Infow("channel has been successfully unjoined", "ledgerID", ledgerID)
    61  	return nil
    62  }
    63  
    64  // removeLedgerData removes the data for a given ledger. This function should be invoked when the peer is not running and the caller should hold the file lock for the KVLedgerProvider
    65  func removeLedgerData(config *ledger.Config, ledgerID string) error {
    66  	blkStoreProvider, err := blkstorage.NewProvider(
    67  		blkstorage.NewConf(
    68  			BlockStorePath(config.RootFSPath),
    69  			maxBlockFileSize,
    70  		),
    71  		&blkstorage.IndexConfig{AttrsToIndex: attrsToIndex},
    72  		&disabled.Provider{},
    73  	)
    74  	if err != nil {
    75  		return err
    76  	}
    77  	defer blkStoreProvider.Close()
    78  
    79  	bookkeepingProvider, err := bookkeeping.NewProvider(BookkeeperDBPath(config.RootFSPath))
    80  	if err != nil {
    81  		return err
    82  	}
    83  	defer bookkeepingProvider.Close()
    84  
    85  	dbProvider, err := privacyenabledstate.NewDBProvider(
    86  		bookkeepingProvider,
    87  		&disabled.Provider{},
    88  		&noopHealthCheckRegistry{},
    89  		&privacyenabledstate.StateDBConfig{
    90  			StateDBConfig: config.StateDBConfig,
    91  			LevelDBPath:   StateDBPath(config.RootFSPath),
    92  		},
    93  		[]string{},
    94  	)
    95  	if err != nil {
    96  		return err
    97  	}
    98  	defer dbProvider.Close()
    99  
   100  	pvtdataStoreProvider, err := pvtdatastorage.NewProvider(
   101  		&pvtdatastorage.PrivateDataConfig{
   102  			PrivateDataConfig: config.PrivateDataConfig,
   103  			StorePath:         PvtDataStorePath(config.RootFSPath),
   104  		},
   105  	)
   106  	if err != nil {
   107  		return err
   108  	}
   109  	defer pvtdataStoreProvider.Close()
   110  
   111  	historydbProvider, err := history.NewDBProvider(
   112  		HistoryDBPath(config.RootFSPath),
   113  	)
   114  	if err != nil {
   115  		return err
   116  	}
   117  	defer historydbProvider.Close()
   118  
   119  	configHistoryMgr, err := confighistory.NewMgr(
   120  		ConfigHistoryDBPath(config.RootFSPath),
   121  		&noopDeployedChaincodeInfoProvider{},
   122  	)
   123  	if err != nil {
   124  		return err
   125  	}
   126  	defer configHistoryMgr.Close()
   127  
   128  	ledgerDataRemover := &ledgerDataRemover{
   129  		blkStoreProvider:     blkStoreProvider,
   130  		statedbProvider:      dbProvider,
   131  		bookkeepingProvider:  bookkeepingProvider,
   132  		configHistoryMgr:     configHistoryMgr,
   133  		historydbProvider:    historydbProvider,
   134  		pvtdataStoreProvider: pvtdataStoreProvider,
   135  	}
   136  	return ledgerDataRemover.Drop(ledgerID)
   137  }
   138  
   139  type noopHealthCheckRegistry struct{}
   140  
   141  func (n *noopHealthCheckRegistry) RegisterChecker(string, healthz.HealthChecker) error {
   142  	return nil
   143  }
   144  
   145  type noopDeployedChaincodeInfoProvider struct{}
   146  
   147  func (n *noopDeployedChaincodeInfoProvider) Namespaces() []string {
   148  	return nil
   149  }
   150  
   151  func (n *noopDeployedChaincodeInfoProvider) UpdatedChaincodes(stateUpdates map[string][]*kvrwset.KVWrite) ([]*ledger.ChaincodeLifecycleInfo, error) {
   152  	return nil, nil
   153  }
   154  
   155  func (n *noopDeployedChaincodeInfoProvider) ChaincodeInfo(channelName, chaincodeName string, qe ledger.SimpleQueryExecutor) (*ledger.DeployedChaincodeInfo, error) {
   156  	return nil, nil
   157  }
   158  
   159  func (n *noopDeployedChaincodeInfoProvider) AllChaincodesInfo(channelName string, qe ledger.SimpleQueryExecutor) (map[string]*ledger.DeployedChaincodeInfo, error) {
   160  	return nil, nil
   161  }
   162  
   163  func (n *noopDeployedChaincodeInfoProvider) CollectionInfo(channelName, chaincodeName, collectionName string, qe ledger.SimpleQueryExecutor) (*peer.StaticCollectionConfig, error) {
   164  	return nil, nil
   165  }
   166  
   167  func (n *noopDeployedChaincodeInfoProvider) ImplicitCollections(channelName, chaincodeName string, qe ledger.SimpleQueryExecutor) ([]*peer.StaticCollectionConfig, error) {
   168  	return nil, nil
   169  }
   170  
   171  func (n *noopDeployedChaincodeInfoProvider) GenerateImplicitCollectionForOrg(mspid string) *peer.StaticCollectionConfig {
   172  	return nil
   173  }
   174  
   175  func (n *noopDeployedChaincodeInfoProvider) AllCollectionsConfigPkg(channelName, chaincodeName string, qe ledger.SimpleQueryExecutor) (*peer.CollectionConfigPackage, error) {
   176  	return nil, nil
   177  }