From f13e250fc31282f9bfde330d833cf917fdb231e7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 28 Jan 2026 12:09:04 -0800 Subject: [PATCH] S3 Tables: fix gRPC stream loop handling for list operations - Correctly handle io.EOF to terminate loops gracefully. - Propagate other errors to prevent silent failures. - Ensure all list results are processed effectively. --- weed/s3api/s3tables/handler_bucket_get_list_delete.go | 11 +++++++++-- weed/s3api/s3tables/handler_table.go | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/weed/s3api/s3tables/handler_bucket_get_list_delete.go b/weed/s3api/s3tables/handler_bucket_get_list_delete.go index 56bebb49a..830bf9e6c 100644 --- a/weed/s3api/s3tables/handler_bucket_get_list_delete.go +++ b/weed/s3api/s3tables/handler_bucket_get_list_delete.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net/http" "strings" @@ -106,7 +107,10 @@ func (h *S3TablesHandler) handleListTableBuckets(w http.ResponseWriter, r *http. for { entry, respErr := resp.Recv() if respErr != nil { - break + if respErr == io.EOF { + break + } + return respErr } if entry.Entry == nil { continue @@ -219,7 +223,10 @@ func (h *S3TablesHandler) handleDeleteTableBucket(w http.ResponseWriter, r *http for { entry, err := resp.Recv() if err != nil { - break + if err == io.EOF { + break + } + return err } if entry.Entry != nil && !strings.HasPrefix(entry.Entry.Name, ".") { hasChildren = true diff --git a/weed/s3api/s3tables/handler_table.go b/weed/s3api/s3tables/handler_table.go index 01e407622..b8b3540a3 100644 --- a/weed/s3api/s3tables/handler_table.go +++ b/weed/s3api/s3tables/handler_table.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net/http" "strings" "time" @@ -338,7 +339,10 @@ func (h *S3TablesHandler) listTablesInNamespaceWithClient(ctx context.Context, c for { entry, respErr := resp.Recv() if respErr != nil { - break + if respErr == io.EOF { + break + } + return respErr } if entry.Entry == nil { continue @@ -415,7 +419,10 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl for { entry, respErr := resp.Recv() if respErr != nil { - break + if respErr == io.EOF { + break + } + return respErr } if entry.Entry == nil { continue