From 457277ec9a5be6f7dd541c809685c74137a6f692 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Sat, 8 Aug 2026 05:51:45 +0300 Subject: [PATCH] reload filer config on local metadata updates (#10622) --- weed/filer/filer_notify.go | 39 +---------------------- weed/filer/metadata_event_sink_test.go | 44 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/weed/filer/filer_notify.go b/weed/filer/filer_notify.go index a9ba55438..25430b901 100644 --- a/weed/filer/filer_notify.go +++ b/weed/filer/filer_notify.go @@ -71,9 +71,7 @@ func (f *Filer) notifyUpdateEvent(ctx context.Context, oldEntry, newEntry *Entry sink.Record(event) } - // Trigger empty folder cleanup for local events - // Remote events are handled via MetaAggregator.onMetadataChangeEvent - f.triggerLocalEmptyFolderCleanup(oldEntry, newEntry) + f.onMetadataChangeEvent(event) return event } @@ -121,41 +119,6 @@ func (f *Filer) logMetaEvent(ctx context.Context, event *filer_pb.SubscribeMetad } -// triggerLocalEmptyFolderCleanup triggers empty folder cleanup for local events -// This is needed because onMetadataChangeEvent is only called for remote peer events -func (f *Filer) triggerLocalEmptyFolderCleanup(oldEntry, newEntry *Entry) { - if f.EmptyFolderCleaner == nil || !f.EmptyFolderCleaner.IsEnabled() { - return - } - - eventTime := time.Now() - - // Handle delete events (oldEntry exists, newEntry is nil) - if oldEntry != nil && newEntry == nil { - dir, name := oldEntry.FullPath.DirAndName() - f.EmptyFolderCleaner.OnDeleteEvent(dir, name, oldEntry.IsDirectory(), eventTime) - } - - // Handle create events (oldEntry is nil, newEntry exists) - if oldEntry == nil && newEntry != nil { - dir, name := newEntry.FullPath.DirAndName() - f.EmptyFolderCleaner.OnCreateEvent(dir, name, newEntry.IsDirectory()) - } - - // Handle rename/move events (both exist but paths differ) - if oldEntry != nil && newEntry != nil { - oldDir, oldName := oldEntry.FullPath.DirAndName() - newDir, newName := newEntry.FullPath.DirAndName() - - if oldDir != newDir || oldName != newName { - // Treat old location as delete - f.EmptyFolderCleaner.OnDeleteEvent(oldDir, oldName, oldEntry.IsDirectory(), eventTime) - // Treat new location as create - f.EmptyFolderCleaner.OnCreateEvent(newDir, newName, newEntry.IsDirectory()) - } - } -} - // metadataLogUploadLimit is the piece size a metadata log flush starts with. A // volume server refuses anything over its -fileSizeLimitMB (256 MB by default), // and a single oversized event — a CreateEntry carrying a large inline Content, diff --git a/weed/filer/metadata_event_sink_test.go b/weed/filer/metadata_event_sink_test.go index 19edad1c7..80fac3248 100644 --- a/weed/filer/metadata_event_sink_test.go +++ b/weed/filer/metadata_event_sink_test.go @@ -1,10 +1,12 @@ package filer import ( + "bytes" "context" "testing" "time" + "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" "github.com/seaweedfs/seaweedfs/weed/util" "github.com/seaweedfs/seaweedfs/weed/util/log_buffer" ) @@ -41,3 +43,45 @@ func TestNotifyUpdateEventRecordsRequestMetadataEvent(t *testing.T) { t.Fatal("expected event timestamp to be set") } } + +func TestNotifyUpdateEventReloadsLocalFilerConfiguration(t *testing.T) { + f := &Filer{ + Signature: 42, + FilerConf: NewFilerConf(), + LocalMetaLogBuffer: log_buffer.NewLogBuffer( + "test", + time.Hour, + func(*log_buffer.LogBuffer, time.Time, time.Time, []byte, int64, int64) {}, + nil, + nil, + ), + } + + updatedConf := NewFilerConf() + if err := updatedConf.SetLocationConf(&filer_pb.FilerConf_PathConf{ + LocationPrefix: "/data/", + Collection: "hot", + }); err != nil { + t.Fatalf("set location conf: %v", err) + } + var content bytes.Buffer + if err := updatedConf.ToText(&content); err != nil { + t.Fatalf("serialize filer conf: %v", err) + } + + f.NotifyUpdateEvent(context.Background(), nil, &Entry{ + FullPath: util.NewFullPath(DirectoryEtcSeaweedFS, FilerConfName), + Attr: Attr{ + FileSize: uint64(content.Len()), + }, + Content: content.Bytes(), + }, false, false, nil) + + locConf, found := f.FilerConf.GetLocationConf("/data/") + if !found { + t.Fatal("expected local filer configuration to reload /data/ rule") + } + if locConf.Collection != "hot" { + t.Fatalf("collection = %q, want hot", locConf.Collection) + } +}