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