-
Notifications
You must be signed in to change notification settings - Fork 8.8k
/
lsccstate_listener.go
78 lines (68 loc) · 2.97 KB
/
lsccstate_listener.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
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package cceventmgmt
import (
"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
"github.com/hyperledger/fabric/core/ledger"
)
// KVLedgerLSCCStateListener listens for state changes for chaincode lifecycle
type KVLedgerLSCCStateListener struct {
DeployedChaincodeInfoProvider ledger.DeployedChaincodeInfoProvider
}
func (listener *KVLedgerLSCCStateListener) Initialize(ledgerID string, qe ledger.SimpleQueryExecutor) error {
// Noop
return nil
}
// HandleStateUpdates uses 'DeployedChaincodeInfoProvider' to findout deployment of a chaincode
// and invokes `HandleChaincodeDeploy` function on chaincode event manager (which in turn is responsible for creation of statedb
// artifacts for the chaincode statedata)
func (listener *KVLedgerLSCCStateListener) HandleStateUpdates(trigger *ledger.StateUpdateTrigger) error {
channelName, kvWrites, postCommitQE, deployCCInfoProvider :=
trigger.LedgerID, extractPublicUpdates(trigger.StateUpdates), trigger.PostCommitQueryExecutor, listener.DeployedChaincodeInfoProvider
logger.Debugf("Channel [%s]: Handling state updates in LSCC namespace - stateUpdates=%#v", channelName, kvWrites)
updatedChaincodes, err := deployCCInfoProvider.UpdatedChaincodes(kvWrites)
if err != nil {
return err
}
chaincodeDefs := []*ChaincodeDefinition{}
for _, updatedChaincode := range updatedChaincodes {
logger.Infof("Channel [%s]: Handling deploy or update of chaincode [%s]", channelName, updatedChaincode.Name)
if updatedChaincode.Deleted {
// TODO handle delete case when delete is implemented in lifecycle
continue
}
deployedCCInfo, err := deployCCInfoProvider.ChaincodeInfo(channelName, updatedChaincode.Name, postCommitQE)
if err != nil {
return err
}
if !deployedCCInfo.IsLegacy {
// chaincode defined via new lifecycle, the legacy event mgr should not try to process that
// event by trying to match this with a legacy package installed. So, ignoring this event
continue
}
chaincodeDefs = append(chaincodeDefs, &ChaincodeDefinition{
Name: deployedCCInfo.Name,
Hash: deployedCCInfo.Hash,
Version: deployedCCInfo.Version,
CollectionConfigs: deployedCCInfo.ExplicitCollectionConfigPkg,
})
}
return GetMgr().HandleChaincodeDeploy(channelName, chaincodeDefs)
}
// InterestedInNamespaces implements function from interface `ledger.StateListener`
func (listener *KVLedgerLSCCStateListener) InterestedInNamespaces() []string {
return listener.DeployedChaincodeInfoProvider.Namespaces()
}
// StateCommitDone implements function from interface `ledger.StateListener`
func (listener *KVLedgerLSCCStateListener) StateCommitDone(channelName string) {
GetMgr().ChaincodeDeployDone(channelName)
}
func extractPublicUpdates(stateUpdates ledger.StateUpdates) map[string][]*kvrwset.KVWrite {
m := map[string][]*kvrwset.KVWrite{}
for ns, updates := range stateUpdates {
m[ns] = updates.PublicUpdates
}
return m
}