Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

move stat out of usershareprovider #2885

Merged
merged 2 commits into from
May 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions changelog/unreleased/move-stat-out-of-usershareprovider.md
Original file line number Diff line number Diff line change
@@ -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
45 changes: 0 additions & 45 deletions internal/grpc/services/gateway/usershareprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ package gateway

import (
"context"
"encoding/json"
"path"

rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
Expand All @@ -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"
Expand Down Expand Up @@ -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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ package sharesstorageprovider

import (
"context"
"encoding/json"
"fmt"
"path/filepath"
"strings"
Expand Down Expand Up @@ -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) {
Expand Down