diff --git a/weed/command/mini.go b/weed/command/mini.go index 6fc47bc36..8831dd604 100644 --- a/weed/command/mini.go +++ b/weed/command/mini.go @@ -1305,6 +1305,12 @@ func runMini(cmd *Command, args []string) bool { // on the default 10s waiting for background subscription streams. miniFilerOptions.gracefulStopTimeout = 1 * time.Second + // Mirror weed server: fall back to -volume.disk so the filer's default + // disk type still tags metadata-log assigns when only -volume.disk is set. + if *miniFilerOptions.diskType == "" && *miniOptions.v.diskType != "" { + miniFilerOptions.diskType = miniOptions.v.diskType + } + // Start all services with proper dependency coordination // This channel will be closed when all services are fully ready fmt.Println("\n Starting SeaweedFS Mini ...") diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 6af9ef963..4595c55f4 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -52,6 +52,7 @@ type Filer struct { LocalMetaLogBuffer *log_buffer.LogBuffer metaLogCollection string metaLogReplication string + DefaultDiskType string MetaAggregator *MetaAggregator Signature int32 FilerConf *FilerConf diff --git a/weed/filer/filer_notify_append.go b/weed/filer/filer_notify_append.go index 432153dfb..9c5269dd1 100644 --- a/weed/filer/filer_notify_append.go +++ b/weed/filer/filer_notify_append.go @@ -48,14 +48,25 @@ func (f *Filer) appendToFile(targetFile string, data []byte) error { return err } +// resolveMetadataLogAssignDiskType returns the disk type and matched path rule for +// metadata log volume assigns. Disk type uses the rule when set, otherwise +// Filer.DefaultDiskType (from -filer.disk), mirroring resolveAssignStorageOption. +func (f *Filer) resolveMetadataLogAssignDiskType(targetFile string) (string, *filer_pb.FilerConf_PathConf) { + if f.FilerConf == nil { + return f.DefaultDiskType, &filer_pb.FilerConf_PathConf{} + } + rule := f.FilerConf.MatchStorageRule(targetFile) + return util.Nvl(rule.DiskType, f.DefaultDiskType), rule +} + func (f *Filer) assignAndUpload(targetFile string, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { // assign a volume location - rule := f.FilerConf.MatchStorageRule(targetFile) + diskType, rule := f.resolveMetadataLogAssignDiskType(targetFile) assignRequest := &operation.VolumeAssignRequest{ Count: 1, Collection: util.Nvl(f.metaLogCollection, rule.Collection), Replication: util.Nvl(f.metaLogReplication, rule.Replication), - DiskType: rule.DiskType, + DiskType: diskType, WritableVolumeCount: rule.VolumeGrowthCount, ExpectedDataSize: uint64(len(data)), } diff --git a/weed/filer/filer_notify_append_test.go b/weed/filer/filer_notify_append_test.go new file mode 100644 index 000000000..05526e967 --- /dev/null +++ b/weed/filer/filer_notify_append_test.go @@ -0,0 +1,56 @@ +package filer + +import ( + "testing" + + "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" +) + +func TestResolveMetadataLogAssignDiskTypeUsesPathRule(t *testing.T) { + fc := NewFilerConf() + if err := fc.SetLocationConf(&filer_pb.FilerConf_PathConf{ + LocationPrefix: "/topics/.system/log", + DiskType: "hot", + }); err != nil { + t.Fatalf("set location conf: %v", err) + } + + f := &Filer{ + FilerConf: fc, + DefaultDiskType: "hdd", + } + + got, rule := f.resolveMetadataLogAssignDiskType("/topics/.system/log/2026-06-23/12-00.1") + if got != "hot" { + t.Fatalf("disk type = %q, want %q", got, "hot") + } + if rule.DiskType != "hot" { + t.Fatalf("rule disk type = %q, want %q", rule.DiskType, "hot") + } +} + +func TestResolveMetadataLogAssignDiskTypeFallsBackToFilerDefault(t *testing.T) { + f := &Filer{ + FilerConf: NewFilerConf(), + DefaultDiskType: "hot", + } + + got, _ := f.resolveMetadataLogAssignDiskType("/topics/.system/log/2026-06-23/12-00.1") + if got != "hot" { + t.Fatalf("disk type = %q, want %q", got, "hot") + } +} + +func TestResolveMetadataLogAssignDiskTypeNilFilerConf(t *testing.T) { + f := &Filer{ + DefaultDiskType: "hot", + } + + got, rule := f.resolveMetadataLogAssignDiskType("/topics/.system/log/2026-06-23/12-00.1") + if got != "hot" { + t.Fatalf("disk type = %q, want %q", got, "hot") + } + if rule == nil { + t.Fatal("expected non-nil empty rule") + } +} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 81cf80d7a..09567fe6b 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -225,6 +225,7 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) } }) fs.filer.Cipher = option.Cipher + fs.filer.DefaultDiskType = option.DiskType // we do not support IP whitelist right now https://github.com/seaweedfs/seaweedfs/issues/7094 if v.GetString("guard.white_list") != "" { glog.Warningf("filer: guard.white_list is configured but the IP whitelist feature is currently disabled. See https://github.com/seaweedfs/seaweedfs/issues/7094")