diff --git a/weed/s3api/s3tables/handler_bucket_get_list_delete.go b/weed/s3api/s3tables/handler_bucket_get_list_delete.go index 24d9e6199..32e94ff54 100644 --- a/weed/s3api/s3tables/handler_bucket_get_list_delete.go +++ b/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") diff --git a/weed/s3api/s3tables/handler_namespace.go b/weed/s3api/s3tables/handler_namespace.go index df92bf9dd..1b3a01de4 100644 --- a/weed/s3api/s3tables/handler_namespace.go +++ b/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") diff --git a/weed/s3api/s3tables/handler_table.go b/weed/s3api/s3tables/handler_table.go index 68189d844..dc059d8f1 100644 --- a/weed/s3api/s3tables/handler_table.go +++ b/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