Skip to content

Commit 32f9f86

Browse files
HayimShaulHayim.Shaul@ibm.com
andauthored
remove id caches (#1283)
Signed-off-by: Hayim.Shaul@ibm.com <hayimsha@fhe3.haifa.ibm.com> Co-authored-by: Hayim.Shaul@ibm.com <hayimsha@fhe3.haifa.ibm.com>
1 parent 0199a53 commit 32f9f86

File tree

4 files changed

+49
-85
lines changed

4 files changed

+49
-85
lines changed

token/driver/identity.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ type IdentityProvider interface {
2828
// GetSigner returns a Signer for passed identity.
2929
GetSigner(ctx context.Context, identity Identity) (Signer, error)
3030

31-
// RegisterVerifier registers a Verifier for passed identity.
32-
RegisterVerifier(ctx context.Context, identity Identity, v Verifier) error
33-
3431
// RegisterSigner registers a Signer and a Verifier for passed identity.
3532
RegisterSigner(ctx context.Context, identity Identity, signer Signer, verifier Verifier, signerInfo []byte, ephemeral bool) error
3633

token/services/identity/provider.go

Lines changed: 49 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1818
idriver "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/driver"
1919
"github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
20+
cache2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/utils/cache"
2021
"go.uber.org/zap/zapcore"
2122
)
2223

@@ -73,7 +74,6 @@ type Provider struct {
7374

7475
isMeCache cache[bool]
7576
signers cache[*SignerEntry]
76-
verifiers cache[*VerifierEntry]
7777
}
7878

7979
// NewProvider creates a new identity provider implementing the driver.IdentityProvider interface.
@@ -91,9 +91,8 @@ func NewProvider(
9191
enrollmentIDUnmarshaler: enrollmentIDUnmarshaler,
9292
deserializer: deserializer,
9393
storage: storage,
94-
isMeCache: secondcache.NewTyped[bool](5000),
95-
signers: secondcache.NewTyped[*SignerEntry](5000),
96-
verifiers: secondcache.NewTyped[*VerifierEntry](5000),
94+
isMeCache: cache2.NewNoCache[bool](),
95+
signers: secondcache.NewTyped[*SignerEntry](50),
9796
}
9897
}
9998

@@ -113,20 +112,6 @@ func (p *Provider) RegisterIdentityDescriptor(ctx context.Context, identityDescr
113112
return nil
114113
}
115114

116-
func (p *Provider) RegisterVerifier(ctx context.Context, identity driver.Identity, v driver.Verifier) error {
117-
if v == nil {
118-
return errors.New("invalid verifier, expected a valid instance")
119-
}
120-
idHash := identity.UniqueID()
121-
entry := &VerifierEntry{Verifier: v}
122-
if p.Logger.IsEnabledFor(zapcore.DebugLevel) {
123-
entry.DebugStack = debug.Stack()
124-
}
125-
p.verifiers.Add(idHash, entry)
126-
p.Logger.DebugfContext(ctx, "register verifier to [%s]:[%s]", idHash, logging.Identifier(v))
127-
return nil
128-
}
129-
130115
func (p *Provider) RegisterAuditInfo(ctx context.Context, identity driver.Identity, info []byte) error {
131116
return p.storage.StoreIdentityData(ctx, identity, info, nil, nil)
132117
}
@@ -261,55 +246,64 @@ func (p *Provider) areMe(ctx context.Context, identities ...driver.Identity) []s
261246
}
262247

