mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-08-17 20:57:27 +00:00
reload filer config on local metadata updates (#10622)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user