From dfaec664c062bcfafecc92c50bc31dfc0da51086 Mon Sep 17 00:00:00 2001 From: Ralf Haferkamp Date: Thu, 8 Jun 2023 17:58:00 +0200 Subject: [PATCH] Bump reva to latest edge https://github.com/cs3org/reva/pull/3960 https://github.com/cs3org/reva/pull/3959 https://github.com/cs3org/reva/pull/3955 --- go.mod | 2 +- go.sum | 4 +- .../v2/pkg/share/manager/jsoncs3/jsoncs3.go | 74 +++++++++++++++---- .../jsoncs3/providercache/providercache.go | 8 ++ .../receivedsharecache/receivedsharecache.go | 8 ++ .../manager/jsoncs3/sharecache/sharecache.go | 7 ++ .../cs3org/reva/v2/pkg/share/share.go | 7 +- .../reva/v2/pkg/storage/utils/metadata/cs3.go | 25 ++----- vendor/modules.txt | 2 +- 9 files changed, 98 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 7ec2524a42e..55e2ced670a 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/coreos/go-oidc v2.2.1+incompatible github.com/coreos/go-oidc/v3 v3.6.0 github.com/cs3org/go-cs3apis v0.0.0-20230516150832-730ac860c71d - github.com/cs3org/reva/v2 v2.14.1-0.20230607220921-238a03c2f795 + github.com/cs3org/reva/v2 v2.14.1-0.20230608155229-cf1aa9641f93 github.com/disintegration/imaging v1.6.2 github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e github.com/egirna/icap-client v0.1.1 diff --git a/go.sum b/go.sum index f7e567be78a..5db8a5bbf84 100644 --- a/go.sum +++ b/go.sum @@ -629,8 +629,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.13 h1:TYHggH/hwP7eArqiXSJUvtOPNzQDyQ7vwmwEqlFWhMc= github.com/crewjam/saml v0.4.13/go.mod h1:igEejV+fihTIlHXYP8zOec3V5A8y3lws5bQBFsTm4gA= -github.com/cs3org/reva/v2 v2.14.1-0.20230607220921-238a03c2f795 h1:uyzA03PcmG7mjd+3KJrkws0IXuXQCvHEn25xXBmO2QI= -github.com/cs3org/reva/v2 v2.14.1-0.20230607220921-238a03c2f795/go.mod h1:E32krZG159YflDSjDWfx/QGIC2529PS5LiPnGNHu3d0= +github.com/cs3org/reva/v2 v2.14.1-0.20230608155229-cf1aa9641f93 h1:yRhkp28pdpSbEDX+XQtq5ZiZ8jLMRnmuEKwFj9AlzfY= +github.com/cs3org/reva/v2 v2.14.1-0.20230608155229-cf1aa9641f93/go.mod h1:E32krZG159YflDSjDWfx/QGIC2529PS5LiPnGNHu3d0= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go index 6943605f089..0ac66c9408e 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go @@ -33,6 +33,7 @@ import ( "github.com/mitchellh/mapstructure" "github.com/pkg/errors" "github.com/rs/zerolog/log" + "go.opentelemetry.io/otel/codes" "golang.org/x/sync/errgroup" "google.golang.org/genproto/protobuf/field_mask" @@ -230,8 +231,11 @@ func New(s metadata.Storage, gc gatewayv1beta1.GatewayAPIClient, ttlSeconds int, }, nil } -func (m *Manager) initialize() error { +func (m *Manager) initialize(ctx context.Context) error { + _, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "initialize") + defer span.End() if m.initialized { + span.SetStatus(codes.Ok, "already initialized") return nil } @@ -239,29 +243,39 @@ func (m *Manager) initialize() error { defer m.Unlock() if m.initialized { // check if initialization happened while grabbing the lock + span.SetStatus(codes.Ok, "initialized while grabbing lock") return nil } - ctx := context.Background() + ctx = context.Background() err := m.storage.Init(ctx, "jsoncs3-share-manager-metadata") if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } err = m.storage.MakeDirIfNotExist(ctx, "storages") if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } err = m.storage.MakeDirIfNotExist(ctx, "users") if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } err = m.storage.MakeDirIfNotExist(ctx, "groups") if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } m.initialized = true + span.SetStatus(codes.Ok, "initialized") return nil } @@ -269,7 +283,9 @@ func (m *Manager) initialize() error { func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *collaboration.ShareGrant) (*collaboration.Share, error) { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Share") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } @@ -280,7 +296,10 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla // TODO: should this not already be caught at the gw level? if g.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && (utils.UserEqual(g.Grantee.GetUserId(), user.Id) || utils.UserEqual(g.Grantee.GetUserId(), md.Owner)) { - return nil, errtypes.BadRequest("jsoncs3: owner/creator and grantee are the same") + err := errtypes.BadRequest("jsoncs3: owner/creator and grantee are the same") + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) + return nil, err } // check if share already exists. @@ -295,7 +314,10 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla _, err := m.getByKey(ctx, key) if err == nil { // share already exists - return nil, errtypes.AlreadyExists(key.String()) + err := errtypes.AlreadyExists(key.String()) + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) + return nil, err } shareID := shareid.Encode(md.GetId().GetStorageId(), md.GetId().GetSpaceId(), uuid.NewString()) @@ -316,24 +338,32 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla err = m.Cache.Add(ctx, md.Id.StorageId, md.Id.SpaceId, shareID, s) if _, ok := err.(errtypes.IsPreconditionFailed); ok { if err := m.Cache.Sync(ctx, md.Id.StorageId, md.Id.SpaceId); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } err = m.Cache.Add(ctx, md.Id.StorageId, md.Id.SpaceId, shareID, s) // TODO try more often? } if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } err = m.CreatedCache.Add(ctx, s.GetCreator().GetOpaqueId(), shareID) if _, ok := err.(errtypes.IsPreconditionFailed); ok { if err := m.CreatedCache.Sync(ctx, s.GetCreator().GetOpaqueId()); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } err = m.CreatedCache.Add(ctx, s.GetCreator().GetOpaqueId(), shareID) // TODO try more often? } if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } @@ -350,12 +380,16 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla err = m.UserReceivedStates.Add(ctx, userid, spaceID, rs) if _, ok := err.(errtypes.IsPreconditionFailed); ok { if err := m.UserReceivedStates.Sync(ctx, s.GetCreator().GetOpaqueId()); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } err = m.UserReceivedStates.Add(ctx, userid, spaceID, rs) // TODO try more often? } if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } case provider.GranteeType_GRANTEE_TYPE_GROUP: @@ -363,16 +397,21 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla err := m.GroupReceivedCache.Add(ctx, groupid, shareID) if _, ok := err.(errtypes.IsPreconditionFailed); ok { if err := m.GroupReceivedCache.Sync(ctx, groupid); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } err = m.GroupReceivedCache.Add(ctx, groupid, shareID) // TODO try more often? } if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } } + span.SetStatus(codes.Ok, "") return s, nil } @@ -425,7 +464,7 @@ func (m *Manager) get(ctx context.Context, ref *collaboration.ShareReference) (s func (m *Manager) GetShare(ctx context.Context, ref *collaboration.ShareReference) (*collaboration.Share, error) { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "GetShare") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -478,7 +517,7 @@ func (m *Manager) Unshare(ctx context.Context, ref *collaboration.ShareReference ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Unshare") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return err } @@ -504,7 +543,7 @@ func (m *Manager) UpdateShare(ctx context.Context, ref *collaboration.ShareRefer ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "UpdateShare") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -586,7 +625,7 @@ func (m *Manager) ListShares(ctx context.Context, filters []*collaboration.Filte ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "ListShares") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -622,6 +661,8 @@ func (m *Manager) listSharesByIDs(ctx context.Context, user *userv1beta1.User, f for spaceID := range spaces { err := m.Cache.Sync(ctx, providerID, spaceID) if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } @@ -669,6 +710,7 @@ func (m *Manager) listSharesByIDs(ctx context.Context, user *userv1beta1.User, f } } } + span.SetStatus(codes.Ok, "") return ss, nil } @@ -679,6 +721,8 @@ func (m *Manager) listCreatedShares(ctx context.Context, user *userv1beta1.User, var ss []*collaboration.Share if err := m.CreatedCache.Sync(ctx, user.Id.OpaqueId); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return ss, err } for ssid, spaceShareIDs := range m.CreatedCache.List(user.Id.OpaqueId) { @@ -718,6 +762,7 @@ func (m *Manager) listCreatedShares(ctx context.Context, user *userv1beta1.User, } } + span.SetStatus(codes.Ok, "") return ss, nil } @@ -726,7 +771,7 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "ListReceivedShares") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -870,9 +915,12 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati } if err := g.Wait(); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return nil, err } + span.SetStatus(codes.Ok, "") return rss, nil } @@ -899,7 +947,7 @@ func (m *Manager) convert(ctx context.Context, userID string, s *collaboration.S // GetReceivedShare returns the information for a received share. func (m *Manager) GetReceivedShare(ctx context.Context, ref *collaboration.ShareReference) (*collaboration.ReceivedShare, error) { - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -944,7 +992,7 @@ func (m *Manager) UpdateReceivedShare(ctx context.Context, receivedShare *collab ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "UpdateReceivedShare") defer span.End() - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return nil, err } @@ -997,7 +1045,7 @@ func updateShareID(share *collaboration.Share) { // Load imports shares and received shares from channels (e.g. during migration) func (m *Manager) Load(ctx context.Context, shareChan <-chan *collaboration.Share, receivedShareChan <-chan share.ReceivedShareWithUser) error { log := appctx.GetLogger(ctx) - if err := m.initialize(); err != nil { + if err := m.initialize(ctx); err != nil { return err } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go index 2fc4ed18262..75b98be1443 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go @@ -168,6 +168,7 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, span.SetAttributes(attribute.String("cs3.storageid", storageID), attribute.String("cs3.spaceid", spaceID)) if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { + span.SetStatus(codes.Ok, "no shares in provider or space") return nil } @@ -178,11 +179,15 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, createdBytes, err := json.Marshal(c.Providers[storageID].Spaces[spaceID]) if err != nil { c.Providers[storageID].Spaces[spaceID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } jsonPath := spaceJSONPath(storageID, spaceID) if err := c.storage.MakeDirIfNotExist(ctx, path.Dir(jsonPath)); err != nil { c.Providers[storageID].Spaces[spaceID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } @@ -192,8 +197,11 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, IfUnmodifiedSince: c.Providers[storageID].Spaces[spaceID].Mtime, }); err != nil { c.Providers[storageID].Spaces[spaceID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } + span.SetStatus(codes.Ok, "") return nil } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go index c58e761d86f..5e24c6007a4 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go @@ -179,6 +179,7 @@ func (c *Cache) Persist(ctx context.Context, userID string) error { span.SetAttributes(attribute.String("cs3.userid", userID)) if c.ReceivedSpaces[userID] == nil { + span.SetStatus(codes.Ok, "no received shares") return nil } @@ -188,11 +189,15 @@ func (c *Cache) Persist(ctx context.Context, userID string) error { createdBytes, err := json.Marshal(c.ReceivedSpaces[userID]) if err != nil { c.ReceivedSpaces[userID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } jsonPath := userJSONPath(userID) if err := c.storage.MakeDirIfNotExist(ctx, path.Dir(jsonPath)); err != nil { c.ReceivedSpaces[userID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } @@ -202,8 +207,11 @@ func (c *Cache) Persist(ctx context.Context, userID string) error { IfUnmodifiedSince: c.ReceivedSpaces[userID].Mtime, }); err != nil { c.ReceivedSpaces[userID].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } + span.SetStatus(codes.Ok, "") return nil } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go index 78ed5aacca0..fa221b3031e 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go @@ -217,11 +217,15 @@ func (c *Cache) Persist(ctx context.Context, userid string) error { createdBytes, err := json.Marshal(c.UserShares[userid]) if err != nil { c.UserShares[userid].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } jsonPath := c.userCreatedPath(userid) if err := c.storage.MakeDirIfNotExist(ctx, path.Dir(jsonPath)); err != nil { c.UserShares[userid].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } @@ -231,8 +235,11 @@ func (c *Cache) Persist(ctx context.Context, userid string) error { IfUnmodifiedSince: c.UserShares[userid].Mtime, }); err != nil { c.UserShares[userid].Mtime = oldMtime + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) return err } + span.SetStatus(codes.Ok, "") return nil } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/share.go b/vendor/github.com/cs3org/reva/v2/pkg/share/share.go index 67e58ab0d6d..3fb48c3b09d 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/share.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/share.go @@ -242,6 +242,9 @@ func FilterFiltersByType(f []*collaboration.Filter, t collaboration.Filter_Type) // IsExpired tests whether a share is expired func IsExpired(s *collaboration.Share) bool { - expiration := time.Unix(int64(s.Expiration.GetSeconds()), int64(s.Expiration.GetNanos())) - return s.Expiration != nil && expiration.Before(time.Now()) + if e := s.GetExpiration(); e != nil { + expiration := time.Unix(int64(e.Seconds), int64(e.Nanos)) + return expiration.Before(time.Now()) + } + return false } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go index a536f9284e3..d271b7e778a 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go @@ -396,36 +396,21 @@ func (cs3 *CS3) MakeDirIfNotExist(ctx context.Context, folder string) error { Path: utils.MakeRelativePath(folder), } - resp, err := client.Stat(ctx, &provider.StatRequest{ + resp, err := client.CreateContainer(ctx, &provider.CreateContainerRequest{ Ref: rootPathRef, }) - - if err != nil { - return err - } - switch { case err != nil: return err case resp.Status.Code == rpc.Code_CODE_OK: // nothing to do in this case - case resp.Status.Code == rpc.Code_CODE_NOT_FOUND: - r, err := client.CreateContainer(ctx, &provider.CreateContainerRequest{ - Ref: rootPathRef, - }) - - if err != nil { - return err - } - - if r.Status.Code != rpc.Code_CODE_OK { - return errtypes.NewErrtypeFromStatus(r.Status) - } + return nil + case resp.Status.Code == rpc.Code_CODE_ALREADY_EXISTS: + // nothing to do in this case + return nil default: return errtypes.NewErrtypeFromStatus(resp.Status) } - - return nil } // CreateSymlink creates a symlink diff --git a/vendor/modules.txt b/vendor/modules.txt index 19438ac0074..96b8bc4aaf1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -352,7 +352,7 @@ github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1 github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1 github.com/cs3org/go-cs3apis/cs3/tx/v1beta1 github.com/cs3org/go-cs3apis/cs3/types/v1beta1 -# github.com/cs3org/reva/v2 v2.14.1-0.20230607220921-238a03c2f795 +# github.com/cs3org/reva/v2 v2.14.1-0.20230608155229-cf1aa9641f93 ## explicit; go 1.20 github.com/cs3org/reva/v2/cmd/revad/internal/grace github.com/cs3org/reva/v2/cmd/revad/runtime