From db5751f37038d83f7dfc93f2179c7fa339000978 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Mar 2026 01:24:03 -0700 Subject: [PATCH] fix: handle same-directory renames in metadata subscription Replay a delete event for the old entry name during same-directory renames so handlers like onBucketMetadataChange can clean up stale state for the old name. --- weed/s3api/auth_credentials_subscribe.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/weed/s3api/auth_credentials_subscribe.go b/weed/s3api/auth_credentials_subscribe.go index 964ee4822..e0eb15554 100644 --- a/weed/s3api/auth_credentials_subscribe.go +++ b/weed/s3api/auth_credentials_subscribe.go @@ -33,13 +33,22 @@ func (s3a *S3ApiServer) subscribeMetaEvents(clientName string, lastTsNs int64, p _ = s3a.onIamConfigChange(dir, message.OldEntry, message.NewEntry) _ = s3a.onCircuitBreakerConfigChange(dir, message.OldEntry, message.NewEntry) - // For moves across directories, also notify handlers about the source directory + // For moves across directories, replay a delete event for the source directory if message.NewParentPath != "" && resp.Directory != message.NewParentPath { _ = s3a.onBucketMetadataChange(resp.Directory, message.OldEntry, nil) _ = s3a.onIamConfigChange(resp.Directory, message.OldEntry, nil) _ = s3a.onCircuitBreakerConfigChange(resp.Directory, message.OldEntry, nil) } + // For same-directory renames, replay a delete event for the old name + // so handlers can clean up stale state (e.g., old bucket names) + if message.OldEntry != nil && message.NewEntry != nil && + (message.NewParentPath == "" || message.NewParentPath == resp.Directory) && + message.OldEntry.Name != message.NewEntry.Name { + _ = s3a.onBucketMetadataChange(dir, message.OldEntry, nil) + _ = s3a.onCircuitBreakerConfigChange(dir, message.OldEntry, nil) + } + return nil }