From 0410236577754fd30355bf723f8740d782fe5bda Mon Sep 17 00:00:00 2001 From: Ville Vesilehto Date: Tue, 21 Jul 2026 00:54:13 +0300 Subject: [PATCH] test(file): stabilize mtime reload (#8318) Make mtime reload tests tolerate slow scheduling and coarse filesystem timestamp resolution. This keeps immediate rewrites observable and avoids checking zone contents before the reload completes. Signed-off-by: Ville Vesilehto --- plugin/file/reload_test.go | 42 +++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/plugin/file/reload_test.go b/plugin/file/reload_test.go index ba0ae479f..8ee42e388 100644 --- a/plugin/file/reload_test.go +++ b/plugin/file/reload_test.go @@ -103,13 +103,16 @@ func TestZoneReloadByMtime(t *testing.T) { t.Fatalf("Failed to write new zone data: %s", err) } - // Wait for reload to trigger - time.Sleep(30 * time.Millisecond) - - // Verify reload occurred (3 records now) - rrs, err = z.ApexIfDefined() - if err != nil { - t.Fatal(err) + // Poll until reload is observed (fixed sleeps race under -race, esp. on Windows). + for start := time.Now(); time.Since(start) < 2*time.Second; { + rrs, err = z.ApexIfDefined() + if err != nil { + t.Fatal(err) + } + if len(rrs) == 3 { + break + } + time.Sleep(2 * time.Millisecond) } if len(rrs) != 3 { t.Fatalf("Expected 3 RRs after reload, got %d", len(rrs)) @@ -182,13 +185,16 @@ func TestZoneReloadByMtime(t *testing.T) { t.Fatalf("Failed to write new zone data: %s", err) } - // Wait for reload - time.Sleep(30 * time.Millisecond) - - // Query new content - records, _, _, res = z.Lookup(ctx, state, "miek.nl.") - if res != Success { - t.Fatalf("Failed to lookup reloaded NS records, got %d", res) + // Poll until reload is observed (fixed sleeps race under -race, esp. on Windows). + for start := time.Now(); time.Since(start) < 2*time.Second; { + records, _, _, res = z.Lookup(ctx, state, "miek.nl.") + if res != Success { + t.Fatalf("Failed to lookup reloaded NS records, got %d", res) + } + if len(records) == 2 { + break + } + time.Sleep(2 * time.Millisecond) } // Reloaded zone has 2 NS records @@ -262,6 +268,14 @@ func prepareMtimeZone(t *testing.T, content string) (*Zone, string, func()) { if err != nil { t.Fatalf("Failed to create zone: %s", err) } + // A rewrite immediately after creating the file can retain the same mtime + // on filesystems with coarse timestamp resolution. Start with an older + // mtime so the rewrite is always observable by the reload loop. + initialMtime := time.Now().Add(-time.Minute) + if err := os.Chtimes(fileName, initialMtime, initialMtime); err != nil { + rm() + t.Fatalf("Failed to set initial zone mtime: %s", err) + } reader, err := os.Open(fileName) if err != nil {