diff --git a/changelog/unreleased/get-quota-storage-space.md b/changelog/unreleased/get-quota-storage-space.md new file mode 100644 index 00000000000..9fd8208dd1e --- /dev/null +++ b/changelog/unreleased/get-quota-storage-space.md @@ -0,0 +1,7 @@ +Enhancement: Add a reference parameter to the getQuota request + +Implementation of [cs3org/cs3apis#147](https://github.com/cs3org/cs3apis/pull/147) + +Make the cs3apis accept a Reference in the getQuota Request to limit the call to a specific storage space. + +https://github.com/cs3org/reva/issues/2152 \ No newline at end of file diff --git a/go.sum b/go.sum index 2e257cad818..4fed162719c 100644 --- a/go.sum +++ b/go.sum @@ -486,24 +486,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -<<<<<<< HEAD go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0 h1:Wx7nFnvCaissIUZxPkBqDz2963Z+Cl+PkYbDKzTxDqQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= -======= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.24.0 h1:1hCzM7mwQbFQgk3Q4lAVEsGV6NB4Uj6Jt3EU+OiSBc8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.24.0/go.mod h1:O0cG0vP6TP3c323kh70JmeG1jN69Sn9Z5HxgmeASFWY= -go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= ->>>>>>> update cs3apis go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel/exporters/jaeger v1.0.1 h1:fg9udWIWWJMAT+Gq2ATFd/DFy3OZvKEZy9VK2amxvkw= go.opentelemetry.io/otel/exporters/jaeger v1.0.1/go.mod h1:85Ym3qknJdIdfRzYS9Ofy9NeLi9gKPFzFDBEHCKpfXI= go.opentelemetry.io/otel/sdk v1.0.1 h1:wXxFEWGo7XfXupPwVJvTBOaPBC9FEg0wB8hMNrKk+cA= go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= -<<<<<<< HEAD -======= -go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= ->>>>>>> update cs3apis go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= diff --git a/pkg/storage/fs/nextcloud/nextcloud_test.go b/pkg/storage/fs/nextcloud/nextcloud_test.go index 8f660bf6697..6dd00aa0b62 100644 --- a/pkg/storage/fs/nextcloud/nextcloud_test.go +++ b/pkg/storage/fs/nextcloud/nextcloud_test.go @@ -1023,7 +1023,7 @@ var _ = Describe("Nextcloud", func() { mock, teardown := nextcloud.TestingHTTPClient(h) defer teardown() nc.SetHTTPClient(mock) - maxBytes, maxFiles, err := nc.GetQuota(ctx) + maxBytes, maxFiles, err := nc.GetQuota(ctx, nil) Expect(err).ToNot(HaveOccurred()) Expect(maxBytes).To(Equal(uint64(456))) Expect(maxFiles).To(Equal(uint64(123))) diff --git a/pkg/storage/utils/decomposedfs/decomposedfs.go b/pkg/storage/utils/decomposedfs/decomposedfs.go index e88f4fe91b9..c1fffd27a0a 100644 --- a/pkg/storage/utils/decomposedfs/decomposedfs.go +++ b/pkg/storage/utils/decomposedfs/decomposedfs.go @@ -295,7 +295,7 @@ func (fs *Decomposedfs) CreateDir(ctx context.Context, ref *provider.Reference) err = fs.tp.CreateDir(ctx, n) - if fs.o.TreeTimeAccounting { + if fs.o.TreeTimeAccounting || fs.o.TreeSizeAccounting { nodePath := n.InternalPath() // mark the home node as the end of propagation if err = xattr.Set(nodePath, xattrs.PropagationAttr, []byte("1")); err != nil { diff --git a/pkg/storage/utils/decomposedfs/lookup.go b/pkg/storage/utils/decomposedfs/lookup.go index a5285217de9..94379b3012c 100644 --- a/pkg/storage/utils/decomposedfs/lookup.go +++ b/pkg/storage/utils/decomposedfs/lookup.go @@ -49,22 +49,22 @@ func (lu *Lookup) NodeFromResource(ctx context.Context, ref *provider.Reference) if err != nil { return nil, err } - n := spaceRoot - p := filepath.Clean(ref.Path) - if p != "." { - // walk the relative path - n, err = lu.WalkPath(ctx, n, p, false, func(ctx context.Context, n *node.Node) error { - return nil - }) - if err != nil { - return nil, err + // is this a relative reference? + if ref.Path != "" { + p := filepath.Clean(ref.Path) + if p != "." { + // walk the relative path + n, err = lu.WalkPath(ctx, n, p, false, func(ctx context.Context, n *node.Node) error { + return nil + }) + if err != nil { + return nil, err + } } // use reference id as space root for relative references n.SpaceRoot = spaceRoot - return n, nil } - return n, nil } diff --git a/pkg/storage/utils/decomposedfs/node/node.go b/pkg/storage/utils/decomposedfs/node/node.go index a375e79c631..bfac1410d7e 100644 --- a/pkg/storage/utils/decomposedfs/node/node.go +++ b/pkg/storage/utils/decomposedfs/node/node.go @@ -240,9 +240,10 @@ func (n *Node) Child(ctx context.Context, name string) (*Node, error) { if err != nil { if os.IsNotExist(err) || isNotDir(err) { c := &Node{ - lu: n.lu, - ParentID: n.ID, - Name: name, + lu: n.lu, + ParentID: n.ID, + Name: name, + SpaceRoot: n.SpaceRoot, } return c, nil // if the file does not exist we return a node that has Exists = false } @@ -269,8 +270,9 @@ func (n *Node) Parent() (p *Node, err error) { return nil, fmt.Errorf("Decomposedfs: root has no parent") } p = &Node{ - lu: n.lu, - ID: n.ParentID, + lu: n.lu, + ID: n.ParentID, + SpaceRoot: n.SpaceRoot, } parentPath := n.lu.InternalPath(n.ParentID) @@ -612,9 +614,12 @@ func (n *Node) AsResourceInfo(ctx context.Context, rp *provider.ResourcePermissi if n.SpaceRoot != nil { quotaPath = n.SpaceRoot.InternalPath() } else { - sublog.Error().Err(err).Msg("error determining the space root node for quota") + root, err := n.lu.HomeOrRootNode(ctx) + if err != nil { + sublog.Error().Err(err).Msg("error determining the space root node for quota") + } + quotaPath = root.InternalPath() } - quotaPath = n.InternalPath() readQuotaIntoOpaque(ctx, quotaPath, ri) } diff --git a/pkg/storage/utils/decomposedfs/spaces.go b/pkg/storage/utils/decomposedfs/spaces.go index 7bc82296c63..473fdabab66 100644 --- a/pkg/storage/utils/decomposedfs/spaces.go +++ b/pkg/storage/utils/decomposedfs/spaces.go @@ -66,6 +66,14 @@ func (fs *Decomposedfs) CreateStorageSpace(ctx context.Context, req *provider.Cr return nil, err } + // always enable propagation on the storage space root + nodePath := n.InternalPath() + // mark the space root node as the end of propagation + if err = xattr.Set(nodePath, xattrs.PropagationAttr, []byte("1")); err != nil { + appctx.GetLogger(ctx).Error().Err(err).Interface("node", n).Msg("could not mark node to propagate") + return nil, err + } + if err := fs.createHiddenSpaceFolder(ctx, n); err != nil { return nil, err } diff --git a/pkg/storage/utils/decomposedfs/tree/tree.go b/pkg/storage/utils/decomposedfs/tree/tree.go index 6d0da24d001..30752f16cb0 100644 --- a/pkg/storage/utils/decomposedfs/tree/tree.go +++ b/pkg/storage/utils/decomposedfs/tree/tree.go @@ -578,8 +578,12 @@ func (t *Tree) Propagate(ctx context.Context, n *node.Node) (err error) { // is propagation enabled for the parent node? var root *node.Node - if root, err = t.lookup.HomeOrRootNode(ctx); err != nil { - return + if n.SpaceRoot == nil { + if root, err = t.lookup.HomeOrRootNode(ctx); err != nil { + return + } + } else { + root = n.SpaceRoot } // use a sync time and don't rely on the mtime of the current node, as the stat might not change when a rename happened too quickly diff --git a/pkg/storage/utils/decomposedfs/upload.go b/pkg/storage/utils/decomposedfs/upload.go index 1287fdaebc6..31a70c2db69 100644 --- a/pkg/storage/utils/decomposedfs/upload.go +++ b/pkg/storage/utils/decomposedfs/upload.go @@ -252,12 +252,14 @@ func (fs *Decomposedfs) NewUpload(ctx context.Context, info tusd.FileInfo) (uplo } info.Storage = map[string]string{ + // Todo: add storage space root "Type": "OCISStore", "BinPath": binPath, "NodeId": n.ID, "NodeParentId": n.ParentID, "NodeName": n.Name, + "SpaceRoot": n.SpaceRoot.ID, "Idp": usr.Id.Idp, "UserId": usr.Id.OpaqueId, @@ -474,7 +476,9 @@ func (upload *fileUpload) FinishUpload(ctx context.Context) (err error) { nil, upload.fs.lu, ) - + n.SpaceRoot = &node.Node{ + ID: upload.info.Storage["SpaceRoot"], + } if n.ID == "" { n.ID = uuid.New().String() }