From 05aca63bc2eca56ee4ab9a628d0eb9ae6fc45a05 Mon Sep 17 00:00:00 2001 From: Michael Barz Date: Thu, 3 Feb 2022 16:52:34 +0100 Subject: [PATCH] invalidate cache when modifying or deleting a space (#2500) --- .../unreleased/invalidate-listproviders-cache.md | 5 +++++ .../grpc/services/gateway/storageprovider.go | 9 +++++++-- .../services/gateway/storageprovidercache.go | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 changelog/unreleased/invalidate-listproviders-cache.md diff --git a/changelog/unreleased/invalidate-listproviders-cache.md b/changelog/unreleased/invalidate-listproviders-cache.md new file mode 100644 index 00000000000..7566c492ba8 --- /dev/null +++ b/changelog/unreleased/invalidate-listproviders-cache.md @@ -0,0 +1,5 @@ +Enhancement: Invalidate listproviders cache + +We now invalidate the related listproviders cache entries when updating or deleting a storage space. + +https://github.com/cs3org/reva/pull/2500 \ No newline at end of file diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index 58c191be8bf..6aebda5f5a2 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -285,7 +285,10 @@ func (s *svc) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorag Status: status.NewStatusFromErrType(ctx, "gateway could not call UpdateStorageSpace", err), }, nil } - s.cache.RemoveStat(ctxpkg.ContextMustGetUser(ctx), res.StorageSpace.Root) + + id := res.StorageSpace.Root + s.cache.RemoveStat(ctxpkg.ContextMustGetUser(ctx), id) + s.cache.RemoveListStorageProviders(id) return res, nil } @@ -322,7 +325,9 @@ func (s *svc) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorag }, nil } - s.cache.RemoveStat(ctxpkg.ContextMustGetUser(ctx), &provider.ResourceId{OpaqueId: req.Id.OpaqueId}) + id := &provider.ResourceId{OpaqueId: req.Id.OpaqueId} + s.cache.RemoveStat(ctxpkg.ContextMustGetUser(ctx), id) + s.cache.RemoveListStorageProviders(id) if dsRes.Status.Code != rpc.Code_CODE_OK { return dsRes, nil diff --git a/internal/grpc/services/gateway/storageprovidercache.go b/internal/grpc/services/gateway/storageprovidercache.go index 3100f126317..6a5ee43028c 100644 --- a/internal/grpc/services/gateway/storageprovidercache.go +++ b/internal/grpc/services/gateway/storageprovidercache.go @@ -128,6 +128,22 @@ func (c Caches) RemoveStat(user *userpb.User, res *provider.ResourceId) { } } +// RemoveListStorageProviders removes a reference from the listproviders cache +func (c Caches) RemoveListStorageProviders(res *provider.ResourceId) { + if res == nil { + return + } + sid := res.StorageId + + cache := c[listproviders] + for _, key := range cache.GetKeys() { + if strings.Contains(key, sid) { + _ = cache.Remove(key) + continue + } + } +} + func initCache(ttlSeconds int) *ttlcache.Cache { cache := ttlcache.NewCache() _ = cache.SetTTL(time.Duration(ttlSeconds) * time.Second)