Browse Source

s3tables: fix cross-namespace pagination in listTablesInAllNamespaces

pull/8147/head
Chris Lu 3 days ago
parent
commit
5c43f1e6a4
  1. 23
      weed/s3api/s3tables/handler_table.go

23
weed/s3api/s3tables/handler_table.go

@ -419,17 +419,18 @@ func (h *S3TablesHandler) listTablesInNamespaceWithClient(ctx context.Context, c
func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerClient FilerClient, bucketName, prefix, continuationToken string, maxTables int, tables *[]TableSummary) error {
bucketPath := getTableBucketPath(bucketName)
var lastNamespace string
var continuationNamespace string
var startTableName string
if continuationToken != "" {
if parts := strings.SplitN(continuationToken, "/", 2); len(parts) == 2 {
lastNamespace = parts[0]
continuationNamespace = parts[0]
startTableName = parts[1]
} else {
lastNamespace = continuationToken
continuationNamespace = continuationToken
}
}
lastNamespace := continuationNamespace
return filerClient.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
for {
// List namespaces in batches
@ -437,7 +438,7 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl
Directory: bucketPath,
Limit: 100,
StartFromFileName: lastNamespace,
InclusiveStartFrom: lastNamespace == "",
InclusiveStartFrom: lastNamespace == continuationNamespace && continuationNamespace != "" || lastNamespace == "",
})
if err != nil {
return err
@ -455,6 +456,13 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl
if entry.Entry == nil {
continue
}
// Skip the start item if it was the continuation namespace but we already processed it
// (handled by the startTableName clearing logic below)
if lastNamespace == continuationNamespace && continuationNamespace != "" && entry.Entry.Name == continuationNamespace && startTableName == "" && len(*tables) > 0 {
continue
}
hasMore = true
lastNamespace = entry.Entry.Name
@ -471,7 +479,7 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl
// List tables in this namespace
tableNameFilter := ""
if namespace == lastNamespace {
if namespace == continuationNamespace {
tableNameFilter = startTableName
}
@ -480,6 +488,11 @@ func (h *S3TablesHandler) listTablesInAllNamespaces(ctx context.Context, filerCl
continue
}
// Clear startTableName after the first matching namespace is processed
if namespace == continuationNamespace {
startTableName = ""
}
if len(*tables) >= maxTables {
return nil
}

Loading…
Cancel
Save