Skip to content

Commit

Permalink
add index for user filter
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Richter <crichter@owncloud.com>
  • Loading branch information
dragonchaser committed Jul 5, 2022
1 parent a5318e5 commit 06302f7
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 2 deletions.
3 changes: 3 additions & 0 deletions internal/grpc/services/gateway/storageprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,9 @@ func (s *svc) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSp
filters["owner_id"] = f.GetOwner().OpaqueId
case provider.ListStorageSpacesRequest_Filter_TYPE_SPACE_TYPE:
filters["space_type"] = f.GetSpaceType()
case provider.ListStorageSpacesRequest_Filter_TYPE_USER:
filters["user_idp"] = f.GetUser().GetIdp()
filters["user_id"] = f.GetUser().GetOpaqueId()
default:
return &provider.ListStorageSpacesResponse{
Status: status.NewInvalidArg(ctx, fmt.Sprintf("unknown filter %v", f.Type)),
Expand Down
11 changes: 11 additions & 0 deletions pkg/storage/registry/spaces/spaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,17 @@ func (r *registry) buildFilters(filterMap map[string]string) []*providerpb.ListS
})
}
}
if filterMap["user_id"] != "" && filterMap["user_idp"] != "" {
filters = append(filters, &providerpb.ListStorageSpacesRequest_Filter{
Type: providerpb.ListStorageSpacesRequest_Filter_TYPE_USER,
Term: &providerpb.ListStorageSpacesRequest_Filter_User{
User: &userpb.UserId{
Idp: filterMap["user_idp"],
OpaqueId: filterMap["user_id"],
},
},
})
}
if filterMap["owner_id"] != "" && filterMap["owner_idp"] != "" {
filters = append(filters, &providerpb.ListStorageSpacesRequest_Filter{
Type: providerpb.ListStorageSpacesRequest_Filter_TYPE_OWNER,
Expand Down
2 changes: 1 addition & 1 deletion pkg/storage/utils/decomposedfs/grants.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ func (fs *Decomposedfs) storeGrant(ctx context.Context, n *node.Node, g *provide

// when a grant is added to a space, do not add a new space under "shares"
if spaceGrant := ctx.Value(utils.SpaceGrant); spaceGrant == nil {
err := fs.linkStorageSpaceType(ctx, spaceTypeShare, n.ID)
err := fs.updateIndexes(ctx, g.GetGrantee().GetUserId().GetOpaqueId(), spaceTypeShare, n.ID)
if err != nil {
return err
}
Expand Down
43 changes: 42 additions & 1 deletion pkg/storage/utils/decomposedfs/spaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func (fs *Decomposedfs) CreateStorageSpace(ctx context.Context, req *provider.Cr
}
}

err = fs.linkStorageSpaceType(ctx, req.Type, root.ID)
err = fs.updateIndexes(ctx, req.GetOwner().GetId().GetOpaqueId(), req.Type, root.ID)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -250,6 +250,7 @@ func (fs *Decomposedfs) ListStorageSpaces(ctx context.Context, filter []*provide
var (
spaceID = spaceIDAny
nodeID = spaceIDAny
userID = ctxpkg.ContextMustGetUser(ctx).GetId().GetOpaqueId()
)

spaceTypes := []string{}
Expand All @@ -270,6 +271,10 @@ func (fs *Decomposedfs) ListStorageSpaces(ctx context.Context, filter []*provide
if strings.Contains(nodeID, "/") {
return []*provider.StorageSpace{}, nil
}

case provider.ListStorageSpacesRequest_Filter_TYPE_USER:
// TODO: refactor this to GetUserId() in cs3
userID = filter[i].GetUser()
}
}
if len(spaceTypes) == 0 {
Expand Down Expand Up @@ -552,7 +557,43 @@ func (fs *Decomposedfs) DeleteStorageSpace(ctx context.Context, req *provider.De
return n.SetDTime(&dtime)
}

func (fs *Decomposedfs) updateIndexes(ctx context.Context, userID, spaceType, spaceID string) error {
err := fs.linkStorageSpaceType(ctx, spaceType, spaceID)
if err != nil {
return err
}
return fs.linkSpaceByUser(ctx, userID, spaceID)
}

func (fs *Decomposedfs) linkSpaceByUser(ctx context.Context, userID, spaceID string) error {
if userID == "" {
return nil
}
// create user index dir
if err := os.MkdirAll(filepath.Join(fs.o.Root, "indexes", "by-user-id", userID), 0700); err != nil {
return err
}

err := os.Symlink("../../../spaces/"+lookup.Pathify(spaceID, 1, 2)+"/nodes/"+lookup.Pathify(spaceID, 4, 2), filepath.Join(fs.o.Root, "indexes/by-user-id", userID, spaceID))
if err != nil {
if isAlreadyExists(err) {
appctx.GetLogger(ctx).Debug().Err(err).Str("space", spaceID).Str("indexes/by-user-id", userID).Msg("symlink already exists")
// FIXME: is it ok to wipe this err if the symlink already exists?
err = nil
} else {
// TODO how should we handle error cases here?
appctx.GetLogger(ctx).Error().Err(err).Str("space", spaceID).Str("indexes/by-user-id", userID).Msg("could not create symlink")
}
}
return nil
}

// TODO: implement linkSpaceByGroup

func (fs *Decomposedfs) linkStorageSpaceType(ctx context.Context, spaceType string, spaceID string) error {
if spaceType == "" {
return nil
}
// create space type dir
if err := os.MkdirAll(filepath.Join(fs.o.Root, "spacetypes", spaceType), 0700); err != nil {
return err
Expand Down

0 comments on commit 06302f7

Please sign in to comment.