Browse Source

s3tables: fix pagination and enhance error handling in list/delete operations

- Fix InclusiveStartFrom logic to ensure exclusive start on continued pages
- Prevent duplicates in bucket, namespace, and table listings
- Fail fast on listing errors during bucket and namespace deletion
- Stop swallowing errors in handleListTables and return proper HTTP error responses
pull/8147/head
Chris Lu 4 days ago
parent
commit
2c551dad5d
  1. 9
      weed/s3api/s3tables/handler_bucket_get_list_delete.go
  2. 10
      weed/s3api/s3tables/handler_namespace.go
  3. 13
      weed/s3api/s3tables/handler_table.go

9
weed/s3api/s3tables/handler_bucket_get_list_delete.go

@ -85,7 +85,7 @@ func (h *S3TablesHandler) handleListTableBuckets(w http.ResponseWriter, r *http.
Directory: TablesPath,
Limit: uint32(maxBuckets * 2), // Fetch more than needed to account for filtering
StartFromFileName: lastFileName,
InclusiveStartFrom: lastFileName != "",
InclusiveStartFrom: lastFileName == "",
})
if err != nil {
return err
@ -216,6 +216,13 @@ func (h *S3TablesHandler) handleDeleteTableBucket(w http.ResponseWriter, r *http
return nil
})
if err != nil {
if !errors.Is(err, ErrNotFound) {
h.writeError(w, http.StatusInternalServerError, ErrCodeInternalError, fmt.Sprintf("failed to list bucket entries: %v", err))
return err
}
}
if hasChildren {
h.writeError(w, http.StatusConflict, ErrCodeBucketNotEmpty, "table bucket is not empty")
return fmt.Errorf("bucket not empty")

10
weed/s3api/s3tables/handler_namespace.go

@ -2,6 +2,7 @@ package s3tables
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
@ -197,7 +198,7 @@ func (h *S3TablesHandler) handleListNamespaces(w http.ResponseWriter, r *http.Re
Directory: bucketPath,
Limit: uint32(maxNamespaces * 2),
StartFromFileName: lastFileName,
InclusiveStartFrom: lastFileName != "",
InclusiveStartFrom: lastFileName == "",
})
if err != nil {
return err
@ -319,6 +320,13 @@ func (h *S3TablesHandler) handleDeleteNamespace(w http.ResponseWriter, r *http.R
return nil
})
if err != nil {
if !errors.Is(err, ErrNotFound) {
h.writeError(w, http.StatusInternalServerError, ErrCodeInternalError, fmt.Sprintf("failed to list namespace entries: %v", err))
return err
}
}
if hasChildren {
h.writeError(w, http.StatusConflict, ErrCodeNamespaceNotEmpty, "namespace is not empty")
return fmt.Errorf("namespace not empty")

13
weed/s3api/s3tables/handler_table.go

@ -144,7 +144,7 @@ func (h *S3TablesHandler) handleCreateTable(w http.ResponseWriter, r *http.Reque
return err
}
tableARN := h.generateTableARN(bucketName, namespaceName, req.Name)
tableARN := h.generateTableARN(bucketName, namespaceName+"/"+req.Name)
resp := &CreateTableResponse{
TableARN: tableARN,
@ -206,7 +206,7 @@ func (h *S3TablesHandler) handleGetTable(w http.ResponseWriter, r *http.Request,
return err
}
tableARN := h.generateTableARN(bucketName, namespace, tableName)
tableARN := h.generateTableARN(bucketName, namespace+"/"+tableName)
resp := &GetTableResponse{
Name: metadata.Name,
@ -266,7 +266,8 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques
}
if err != nil {
tables = []TableSummary{}
h.writeError(w, http.StatusInternalServerError, ErrCodeInternalError, fmt.Sprintf("failed to list tables: %v", err))
return err
}
resp := &ListTablesResponse{
@ -286,7 +287,7 @@ func (h *S3TablesHandler) listTablesInNamespaceWithClient(ctx context.Context, c
Directory: namespacePath,
Limit: uint32(maxTables * 2),
StartFromFileName: lastFileName,
InclusiveStartFrom: lastFileName != "",
InclusiveStartFrom: lastFileName == "",
})
if err != nil {
return err
@ -326,7 +327,7 @@ func (h *S3TablesHandler) listTablesInNamespaceWithClient(ctx context.Context, c
continue
}
tableARN := h.generateTableARN(bucketName, namespace, entry.Entry.Name)
tableARN := h.generateTableARN(bucketName, namespace+"/"+entry.Entry.Name)
*tables = append(*tables, TableSummary{
Name: metadata.Name,
@ -360,7 +361,7 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl
Directory: bucketPath,
Limit: 100,
StartFromFileName: lastFileName,
InclusiveStartFrom: lastFileName != "",
InclusiveStartFrom: lastFileName == "",
})
if err != nil {
return err

Loading…
Cancel
Save