diff --git a/weed/storage/store.go b/weed/storage/store.go index dfaee9008..8ef3009b9 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -389,6 +389,11 @@ func collectStatForOneVolume(vid needle.VolumeId, v *Volume) (s *VolumeInfo) { s.DeleteCount = v.nm.DeletedCount() s.DeletedByteCount = v.nm.DeletedSize() s.Size = v.nm.ContentSize() + if v.DataBackend != nil { + if _, modTime, e := v.DataBackend.GetStat(); e == nil { + s.ModifiedAtSecond = modTime.Unix() + } + } return } diff --git a/weed/storage/store_status_test.go b/weed/storage/store_status_test.go new file mode 100644 index 000000000..54558616a --- /dev/null +++ b/weed/storage/store_status_test.go @@ -0,0 +1,31 @@ +package storage + +import ( + "testing" + + "github.com/seaweedfs/seaweedfs/weed/storage/needle" + "github.com/seaweedfs/seaweedfs/weed/storage/super_block" + "github.com/seaweedfs/seaweedfs/weed/storage/types" +) + +// The /status handler builds VolumeInfo via collectStatForOneVolume, which +// used to leave ModifiedAtSecond at 0; only the heartbeat path filled it in. +func TestCollectStatForOneVolumeModifiedAtSecond(t *testing.T) { + dir := t.TempDir() + + v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, needle.GetCurrentVersion(), 0, 0) + if err != nil { + t.Fatalf("create volume: %v", err) + } + defer v.Close() + v.location = &DiskLocation{Directory: dir, DiskType: types.HardDriveType} + + if _, _, _, err := v.writeNeedle2(newRandomNeedle(1), true, false); err != nil { + t.Fatalf("write: %v", err) + } + + s := collectStatForOneVolume(v.Id, v) + if s.ModifiedAtSecond <= 0 { + t.Fatalf("ModifiedAtSecond = %d, want > 0", s.ModifiedAtSecond) + } +}