2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Fix a statschannel system test zone loadtime issue

The check_loaded() function compares the zone's loadtime value and
an expected loadtime value, which is based on the zone file's mtime
extracted from the filesystem.

For the secondary zones there may be cases, when the zone file isn't
ready yet before the zone transfer is complete and the zone file is
dumped to the disk, so a so zero value mtime is retrieved.

In such cases wait one second and retry until timeout. Also modify
the affected check to allow a possible difference of the same amount
of seconds as the chosen timeout value.
This commit is contained in:
Aram Sargsyan
2023-12-12 14:54:40 +00:00
parent ced40c48a4
commit 4e94ff2541

View File

@@ -11,6 +11,7 @@
from datetime import datetime, timedelta
from collections import defaultdict
from time import sleep
import os
import dns.message
@@ -28,6 +29,9 @@ max_refresh = timedelta(seconds=2419200) # 4 weeks
max_expires = timedelta(seconds=14515200) # 24 weeks
dayzero = datetime.utcfromtimestamp(0).replace(microsecond=0)
# Wait for the secondary zone files to appear to extract their mtime
max_secondary_zone_waittime_sec = 5
# Generic helper functions
def check_expires(expires, min_time, max_time):
@@ -42,7 +46,7 @@ def check_refresh(refresh, min_time, max_time):
def check_loaded(loaded, expected, now):
# Sanity check the zone timers values
assert loaded == expected
assert (loaded - expected).total_seconds() < max_secondary_zone_waittime_sec
assert loaded <= now
@@ -93,12 +97,26 @@ def test_zone_timers_secondary(fetch_zones, load_timers, **kwargs):
statsport = kwargs["statsport"]
zonedir = kwargs["zonedir"]
# If any one of the zone files isn't ready, then retry until timeout.
tries = max_secondary_zone_waittime_sec
while tries >= 0:
zones = fetch_zones(statsip, statsport)
again = False
for zone in zones:
(name, loaded, expires, refresh) = load_timers(zone, False)
mtime = zone_mtime(zonedir, name)
if (mtime != dayzero) or (tries == 0):
# mtime was either retrieved successfully or no tries were
# left, run the check anyway.
check_zone_timers(loaded, expires, refresh, mtime)
else:
tries = tries - 1
again = True
break
if again:
sleep(1)
else:
break
def test_zone_with_many_keys(fetch_zones, load_zone, **kwargs):