diff --git a/changelog/unreleased/move-stat-out-of-usershareprovider.md b/changelog/unreleased/move-stat-out-of-usershareprovider.md new file mode 100644 index 0000000000..8ffe930a2e --- /dev/null +++ b/changelog/unreleased/move-stat-out-of-usershareprovider.md @@ -0,0 +1,5 @@ +Bugfix: Move stat out of usershareprovider + +The sharesstorageprovider now only stats the acceptet shares when necessary. + +https://github.com/cs3org/reva/pull/2885 diff --git a/internal/grpc/services/gateway/usershareprovider.go b/internal/grpc/services/gateway/usershareprovider.go index fae6e441f0..f14200f57b 100644 --- a/internal/grpc/services/gateway/usershareprovider.go +++ b/internal/grpc/services/gateway/usershareprovider.go @@ -20,7 +20,6 @@ package gateway import ( "context" - "encoding/json" "path" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" @@ -32,7 +31,6 @@ import ( "github.com/cs3org/reva/v2/pkg/errtypes" "github.com/cs3org/reva/v2/pkg/rgrpc/status" "github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool" - "github.com/cs3org/reva/v2/pkg/share" "github.com/cs3org/reva/v2/pkg/storage/utils/grants" "github.com/cs3org/reva/v2/pkg/storagespace" rtrace "github.com/cs3org/reva/v2/pkg/trace" @@ -164,49 +162,6 @@ func (s *svc) ListReceivedShares(ctx context.Context, req *collaboration.ListRec if err != nil { return nil, errors.Wrap(err, "gateway: error calling ListReceivedShares") } - - // TODO: This is a hack for now. - // Can we do that cleaner somehow? - // The `ListStorageSpaces` method in sharesstorageprovider/sharesstorageprovider.go needs the etags. - shareMetaData := make(map[string]share.Metadata, len(res.Shares)) - for _, rs := range res.Shares { - // FIXME: usershareprovider should not stat resources - sRes, err := s.Stat(ctx, &provider.StatRequest{Ref: &provider.Reference{ResourceId: rs.Share.ResourceId}}) - if err != nil { - logger.Error(). - Err(err). - Interface("resourceID", rs.Share.ResourceId). - Msg("ListRecievedShares: failed to stat the resource") - continue - } - if sRes.Status.Code != rpc.Code_CODE_OK { - logger.Error(). - Interface("resourceID", rs.Share.ResourceId). - Msg("ListRecievedShares: failed to stat the resource") - continue - } - shareMetaData[rs.Share.Id.OpaqueId] = share.Metadata{ETag: sRes.Info.Etag, Mtime: sRes.Info.Mtime} - } - - marshalled, err := json.Marshal(shareMetaData) - if err != nil { - logger.Error(). - Err(err). - Msg("ListRecievedShares: failed marshal share etags") - } else { - opaque := res.Opaque - if opaque == nil { - opaque = &typesv1beta1.Opaque{ - Map: map[string]*typesv1beta1.OpaqueEntry{}, - } - } - opaque.Map["shareMetadata"] = &typesv1beta1.OpaqueEntry{ - Decoder: "json", - Value: marshalled, - } - res.Opaque = opaque - } - return res, nil } diff --git a/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go b/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go index be82e388ab..1342ff46bf 100644 --- a/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go +++ b/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go @@ -20,7 +20,6 @@ package sharesstorageprovider import ( "context" - "encoding/json" "fmt" "path/filepath" "strings" @@ -1025,16 +1024,32 @@ func (s *service) fetchShares(ctx context.Context) ([]*collaboration.ReceivedSha if lsRes.Status.Code != rpc.Code_CODE_OK { return nil, nil, fmt.Errorf("sharesstorageprovider: error calling ListReceivedSharesRequest") } - receivedShares := lsRes.Shares - var shareMd map[string]share.Metadata - if lsRes.Opaque != nil { - if entry, ok := lsRes.Opaque.Map["shareMetadata"]; ok { - // If we can't get the etags thats fine, just continue. - _ = json.Unmarshal(entry.Value, &shareMd) + shareMetaData := make(map[string]share.Metadata, len(lsRes.Shares)) + for _, rs := range lsRes.Shares { + // only stat accepted shares + if rs.State != collaboration.ShareState_SHARE_STATE_ACCEPTED { + continue + } + sRes, err := s.Stat(ctx, &provider.StatRequest{Ref: &provider.Reference{ResourceId: rs.Share.ResourceId}}) + if err != nil { + appctx.GetLogger(ctx).Error(). + Err(err). + Interface("resourceID", rs.Share.ResourceId). + Msg("ListRecievedShares: failed to make stat call") + continue + } + if sRes.Status.Code != rpc.Code_CODE_OK { + appctx.GetLogger(ctx).Debug(). + Interface("resourceID", rs.Share.ResourceId). + Interface("status", sRes.Status). + Msg("ListRecievedShares: failed to stat the resource") + continue } + shareMetaData[rs.Share.Id.OpaqueId] = share.Metadata{ETag: sRes.Info.Etag, Mtime: sRes.Info.Mtime} } - return receivedShares, shareMd, nil + + return lsRes.Shares, shareMetaData, nil } func findEarliestShare(receivedShares []*collaboration.ReceivedShare, shareMd map[string]share.Metadata) (earliestShare *collaboration.Share, atLeastOneAccepted bool) {