From 0fac6e39eafd88517be64aca3670471ec8272ca6 Mon Sep 17 00:00:00 2001 From: Lars Lehtonen Date: Thu, 26 Feb 2026 11:12:10 -0800 Subject: [PATCH] weed/s3api/s3tables: fix dropped errors (#8456) * weed/s3api/s3tables: fix dropped errors * enhance errors * fail fast when listing tables --------- Co-authored-by: Chris Lu --- weed/s3api/s3tables/handler_table.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/weed/s3api/s3tables/handler_table.go b/weed/s3api/s3tables/handler_table.go index 5042bcb1d..5a21f2cfb 100644 --- a/weed/s3api/s3tables/handler_table.go +++ b/weed/s3api/s3tables/handler_table.go @@ -499,7 +499,7 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques if err == nil { namespacePolicy = string(policyData) } else if !errors.Is(err, ErrAttributeNotFound) { - return fmt.Errorf("failed to fetch namespace policy: %v", err) + return fmt.Errorf("failed to fetch namespace policy: %w", err) } // Fetch bucket metadata and policy @@ -509,17 +509,17 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques return fmt.Errorf("failed to unmarshal bucket metadata: %w", err) } } else if !errors.Is(err, ErrAttributeNotFound) { - return fmt.Errorf("failed to fetch bucket metadata: %v", err) + return fmt.Errorf("failed to fetch bucket metadata: %w", err) } policyData, err = h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyPolicy) if err == nil { bucketPolicy = string(policyData) } else if !errors.Is(err, ErrAttributeNotFound) { - return fmt.Errorf("failed to fetch bucket policy: %v", err) + return fmt.Errorf("failed to fetch bucket policy: %w", err) } if tags, err := h.readTags(r.Context(), client, bucketPath); err != nil { - return err + return fmt.Errorf("failed to read bucket tags: %w", err) } else if tags != nil { bucketTags = tags } @@ -545,6 +545,9 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques } tables, paginationToken, err = h.listTablesInNamespaceWithClient(r, client, bucketName, namespaceName, req.Prefix, req.ContinuationToken, maxTables) + if err != nil { + return fmt.Errorf("list tables in namespace %v: %w", namespaceName, err) + } } else { // List tables across all namespaces in bucket bucketPath := GetTableBucketPath(bucketName) @@ -555,10 +558,10 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques // Fetch bucket metadata and policy data, err := h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyMetadata) if err != nil { - return err + return fmt.Errorf("failed to fetch bucket metadata: %w", err) } if err := json.Unmarshal(data, &bucketMeta); err != nil { - return err + return fmt.Errorf("failed to unmarshal bucket metadata: %w", err) } // Fetch bucket policy if it exists @@ -566,10 +569,10 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques if err == nil { bucketPolicy = string(policyData) } else if !errors.Is(err, ErrAttributeNotFound) { - return fmt.Errorf("failed to fetch bucket policy: %v", err) + return fmt.Errorf("failed to fetch bucket policy: %w", err) } if tags, err := h.readTags(r.Context(), client, bucketPath); err != nil { - return err + return fmt.Errorf("failed to read bucket tags: %w", err) } else if tags != nil { bucketTags = tags } @@ -586,6 +589,9 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques } tables, paginationToken, err = h.listTablesInAllNamespaces(r, client, bucketName, req.Prefix, req.ContinuationToken, maxTables) + if err != nil { + return fmt.Errorf("list tables in all namespaces: %w", err) + } } return err }) @@ -768,8 +774,7 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(r *http.Request, client file nsTables, nsToken, err := h.listTablesInNamespaceWithClient(r, client, bucketName, namespace, prefix, tableNameFilter, maxTables-len(tables)) if err != nil { - glog.Warningf("S3Tables: failed to list tables in namespace %s/%s: %v", bucketName, namespace, err) - continue + return nil, "", fmt.Errorf("list tables in namespace %s: %w", namespace, err) } tables = append(tables, nsTables...)