From 84bb0ca880b8b161cc025bb2ff64c563d858860b Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 10 Nov 2025 15:36:44 -0800 Subject: [PATCH] edge cases --- weed/shell/command_volume_check_disk_test.go | 135 +++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/weed/shell/command_volume_check_disk_test.go b/weed/shell/command_volume_check_disk_test.go index ffe1fb8ea..24c0ae516 100644 --- a/weed/shell/command_volume_check_disk_test.go +++ b/weed/shell/command_volume_check_disk_test.go @@ -87,6 +87,141 @@ func TestShouldSkipVolume(t *testing.T) { syncDeletions: false, shouldSkipVolume: true, }, + // Edge case: Zero file and delete counts + { + name: "volumes with zero file counts should be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 0, + DeleteCount: 0, + ModifiedAtSecond: 1696583300}, + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 0, + DeleteCount: 0, + ModifiedAtSecond: 1696583300}, + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: true, + }, + { + name: "volumes with zero and non-zero file counts should not be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1, + DeleteCount: 0, + ModifiedAtSecond: 1696583300}, + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 0, + DeleteCount: 0, + ModifiedAtSecond: 1696583300}, + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: false, + }, + // Edge case: Recently modified volumes (after pulse time) + // Note: VolumePulsePeriod is 10 seconds, so pulse cutoff is now - 20 seconds + // When both volumes are recently modified, skip check to avoid false positives + { + name: "recently modified volumes with same file counts should be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583395}, // Modified 5 seconds ago + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583390}, // Modified 10 seconds ago + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: true, // Same counts = skip + }, + { + name: "one volume modified before pulse cutoff with different file counts should not be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583370}, // Modified 30 seconds ago (before cutoff at -20s) + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 999, + DeleteCount: 100, + ModifiedAtSecond: 1696583370}, // Same modification time + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: false, // Different counts + old enough = needs sync + }, + // Edge case: Different ModifiedAtSecond values, same file counts + { + name: "different modification times with same file counts should be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583300}, // 100 seconds before pulse time + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583350}, // 50 seconds before pulse time + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: true, // Same counts, both before cutoff + }, + // Edge case: Very close to pulse time boundary + { + name: "volumes modified exactly at pulse cutoff boundary with different counts should not be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1001, + DeleteCount: 100, + ModifiedAtSecond: 1696583379}, // Just before cutoff (pulseTime - 21s) + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583379}, // Just before cutoff + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: false, // At boundary with different counts - needs sync + }, + { + name: "volumes modified just after pulse cutoff boundary with same counts should be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583381}, // Just after cutoff (pulseTime - 19s) + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 1000, + DeleteCount: 100, + ModifiedAtSecond: 1696583381}, // Just after cutoff + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: true, // Same counts + recent = skip to avoid false positive + }, + // Edge case: Large file count differences + { + name: "large file count difference with old modification time should not be skipped", + a: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 10000, + DeleteCount: 100, + ModifiedAtSecond: 1696583300}, + }, + b: VolumeReplica{nil, &master_pb.VolumeInformationMessage{ + FileCount: 5000, + DeleteCount: 100, + ModifiedAtSecond: 1696583300}, + }, + pulseTimeAtSecond: 1696583400, + syncDeletions: true, + shouldSkipVolume: false, // Large difference requires sync + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {