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 }