263248
func (p *Provider) getSigner(ctx context.Context, identity driver.Identity, idHash string) (driver.Signer, error) {
264-
// check again the cache
265-
entry, ok := p.signers.Get(idHash)
266-
if ok {
249+
signer, _, err := p.getSignerAndCache(ctx, identity, idHash, true)
250+
return signer, err
251+
}
252+
253+
func (p *Provider) getSignerAndCache(ctx context.Context, identity driver.Identity, idHash string, shouldCache bool) (driver.Signer, bool, error) {
254+
// check cache
255+
if entry, ok := p.signers.Get(idHash); ok {
267256
p.Logger.DebugfContext(ctx, "signer for [%s] found", idHash)
268-
return entry.Signer, nil
257+
return entry.Signer, false, nil
269258
}
270259

271-
p.Logger.DebugfContext(ctx, "signer for [%s] not found, try to deserialize", idHash)
272-
// ask the deserializer
273-
signer, err := p.deserializeSigner(ctx, identity)
274-
if err != nil {
275-
return nil, errors.Wrapf(err, "failed deserializing identity for signer [%s]", identity)
276-
}
277-
entry = &SignerEntry{Signer: signer}
278-
if p.Logger.IsEnabledFor(zapcore.DebugLevel) {
279-
entry.DebugStack = debug.Stack()
280-
}
281-
p.signers.Add(idHash, entry)
282-
if err := p.storage.StoreSignerInfo(ctx, identity, nil); err != nil {
283-
return nil, errors.Wrap(err, "failed to store entry in storage for the passed signer")
284-
}
285-
return entry.Signer, nil
286-
}
260+
p.Logger.DebugfContext(ctx, "signer for [%s] not found, attempting to deserialize", idHash)
287261

288-
func (p *Provider) deserializeSigner(ctx context.Context, identity driver.Identity) (driver.Signer, error) {
262+
// check that we have a deserializer
289263
if p.deserializer == nil {
290-
return nil, errors.Errorf("cannot find signer for [%s], no deserializer set", identity)
264+
return nil, false, errors.Errorf("cannot find signer for [%s], no deserializer set", identity)
291265
}
292-
var err error
266+
267+
// try direct deserialization
293268
signer, err := p.deserializer.DeserializeSigner(ctx, identity)
294-
if err == nil {
295-
return signer, nil
296-
}
269+
if err != nil {
270+
// second chance: try a TypedIdentity
271+
typed, err2 := UnmarshalTypedIdentity(identity)
272+
if err2 != nil {
273+
// neither deserializable nor a typed wrapper
274+
return nil, false, errors.Wrapf(
275+
err2,
276+
"failed to unmarshal typed identity for [%s] and failed deserialization [%s]",
277+
identity.String(), err,
278+
)
279+
}
297280

298-
// give it a second chance
281+
if typed.Type == "x509" {
282+
shouldCache = false
283+
}
299284

300-
// is the identity wrapped in TypedIdentity?
301-
ro, err2 := UnmarshalTypedIdentity(identity)
302-
if err2 != nil {
303-
// No
304-
return nil, errors.Wrapf(err2, "failed to unmarshal raw owner for identity [%s] and failed deserialization [%s]", identity.String(), err)
285+
// recursively resolve the inner identity
286+
signer, shouldCache, err = p.getSignerAndCache(ctx, typed.Identity, typed.Identity.UniqueID(), shouldCache)
287+
if err != nil {
288+
return nil, false, errors.Wrapf(err, "failed getting signer for identity [%s]", typed.Identity)
289+
}
305290
}
306291

307-
// yes, check ro.Identity
308-
signer, err = p.getSigner(ctx, ro.Identity, ro.Identity.UniqueID())
309-
if err != nil {
310-
return nil, errors.Wrapf(err, "failed getting signer for identity [%s]", ro.Identity)
292+
// Cache the signer for the current idHash
293+
if shouldCache {
294+
entry := &SignerEntry{Signer: signer}
295+
if p.Logger.IsEnabledFor(zapcore.DebugLevel) {
296+
entry.DebugStack = debug.Stack()
297+
}
298+
p.signers.Add(idHash, entry)
311299
}
312-
return signer, nil
300+
301+
// Persist signer info for the current identity
302+
if err := p.storage.StoreSignerInfo(ctx, identity, nil); err != nil {
303+
return nil, false, errors.Wrap(err, "failed to store entry in storage for the passed signer")
304+
}
305+
306+
return signer, shouldCache, nil
313307
}
314308

315309
func (p *Provider) updateCaches(descriptor *idriver.IdentityDescriptor, alias driver.Identity) {
@@ -331,15 +325,4 @@ func (p *Provider) updateCaches(descriptor *idriver.IdentityDescriptor, alias dr
331325
p.signers.Add(aliasID, entry)
332326
}
333327
}
334-
// verifiers
335-
if descriptor.Verifier != nil {
336-
entry := &VerifierEntry{Verifier: descriptor.Verifier}
337-
if p.Logger.IsEnabledFor(zapcore.DebugLevel) {
338-
entry.DebugStack = debug.Stack()
339-
}
340-
p.verifiers.Add(id, entry)
341-
if setAlias {
342-
p.verifiers.Add(aliasID, entry)
343-
}
344-
}
345328
}

token/services/identity/wallet/service.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,6 @@ func (s *Service) RegisterRecipientIdentity(ctx context.Context, data *driver.Re
115115
return errors.Wrapf(err, "failed to match identity to audit infor for [%s]:[%s]", data.Identity, utils.Hashable(data.AuditInfo))
116116
}
117117

118-
// register verifier and audit info
119-
v, err := s.Deserializer.GetOwnerVerifier(ctx, data.Identity)
120-
if err != nil {
121-
return errors.Wrapf(err, "failed getting verifier for owner [%s]", data.Identity)
122-
}
123-
if err := s.IdentityProvider.RegisterVerifier(ctx, data.Identity, v); err != nil {
124-
return errors.Wrapf(err, "failed registering verifier for owner [%s]", data.Identity)
125-
}
126118
if err := s.IdentityProvider.RegisterRecipientData(ctx, data); err != nil {
127119
return errors.Wrapf(err, "failed registering audit info for owner [%s]", data.Identity)
128120
}

token/services/identity/wallet/wallets.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,6 @@ func (w *AnonymousOwnerWallet) RegisterRecipient(ctx context.Context, data *driv
346346
if err != nil {
347347
return errors.Wrapf(err, "failed to match identity to audit infor for [%s]:[%s]", data.Identity, utils.Hashable(data.AuditInfo))
348348
}
349-
// register verifier and audit info
350-
v, err := w.Deserializer.GetOwnerVerifier(ctx, data.Identity)
351-
if err != nil {
352-
return errors.Wrapf(err, "failed getting verifier for owner [%s]", data.Identity)
353-
}
354-
if err := w.IdentityProvider.RegisterVerifier(ctx, data.Identity, v); err != nil {
355-
return errors.Wrapf(err, "failed registering verifier for owner [%s]", data.Identity)
356-
}
357349
if err := w.IdentityProvider.RegisterRecipientData(ctx, data); err != nil {
358350
return errors.Wrapf(err, "failed registering audit info for owner [%s]", data.Identity)
359351
}

0 commit comments

Comments
 (0)