@@ -8,6 +8,7 @@ package dynamicselection
88
99import (
1010 "fmt"
11+ "sync"
1112 "time"
1213
1314 "github.com/hyperledger/fabric-sdk-go/pkg/util/concurrent/lazycache"
@@ -42,6 +43,8 @@ type SelectionProvider struct {
4243 lbp pgresolver.LoadBalancePolicy
4344 providers api.Providers
4445 cacheTimeout time.Duration
46+ refs []* selectionService
47+ refLock sync.RWMutex
4548}
4649
4750// Opt applies a selection provider option
@@ -114,8 +117,26 @@ func (p *SelectionProvider) CreateSelectionService(channelID string) (fab.Select
114117 if err != nil {
115118 return nil , errors .WithMessage (err , "Failed to create cc policy provider" )
116119 }
120+ svc , err := newSelectionService (channelID , p .lbp , ccPolicyProvider , p .cacheTimeout )
121+ if err != nil {
122+ return nil , err
123+ }
124+
125+ p .refLock .Lock ()
126+ p .refs = append (p .refs , svc )
127+ p .refLock .Unlock ()
128+
129+ return svc , nil
130+ }
131+
132+ // Close the selection services created by this provider
133+ func (p * SelectionProvider ) Close () {
134+ p .refLock .Lock ()
135+ defer p .refLock .Unlock ()
117136
118- return newSelectionService (channelID , p .lbp , ccPolicyProvider , p .cacheTimeout )
137+ for _ , ref := range p .refs {
138+ ref .Close ()
139+ }
119140}
120141
121142func newSelectionService (channelID string , lbp pgresolver.LoadBalancePolicy , ccPolicyProvider CCPolicyProvider , cacheTimeout time.Duration ) (* selectionService , error ) {
@@ -159,6 +180,10 @@ func (s *selectionService) GetEndorsersForChaincode(chaincodeIDs []string, opts
159180 return resolver .Resolve (params .PeerFilter ).Peers (), nil
160181}
161182
183+ func (s * selectionService ) Close () {
184+ s .pgResolvers .Close ()
185+ }
186+
162187func (s * selectionService ) getPeerGroupResolver (chaincodeIDs []string ) (pgresolver.PeerGroupResolver , error ) {
163188 value , err := s .pgResolvers .Get (newResolverKey (s .channelID , chaincodeIDs ... ))
164189 if err != nil {
0 commit comments