From 5c0bfa1df97184297e16fa60cfb0938b71111e33 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 23 May 2024 15:04:24 +0200 Subject: [PATCH] feat(blobstore): allow listing Signed-off-by: jkoberg Co-authored-by: dragonchaser Signed-off-by: jkoberg --- .../add-list-method-to-blobsstore.md | 5 ++++ pkg/storage/fs/ocis/blobstore/blobstore.go | 25 +++++++++++++++++++ pkg/storage/fs/s3ng/blobstore/blobstore.go | 16 ++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 changelog/unreleased/add-list-method-to-blobsstore.md diff --git a/changelog/unreleased/add-list-method-to-blobsstore.md b/changelog/unreleased/add-list-method-to-blobsstore.md new file mode 100644 index 00000000000..be97a83dcc9 --- /dev/null +++ b/changelog/unreleased/add-list-method-to-blobsstore.md @@ -0,0 +1,5 @@ +Enhancement: Add List method to ocis and s3ng blobstore + +Allow listing blobstores for maintenance + +https://github.com/cs3org/reva/pull/4696 diff --git a/pkg/storage/fs/ocis/blobstore/blobstore.go b/pkg/storage/fs/ocis/blobstore/blobstore.go index 7afd3eeb550..43dadd4cebf 100644 --- a/pkg/storage/fs/ocis/blobstore/blobstore.go +++ b/pkg/storage/fs/ocis/blobstore/blobstore.go @@ -24,6 +24,7 @@ import ( "io" "os" "path/filepath" + "strings" "github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/lookup" "github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node" @@ -109,6 +110,30 @@ func (bs *Blobstore) Delete(node *node.Node) error { return nil } +// List lists all blobs in the Blobstore +func (bs *Blobstore) List() ([]string, error) { + dirs, err := filepath.Glob(filepath.Join(bs.root, "spaces", "*", "*", "blobs", "*", "*", "*", "*", "*")) + if err != nil { + return nil, err + } + blobids := make([]string, 0, len(dirs)) + for _, d := range dirs { + seps := strings.Split(d, "/") + var b string + var now bool + for _, s := range seps { + if now { + b += s + } + if s == "blobs" { + now = true + } + } + blobids = append(blobids, b) + } + return blobids, nil +} + func (bs *Blobstore) path(node *node.Node) (string, error) { if node.BlobID == "" { return "", fmt.Errorf("blobstore: BlobID is empty") diff --git a/pkg/storage/fs/s3ng/blobstore/blobstore.go b/pkg/storage/fs/s3ng/blobstore/blobstore.go index 48a40b764f0..dcb39b0c4e5 100644 --- a/pkg/storage/fs/s3ng/blobstore/blobstore.go +++ b/pkg/storage/fs/s3ng/blobstore/blobstore.go @@ -127,6 +127,22 @@ func (bs *Blobstore) Delete(node *node.Node) error { return nil } +// List lists all blobs in the Blobstore +func (bs *Blobstore) List() ([]string, error) { + ch := bs.client.ListObjects(context.Background(), bs.bucket, minio.ListObjectsOptions{}) + + var err error + ids := make([]string, 0) + for oi := range ch { + if oi.Err != nil { + err = oi.Err + continue + } + ids = append(ids, oi.Key) + } + return ids, err +} + func (bs *Blobstore) path(node *node.Node) string { // https://aws.amazon.com/de/premiumsupport/knowledge-center/s3-prefix-nested-folders-difference/ // Prefixes are used to partion a bucket. A prefix is everything except the filename.