@@ -10,8 +10,8 @@ import (
1010 "context"
1111 "runtime/debug"
1212 "slices"
13- "sync"
1413
14+ "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/cache/secondcache"
1515 "github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1616 idriver "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
1717 "github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
@@ -46,6 +46,11 @@ type storage interface {
4646 StoreIdentityData (ctx context.Context , id []byte , identityAudit []byte , tokenMetadata []byte , tokenMetadataAudit []byte ) error
4747}
4848
49+ type cache [T any ] interface {
50+ Get (key string ) (T , bool )
51+ Add (key string , value T )
52+ }
53+
4954// Provider implements the driver.IdentityProvider interface.
5055// Provider handles the long-term identities on top of which wallets are defined.
5156type Provider struct {
@@ -55,8 +60,7 @@ type Provider struct {
5560 Storage storage
5661
5762 enrollmentIDUnmarshaler enrollmentIDUnmarshaler
58- isMeCacheLock sync.RWMutex
59- isMeCache map [string ]bool
63+ isMeCache cache [bool ]
6064}
6165
6266// NewProvider creates a new identity provider implementing the driver.IdentityProvider interface.
@@ -74,7 +78,7 @@ func NewProvider(
7478 SigService : sigService ,
7579 Binder : binder ,
7680 enrollmentIDUnmarshaler : enrollmentIDUnmarshaler ,
77- isMeCache : make ( map [ string ] bool ),
81+ isMeCache : secondcache. NewTyped [ bool ]( 1000 ),
7882 }
7983}
8084
@@ -96,9 +100,7 @@ func (p *Provider) RegisterRecipientData(ctx context.Context, data *driver.Recip
96100
97101func (p * Provider ) RegisterSigner (ctx context.Context , identity driver.Identity , signer driver.Signer , verifier driver.Verifier , signerInfo []byte ) error {
98102 defer func () {
99- p .isMeCacheLock .Lock ()
100- p .isMeCache [identity .String ()] = true
101- p .isMeCacheLock .Unlock ()
103+ p .isMeCache .Add (identity .UniqueID (), true )
102104 }()
103105 return p .SigService .RegisterSigner (ctx , identity , signer , verifier , signerInfo )
104106}
@@ -109,29 +111,22 @@ func (p *Provider) AreMe(ctx context.Context, identities ...driver.Identity) []s
109111 result := make ([]string , 0 )
110112 notFound := make ([]driver.Identity , 0 )
111113
112- p .isMeCacheLock .RLock ()
113114 for _ , id := range identities {
114- if isMe , ok := p .isMeCache [id .UniqueID ()]; ! ok {
115+ uniqueID := id .UniqueID ()
116+ if isMe , ok := p .isMeCache .Get (uniqueID ); ! ok {
115117 notFound = append (notFound , id )
116118 } else if isMe {
117- result = append (result , id . UniqueID () )
119+ result = append (result , uniqueID )
118120 }
119121 }
120122 if len (notFound ) == 0 {
121- defer p .isMeCacheLock .RUnlock ()
122123 return result
123124 }
124- p .isMeCacheLock .RUnlock ()
125-
126- p .isMeCacheLock .Lock ()
127-
128- // TODO: Look up cache under write lock
129-
130- defer p .isMeCacheLock .Unlock ()
131125
132126 found := p .SigService .AreMe (ctx , notFound ... )
133127 for _ , id := range notFound {
134- p .isMeCache [id .UniqueID ()] = slices .Contains (found , id .UniqueID ())
128+ uniqueID := id .UniqueID ()
129+ p .isMeCache .Add (uniqueID , slices .Contains (found , uniqueID ))
135130 }
136131 return append (result , found ... )
137132}
@@ -142,18 +137,14 @@ func (p *Provider) IsMe(ctx context.Context, identity driver.Identity) bool {
142137
143138func (p * Provider ) RegisterRecipientIdentity (id driver.Identity ) error {
144139 p .Logger .Debugf ("Registering identity [%s]" , id )
145- p .isMeCacheLock .Lock ()
146- p .isMeCache [id .String ()] = false
147- p .isMeCacheLock .Unlock ()
140+ p .isMeCache .Add (id .UniqueID (), false )
148141 return nil
149142}
150143
151144func (p * Provider ) GetSigner (ctx context.Context , identity driver.Identity ) (driver.Signer , error ) {
152145 found := false
153146 defer func () {
154- p .isMeCacheLock .Lock ()
155- p .isMeCache [identity .String ()] = found
156- p .isMeCacheLock .Unlock ()
147+ p .isMeCache .Add (identity .UniqueID (), found )
157148 }()
158149 signer , err := p .SigService .GetSigner (ctx , identity )
159150 if err != nil {
0 commit comments