Skip to content

Commit e768d1e

Browse files
committed
finality
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 62a6aa2 commit e768d1e

File tree

2 files changed

+81
-39
lines changed

2 files changed

+81
-39
lines changed

platform/fabricx/finality.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package fabricx
8+
9+
import (
10+
"github.com/hyperledger-labs/fabric-smart-client/platform/common/driver"
11+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric"
12+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabricx/core/finality"
13+
)
14+
15+
type (
16+
TxID = driver.TxID
17+
FinalityListener = fabric.FinalityListener
18+
)
19+
20+
type Finality struct {
21+
manager finality.ListenerManager
22+
}
23+
24+
func NewFinality(manager finality.ListenerManager) *Finality {
25+
return &Finality{manager: manager}
26+
}
27+
28+
func (f *Finality) AddFinalityListener(txID TxID, listener FinalityListener) error {
29+
return f.manager.AddFinalityListener(txID, listener)
30+
}
31+
32+
func (f *Finality) RemoveFinalityListener(txID TxID, listener FinalityListener) error {
33+
return f.manager.RemoveFinalityListener(txID, listener)
34+
}

platform/fabricx/fns.go

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ package fabricx
88

99
import (
1010
"reflect"
11-
"sync"
1211

1312
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
1413
"github.com/hyperledger-labs/fabric-smart-client/platform/common/services/logging"
14+
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/lazy"
1515
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric"
1616
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core"
17+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/driver/config"
18+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabricx/core/finality"
1719
"github.com/hyperledger-labs/fabric-smart-client/platform/fabricx/core/queryservice"
1820
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services"
1921
)
@@ -27,16 +29,33 @@ var (
2729
type NetworkService struct {
2830
*fabric.NetworkService
2931
queryService *QueryService
32+
33+
flp *finality.Provider
34+
finalityProvider lazy.Provider[string, *Finality]
3035
}
3136

32-
func NewNetworkService(fabricNetworkService *fabric.NetworkService) (*NetworkService, error) {
37+
func NewNetworkService(
38+
fnsp *fabric.NetworkServiceProvider,
39+
fabricNetworkService *fabric.NetworkService,
40+
configProvider config.Provider,
41+
) (*NetworkService, error) {
3342
qs, err := queryservice.NewRemoteQueryServiceFromConfig(fabricNetworkService.ConfigService())
3443
if err != nil {
3544
return nil, errors.Wrap(err, "failed creating remote query service")
3645
}
46+
flp := finality.NewListenerManagerProvider(fnsp, configProvider)
47+
3748
return &NetworkService{
3849
NetworkService: fabricNetworkService,
3950
queryService: NewQueryService(qs),
51+
flp: flp,
52+
finalityProvider: lazy.NewProvider[string, *Finality](func(ch string) (*Finality, error) {
53+
manager, err := flp.NewManager(fabricNetworkService.Name(), ch)
54+
if err != nil {
55+
return nil, err
56+
}
57+
return NewFinality(manager), nil
58+
}),
4059
}, nil
4160
}
4261

@@ -48,53 +67,42 @@ func (ns *NetworkService) QueryService() *QueryService {
4867
return ns.queryService
4968
}
5069

70+
func (ns *NetworkService) FinalityService(channel string) (*Finality, error) {
71+
return ns.finalityProvider.Get(channel)
72+
}
73+
5174
type NetworkServiceProvider struct {
52-
fnsProvider *fabric.NetworkServiceProvider
53-
mutex sync.RWMutex
54-
networkServices map[string]*NetworkService
75+
fnsProvider *fabric.NetworkServiceProvider
76+
configProvider config.Provider
77+
78+
providers lazy.Provider[string, *NetworkService]
5579
}
5680

57-
func NewNetworkServiceProvider(fnsProvider *fabric.NetworkServiceProvider) *NetworkServiceProvider {
58-
return &NetworkServiceProvider{fnsProvider: fnsProvider, networkServices: make(map[string]*NetworkService)}
81+
func NewNetworkServiceProvider(fnsProvider *fabric.NetworkServiceProvider, configProvider config.Provider) *NetworkServiceProvider {
82+
return &NetworkServiceProvider{
83+
fnsProvider: fnsProvider,
84+
configProvider: configProvider,
85+
providers: lazy.NewProvider[string, *NetworkService](func(id string) (*NetworkService, error) {
86+
internalFns, err := fnsProvider.FabricNetworkService(id)
87+
if err != nil {
88+
logger.Errorf("failed to get Fabric Network Service for id [%s]: [%s]", id, err.Error())
89+
return nil, errors.WithMessagef(err, "failed to get Fabric Network Service for id [%s]", id)
90+
}
91+
ns, err := NewNetworkService(fnsProvider, internalFns, configProvider)
92+
if err != nil {
93+
return nil, errors.WithMessagef(err, "failed to create Fabric Network Service for id [%s]", id)
94+
}
95+
return ns, nil
96+
}),
97+
}
5998
}
6099

61100
func (nsp *NetworkServiceProvider) FabricNetworkServiceProvider() *fabric.NetworkServiceProvider {
62101
return nsp.fnsProvider
63102
}
64103

65104
func (nsp *NetworkServiceProvider) FabricNetworkService(id string) (*NetworkService, error) {
66-
nsp.mutex.RLock()
67-
ns, ok := nsp.networkServices[id]
68-
nsp.mutex.RUnlock()
69-
if ok {
70-
return ns, nil
71-
}
72-
73-
nsp.mutex.Lock()
74-
defer nsp.mutex.Unlock()
75-
ns, ok = nsp.networkServices[id]
76-
if ok {
77-
return ns, nil
78-
}
79-
80-
internalFns, err := nsp.fnsProvider.FabricNetworkService(id)
81-
if err != nil {
82-
logger.Errorf("failed to get Fabric Network Service for id [%s]: [%s]", id, err.Error())
83-
return nil, errors.WithMessagef(err, "failed to get Fabric Network Service for id [%s]", id)
84-
}
85-
ns, ok = nsp.networkServices[internalFns.Name()]
86-
if ok {
87-
return ns, nil
88-
}
89-
90-
ns, err = NewNetworkService(internalFns)
91-
if err != nil {
92-
return nil, errors.WithMessagef(err, "failed to create Fabric Network Service for id [%s]", id)
93-
}
94-
nsp.networkServices[id] = ns
95-
nsp.networkServices[internalFns.Name()] = ns
96-
97-
return ns, nil
105+
return nsp.providers.Get(id)
98106
}
99107

100108
func GetNetworkServiceProvider(sp services.Provider) (*NetworkServiceProvider, error) {

0 commit comments

Comments
 (0)