From b30631c3b56e8cf634d43e97eb2f5328f27e6260 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 28 Jan 2026 09:38:01 -0800 Subject: [PATCH] s3tables: propagate request context to filer operations --- weed/s3api/s3tables/filer_ops.go | 28 +++++++------- weed/s3api/s3tables/handler_bucket_create.go | 9 ++--- .../handler_bucket_get_list_delete.go | 9 ++--- weed/s3api/s3tables/handler_namespace.go | 19 +++++----- weed/s3api/s3tables/handler_policy.go | 37 ++++++++++--------- weed/s3api/s3tables/handler_table.go | 32 ++++++++-------- 6 files changed, 68 insertions(+), 66 deletions(-) diff --git a/weed/s3api/s3tables/filer_ops.go b/weed/s3api/s3tables/filer_ops.go index 9e9c21bb8..b512ba8c9 100644 --- a/weed/s3api/s3tables/filer_ops.go +++ b/weed/s3api/s3tables/filer_ops.go @@ -11,9 +11,9 @@ import ( // Filer operations - Common functions for interacting with the filer // createDirectory creates a new directory at the specified path -func (h *S3TablesHandler) createDirectory(client filer_pb.SeaweedFilerClient, path string) error { +func (h *S3TablesHandler) createDirectory(ctx context.Context, client filer_pb.SeaweedFilerClient, path string) error { dir, name := splitPath(path) - _, err := client.CreateEntry(context.Background(), &filer_pb.CreateEntryRequest{ + _, err := client.CreateEntry(ctx, &filer_pb.CreateEntryRequest{ Directory: dir, Entry: &filer_pb.Entry{ Name: name, @@ -29,11 +29,11 @@ func (h *S3TablesHandler) createDirectory(client filer_pb.SeaweedFilerClient, pa } // setExtendedAttribute sets an extended attribute on an existing entry -func (h *S3TablesHandler) setExtendedAttribute(client filer_pb.SeaweedFilerClient, path, key string, data []byte) error { +func (h *S3TablesHandler) setExtendedAttribute(ctx context.Context, client filer_pb.SeaweedFilerClient, path, key string, data []byte) error { dir, name := splitPath(path) // First, get the existing entry - resp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + resp, err := client.LookupDirectoryEntry(ctx, &filer_pb.LookupDirectoryEntryRequest{ Directory: dir, Name: name, }) @@ -53,7 +53,7 @@ func (h *S3TablesHandler) setExtendedAttribute(client filer_pb.SeaweedFilerClien entry.Extended[key] = data // Save the updated entry - _, err = client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ + _, err = client.UpdateEntry(ctx, &filer_pb.UpdateEntryRequest{ Directory: dir, Entry: entry, }) @@ -61,9 +61,9 @@ func (h *S3TablesHandler) setExtendedAttribute(client filer_pb.SeaweedFilerClien } // getExtendedAttribute gets an extended attribute from an entry -func (h *S3TablesHandler) getExtendedAttribute(client filer_pb.SeaweedFilerClient, path, key string) ([]byte, error) { +func (h *S3TablesHandler) getExtendedAttribute(ctx context.Context, client filer_pb.SeaweedFilerClient, path, key string) ([]byte, error) { dir, name := splitPath(path) - resp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + resp, err := client.LookupDirectoryEntry(ctx, &filer_pb.LookupDirectoryEntryRequest{ Directory: dir, Name: name, }) @@ -84,11 +84,11 @@ func (h *S3TablesHandler) getExtendedAttribute(client filer_pb.SeaweedFilerClien } // deleteExtendedAttribute deletes an extended attribute from an entry -func (h *S3TablesHandler) deleteExtendedAttribute(client filer_pb.SeaweedFilerClient, path, key string) error { +func (h *S3TablesHandler) deleteExtendedAttribute(ctx context.Context, client filer_pb.SeaweedFilerClient, path, key string) error { dir, name := splitPath(path) // Get the existing entry - resp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + resp, err := client.LookupDirectoryEntry(ctx, &filer_pb.LookupDirectoryEntryRequest{ Directory: dir, Name: name, }) @@ -107,7 +107,7 @@ func (h *S3TablesHandler) deleteExtendedAttribute(client filer_pb.SeaweedFilerCl } // Save the updated entry - _, err = client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ + _, err = client.UpdateEntry(ctx, &filer_pb.UpdateEntryRequest{ Directory: dir, Entry: entry, }) @@ -115,9 +115,9 @@ func (h *S3TablesHandler) deleteExtendedAttribute(client filer_pb.SeaweedFilerCl } // deleteDirectory deletes a directory and all its contents -func (h *S3TablesHandler) deleteDirectory(client filer_pb.SeaweedFilerClient, path string) error { +func (h *S3TablesHandler) deleteDirectory(ctx context.Context, client filer_pb.SeaweedFilerClient, path string) error { dir, name := splitPath(path) - _, err := client.DeleteEntry(context.Background(), &filer_pb.DeleteEntryRequest{ + _, err := client.DeleteEntry(ctx, &filer_pb.DeleteEntryRequest{ Directory: dir, Name: name, IsDeleteData: true, @@ -128,9 +128,9 @@ func (h *S3TablesHandler) deleteDirectory(client filer_pb.SeaweedFilerClient, pa } // entryExists checks if an entry exists at the given path -func (h *S3TablesHandler) entryExists(client filer_pb.SeaweedFilerClient, path string) bool { +func (h *S3TablesHandler) entryExists(ctx context.Context, client filer_pb.SeaweedFilerClient, path string) bool { dir, name := splitPath(path) - resp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + resp, err := client.LookupDirectoryEntry(ctx, &filer_pb.LookupDirectoryEntryRequest{ Directory: dir, Name: name, }) diff --git a/weed/s3api/s3tables/handler_bucket_create.go b/weed/s3api/s3tables/handler_bucket_create.go index b00381263..d146f7907 100644 --- a/weed/s3api/s3tables/handler_bucket_create.go +++ b/weed/s3api/s3tables/handler_bucket_create.go @@ -1,7 +1,6 @@ package s3tables import ( - "context" "encoding/json" "fmt" "net/http" @@ -48,7 +47,7 @@ func (h *S3TablesHandler) handleCreateTableBucket(w http.ResponseWriter, r *http // Check if bucket already exists exists := false err := filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + resp, err := client.LookupDirectoryEntry(r.Context(), &filer_pb.LookupDirectoryEntryRequest{ Directory: TablesPath, Name: req.Name, }) @@ -90,12 +89,12 @@ func (h *S3TablesHandler) handleCreateTableBucket(w http.ResponseWriter, r *http err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { // Create bucket directory - if err := h.createDirectory(client, bucketPath); err != nil { + if err := h.createDirectory(r.Context(), client, bucketPath); err != nil { return err } // Set metadata as extended attribute - if err := h.setExtendedAttribute(client, bucketPath, ExtendedKeyMetadata, metadataBytes); err != nil { + if err := h.setExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyMetadata, metadataBytes); err != nil { return err } @@ -105,7 +104,7 @@ func (h *S3TablesHandler) handleCreateTableBucket(w http.ResponseWriter, r *http if err != nil { return fmt.Errorf("failed to marshal tags: %w", err) } - if err := h.setExtendedAttribute(client, bucketPath, ExtendedKeyTags, tagsBytes); err != nil { + if err := h.setExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyTags, tagsBytes); err != nil { return err } } diff --git a/weed/s3api/s3tables/handler_bucket_get_list_delete.go b/weed/s3api/s3tables/handler_bucket_get_list_delete.go index 22c16adcf..6ec25bd1a 100644 --- a/weed/s3api/s3tables/handler_bucket_get_list_delete.go +++ b/weed/s3api/s3tables/handler_bucket_get_list_delete.go @@ -1,7 +1,6 @@ package s3tables import ( - "context" "encoding/json" "fmt" "net/http" @@ -40,7 +39,7 @@ func (h *S3TablesHandler) handleGetTableBucket(w http.ResponseWriter, r *http.Re var metadata tableBucketMetadata err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, bucketPath, ExtendedKeyMetadata) + data, err := h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyMetadata) if err != nil { return err } @@ -79,7 +78,7 @@ func (h *S3TablesHandler) handleListTableBuckets(w http.ResponseWriter, r *http. var buckets []TableBucketSummary err := filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(r.Context(), &filer_pb.ListEntriesRequest{ Directory: TablesPath, Limit: uint32(maxBuckets), }) @@ -178,7 +177,7 @@ func (h *S3TablesHandler) handleDeleteTableBucket(w http.ResponseWriter, r *http // Check if bucket exists and is empty hasChildren := false err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(r.Context(), &filer_pb.ListEntriesRequest{ Directory: bucketPath, Limit: 10, }) @@ -207,7 +206,7 @@ func (h *S3TablesHandler) handleDeleteTableBucket(w http.ResponseWriter, r *http // Delete the bucket err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.deleteDirectory(client, bucketPath) + return h.deleteDirectory(r.Context(), client, bucketPath) }) if err != nil { diff --git a/weed/s3api/s3tables/handler_namespace.go b/weed/s3api/s3tables/handler_namespace.go index 777de2c05..f4c2a6078 100644 --- a/weed/s3api/s3tables/handler_namespace.go +++ b/weed/s3api/s3tables/handler_namespace.go @@ -1,7 +1,6 @@ package s3tables import ( - "context" "encoding/json" "fmt" "net/http" @@ -48,7 +47,7 @@ func (h *S3TablesHandler) handleCreateNamespace(w http.ResponseWriter, r *http.R bucketPath := getTableBucketPath(bucketName) var bucketExists bool err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, bucketPath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyMetadata) bucketExists = err == nil return nil }) @@ -63,7 +62,7 @@ func (h *S3TablesHandler) handleCreateNamespace(w http.ResponseWriter, r *http.R // Check if namespace already exists exists := false err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, namespacePath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, namespacePath, ExtendedKeyMetadata) exists = err == nil return nil }) @@ -89,12 +88,12 @@ func (h *S3TablesHandler) handleCreateNamespace(w http.ResponseWriter, r *http.R err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { // Create namespace directory - if err := h.createDirectory(client, namespacePath); err != nil { + if err := h.createDirectory(r.Context(), client, namespacePath); err != nil { return err } // Set metadata as extended attribute - if err := h.setExtendedAttribute(client, namespacePath, ExtendedKeyMetadata, metadataBytes); err != nil { + if err := h.setExtendedAttribute(r.Context(), client, namespacePath, ExtendedKeyMetadata, metadataBytes); err != nil { return err } @@ -136,9 +135,10 @@ func (h *S3TablesHandler) handleGetNamespace(w http.ResponseWriter, r *http.Requ namespacePath := getNamespacePath(bucketName, req.Namespace) + // Get namespace var metadata namespaceMetadata err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, namespacePath, ExtendedKeyMetadata) + data, err := h.getExtendedAttribute(r.Context(), client, namespacePath, ExtendedKeyMetadata) if err != nil { return err } @@ -187,8 +187,9 @@ func (h *S3TablesHandler) handleListNamespaces(w http.ResponseWriter, r *http.Re bucketPath := getTableBucketPath(bucketName) var namespaces []NamespaceSummary + // List namespaces err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(r.Context(), &filer_pb.ListEntriesRequest{ Directory: bucketPath, Limit: uint32(maxNamespaces), }) @@ -272,7 +273,7 @@ func (h *S3TablesHandler) handleDeleteNamespace(w http.ResponseWriter, r *http.R // Check if namespace exists and is empty hasChildren := false err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(r.Context(), &filer_pb.ListEntriesRequest{ Directory: namespacePath, Limit: 10, }) @@ -301,7 +302,7 @@ func (h *S3TablesHandler) handleDeleteNamespace(w http.ResponseWriter, r *http.R // Delete the namespace err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.deleteDirectory(client, namespacePath) + return h.deleteDirectory(r.Context(), client, namespacePath) }) if err != nil { diff --git a/weed/s3api/s3tables/handler_policy.go b/weed/s3api/s3tables/handler_policy.go index e0e62ad39..a6b42ea71 100644 --- a/weed/s3api/s3tables/handler_policy.go +++ b/weed/s3api/s3tables/handler_policy.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" ) @@ -36,7 +37,7 @@ func (h *S3TablesHandler) handlePutTableBucketPolicy(w http.ResponseWriter, r *h bucketPath := getTableBucketPath(bucketName) var bucketExists bool err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, bucketPath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyMetadata) bucketExists = err == nil return nil }) @@ -48,7 +49,7 @@ func (h *S3TablesHandler) handlePutTableBucketPolicy(w http.ResponseWriter, r *h // Write policy err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.setExtendedAttribute(client, bucketPath, ExtendedKeyPolicy, []byte(req.ResourcePolicy)) + return h.setExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyPolicy, []byte(req.ResourcePolicy)) }) if err != nil { @@ -83,7 +84,7 @@ func (h *S3TablesHandler) handleGetTableBucketPolicy(w http.ResponseWriter, r *h var policy []byte err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { var readErr error - policy, readErr = h.getExtendedAttribute(client, bucketPath, ExtendedKeyPolicy) + policy, readErr = h.getExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyPolicy) return readErr }) @@ -121,11 +122,12 @@ func (h *S3TablesHandler) handleDeleteTableBucketPolicy(w http.ResponseWriter, r bucketPath := getTableBucketPath(bucketName) err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.deleteExtendedAttribute(client, bucketPath, ExtendedKeyPolicy) + return h.deleteExtendedAttribute(r.Context(), client, bucketPath, ExtendedKeyPolicy) }) - if err != nil { - // Ignore error if policy doesn't exist + if err != nil && !strings.Contains(err.Error(), "not found") { + h.writeError(w, http.StatusInternalServerError, ErrCodeInternalError, "failed to delete table bucket policy") + return err } h.writeJSON(w, http.StatusOK, nil) @@ -160,7 +162,7 @@ func (h *S3TablesHandler) handlePutTablePolicy(w http.ResponseWriter, r *http.Re tablePath := getTablePath(bucketName, req.Namespace, req.Name) var tableExists bool err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, tablePath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyMetadata) tableExists = err == nil return nil }) @@ -172,7 +174,7 @@ func (h *S3TablesHandler) handlePutTablePolicy(w http.ResponseWriter, r *http.Re // Write policy err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.setExtendedAttribute(client, tablePath, ExtendedKeyPolicy, []byte(req.ResourcePolicy)) + return h.setExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyPolicy, []byte(req.ResourcePolicy)) }) if err != nil { @@ -207,7 +209,7 @@ func (h *S3TablesHandler) handleGetTablePolicy(w http.ResponseWriter, r *http.Re var policy []byte err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { var readErr error - policy, readErr = h.getExtendedAttribute(client, tablePath, ExtendedKeyPolicy) + policy, readErr = h.getExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyPolicy) return readErr }) @@ -245,11 +247,12 @@ func (h *S3TablesHandler) handleDeleteTablePolicy(w http.ResponseWriter, r *http tablePath := getTablePath(bucketName, req.Namespace, req.Name) err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.deleteExtendedAttribute(client, tablePath, ExtendedKeyPolicy) + return h.deleteExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyPolicy) }) - if err != nil { - // Ignore error if policy doesn't exist + if err != nil && !strings.Contains(err.Error(), "not found") { + h.writeError(w, http.StatusInternalServerError, ErrCodeInternalError, "failed to delete table policy") + return err } h.writeJSON(w, http.StatusOK, nil) @@ -284,7 +287,7 @@ func (h *S3TablesHandler) handleTagResource(w http.ResponseWriter, r *http.Reque // Read existing tags and merge existingTags := make(map[string]string) err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, resourcePath, extendedKey) + data, err := h.getExtendedAttribute(r.Context(), client, resourcePath, extendedKey) if err == nil { json.Unmarshal(data, &existingTags) } @@ -303,7 +306,7 @@ func (h *S3TablesHandler) handleTagResource(w http.ResponseWriter, r *http.Reque return fmt.Errorf("failed to marshal tags: %w", err) } err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.setExtendedAttribute(client, resourcePath, extendedKey, tagsBytes) + return h.setExtendedAttribute(r.Context(), client, resourcePath, extendedKey, tagsBytes) }) if err != nil { @@ -336,7 +339,7 @@ func (h *S3TablesHandler) handleListTagsForResource(w http.ResponseWriter, r *ht tags := make(map[string]string) err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, resourcePath, extendedKey) + data, err := h.getExtendedAttribute(r.Context(), client, resourcePath, extendedKey) if err != nil { return nil // Return empty tags if not found } @@ -378,7 +381,7 @@ func (h *S3TablesHandler) handleUntagResource(w http.ResponseWriter, r *http.Req // Read existing tags tags := make(map[string]string) err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, resourcePath, extendedKey) + data, err := h.getExtendedAttribute(r.Context(), client, resourcePath, extendedKey) if err != nil { return nil } @@ -397,7 +400,7 @@ func (h *S3TablesHandler) handleUntagResource(w http.ResponseWriter, r *http.Req return fmt.Errorf("failed to marshal tags: %w", err) } err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.setExtendedAttribute(client, resourcePath, extendedKey, tagsBytes) + return h.setExtendedAttribute(r.Context(), client, resourcePath, extendedKey, tagsBytes) }) if err != nil { diff --git a/weed/s3api/s3tables/handler_table.go b/weed/s3api/s3tables/handler_table.go index 6054a85d4..da1aa6d9a 100644 --- a/weed/s3api/s3tables/handler_table.go +++ b/weed/s3api/s3tables/handler_table.go @@ -61,7 +61,7 @@ func (h *S3TablesHandler) handleCreateTable(w http.ResponseWriter, r *http.Reque namespacePath := getNamespacePath(bucketName, req.Namespace) var namespaceExists bool err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, namespacePath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, namespacePath, ExtendedKeyMetadata) namespaceExists = err == nil return nil }) @@ -76,7 +76,7 @@ func (h *S3TablesHandler) handleCreateTable(w http.ResponseWriter, r *http.Reque // Check if table already exists exists := false err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, tablePath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyMetadata) exists = err == nil return nil }) @@ -109,18 +109,18 @@ func (h *S3TablesHandler) handleCreateTable(w http.ResponseWriter, r *http.Reque err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { // Create table directory - if err := h.createDirectory(client, tablePath); err != nil { + if err := h.createDirectory(r.Context(), client, tablePath); err != nil { return err } // Create data subdirectory for Iceberg files dataPath := tablePath + "/data" - if err := h.createDirectory(client, dataPath); err != nil { + if err := h.createDirectory(r.Context(), client, dataPath); err != nil { return err } // Set metadata as extended attribute - if err := h.setExtendedAttribute(client, tablePath, ExtendedKeyMetadata, metadataBytes); err != nil { + if err := h.setExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyMetadata, metadataBytes); err != nil { return err } @@ -130,7 +130,7 @@ func (h *S3TablesHandler) handleCreateTable(w http.ResponseWriter, r *http.Reque if err != nil { return fmt.Errorf("failed to marshal tags: %w", err) } - if err := h.setExtendedAttribute(client, tablePath, ExtendedKeyTags, tagsBytes); err != nil { + if err := h.setExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyTags, tagsBytes); err != nil { return err } } @@ -189,7 +189,7 @@ func (h *S3TablesHandler) handleGetTable(w http.ResponseWriter, r *http.Request, var metadata tableMetadataInternal err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - data, err := h.getExtendedAttribute(client, tablePath, ExtendedKeyMetadata) + data, err := h.getExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyMetadata) if err != nil { return err } @@ -247,10 +247,10 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques // If namespace is specified, list tables in that namespace only if req.Namespace != "" { - err = h.listTablesInNamespace(filerClient, bucketName, req.Namespace, req.Prefix, maxTables, &tables) + err = h.listTablesInNamespace(r.Context(), filerClient, bucketName, req.Namespace, req.Prefix, maxTables, &tables) } else { // List tables in all namespaces - err = h.listTablesInAllNamespaces(filerClient, bucketName, req.Prefix, maxTables, &tables) + err = h.listTablesInAllNamespaces(r.Context(), filerClient, bucketName, req.Prefix, maxTables, &tables) } if err != nil { @@ -265,11 +265,11 @@ func (h *S3TablesHandler) handleListTables(w http.ResponseWriter, r *http.Reques return nil } -func (h *S3TablesHandler) listTablesInNamespace(filerClient FilerClient, bucketName, namespace, prefix string, maxTables int, tables *[]TableSummary) error { +func (h *S3TablesHandler) listTablesInNamespace(ctx context.Context, filerClient FilerClient, bucketName, namespace, prefix string, maxTables int, tables *[]TableSummary) error { namespacePath := getNamespacePath(bucketName, namespace) return filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(ctx, &filer_pb.ListEntriesRequest{ Directory: namespacePath, Limit: uint32(maxTables), }) @@ -323,12 +323,12 @@ func (h *S3TablesHandler) listTablesInNamespace(filerClient FilerClient, bucketN }) } -func (h *S3TablesHandler) listTablesInAllNamespaces(filerClient FilerClient, bucketName, prefix string, maxTables int, tables *[]TableSummary) error { +func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerClient FilerClient, bucketName, prefix string, maxTables int, tables *[]TableSummary) error { bucketPath := getTableBucketPath(bucketName) return filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { // List all namespaces first - resp, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{ + resp, err := client.ListEntries(ctx, &filer_pb.ListEntriesRequest{ Directory: bucketPath, Limit: 1000, }) @@ -354,7 +354,7 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(filerClient FilerClient, buc namespace := entry.Entry.Name // List tables in this namespace - if err := h.listTablesInNamespace(filerClient, bucketName, namespace, prefix, maxTables-len(*tables), tables); err != nil { + if err := h.listTablesInNamespace(ctx, filerClient, bucketName, namespace, prefix, maxTables-len(*tables), tables); err != nil { continue } @@ -391,7 +391,7 @@ func (h *S3TablesHandler) handleDeleteTable(w http.ResponseWriter, r *http.Reque // Check if table exists var tableExists bool err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - _, err := h.getExtendedAttribute(client, tablePath, ExtendedKeyMetadata) + _, err := h.getExtendedAttribute(r.Context(), client, tablePath, ExtendedKeyMetadata) tableExists = err == nil return nil }) @@ -403,7 +403,7 @@ func (h *S3TablesHandler) handleDeleteTable(w http.ResponseWriter, r *http.Reque // Delete the table err = filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - return h.deleteDirectory(client, tablePath) + return h.deleteDirectory(r.Context(), client, tablePath) }) if err != nil {