Replace time.time with time.monotonic to avoid clock drift issues (#4492)
Using time.time() can be inaccurate if the system clock gets updated in between calls.
This commit is contained in:
parent
8a929f603f
commit
c4d68855cb
|
|
@ -189,10 +189,10 @@ class Installer:
|
||||||
if not skip_ntp:
|
if not skip_ntp:
|
||||||
info(tr('Waiting for time sync (timedatectl show) to complete.'))
|
info(tr('Waiting for time sync (timedatectl show) to complete.'))
|
||||||
|
|
||||||
started_wait = time.time()
|
started_wait = time.monotonic()
|
||||||
notified = False
|
notified = False
|
||||||
while True:
|
while True:
|
||||||
if not notified and time.time() - started_wait > 5:
|
if not notified and time.monotonic() - started_wait > 5:
|
||||||
notified = True
|
notified = True
|
||||||
warn(tr('Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/'))
|
warn(tr('Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/'))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,12 +46,12 @@ class DownloadTimer:
|
||||||
self.previous_handler = signal.signal(signal.SIGALRM, self.raise_timeout) # type: ignore[assignment]
|
self.previous_handler = signal.signal(signal.SIGALRM, self.raise_timeout) # type: ignore[assignment]
|
||||||
self.previous_timer = signal.alarm(self.timeout)
|
self.previous_timer = signal.alarm(self.timeout)
|
||||||
|
|
||||||
self.start_time = time.time()
|
self.start_time = time.monotonic()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __exit__(self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None) -> None:
|
def __exit__(self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None) -> None:
|
||||||
if self.start_time:
|
if self.start_time:
|
||||||
time_delta = time.time() - self.start_time
|
time_delta = time.monotonic() - self.start_time
|
||||||
signal.alarm(0)
|
signal.alarm(0)
|
||||||
self.time = time_delta
|
self.time = time_delta
|
||||||
if self.timeout > 0:
|
if self.timeout > 0:
|
||||||
|
|
@ -165,7 +165,7 @@ def build_icmp(payload: bytes) -> bytes:
|
||||||
|
|
||||||
def ping(hostname: str, timeout: int = 5) -> int:
|
def ping(hostname: str, timeout: int = 5) -> int:
|
||||||
watchdog = select.epoll()
|
watchdog = select.epoll()
|
||||||
started = time.time()
|
started = time.monotonic()
|
||||||
random_identifier = f'archinstall-{random.randint(1000, 9999)}'.encode()
|
random_identifier = f'archinstall-{random.randint(1000, 9999)}'.encode()
|
||||||
|
|
||||||
# Create a raw socket (requires root, which should be fine on archiso)
|
# Create a raw socket (requires root, which should be fine on archiso)
|
||||||
|
|
@ -180,7 +180,7 @@ def ping(hostname: str, timeout: int = 5) -> int:
|
||||||
|
|
||||||
# Gracefully wait for X amount of time
|
# Gracefully wait for X amount of time
|
||||||
# for a ICMP response or exit with no latency
|
# for a ICMP response or exit with no latency
|
||||||
while latency == -1 and time.time() - started < timeout:
|
while latency == -1 and time.monotonic() - started < timeout:
|
||||||
try:
|
try:
|
||||||
for _fileno, _event in watchdog.poll(0.1):
|
for _fileno, _event in watchdog.poll(0.1):
|
||||||
response, _ = icmp_socket.recvfrom(1024)
|
response, _ = icmp_socket.recvfrom(1024)
|
||||||
|
|
@ -188,7 +188,7 @@ def ping(hostname: str, timeout: int = 5) -> int:
|
||||||
|
|
||||||
# Check if it's an Echo Reply (ICMP type 0)
|
# Check if it's an Echo Reply (ICMP type 0)
|
||||||
if icmp_type == 0 and response[-len(random_identifier) :] == random_identifier:
|
if icmp_type == 0 and response[-len(random_identifier) :] == random_identifier:
|
||||||
latency = round((time.time() - started) * 1000)
|
latency = round((time.monotonic() - started) * 1000)
|
||||||
break
|
break
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
debug(f'Error: {e}')
|
debug(f'Error: {e}')
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,11 @@ class Pacman:
|
||||||
if pacman_db_lock.exists():
|
if pacman_db_lock.exists():
|
||||||
warn(tr('Pacman is already running, waiting maximum 10 minutes for it to terminate.'))
|
warn(tr('Pacman is already running, waiting maximum 10 minutes for it to terminate.'))
|
||||||
|
|
||||||
started = time.time()
|
started = time.monotonic()
|
||||||
while pacman_db_lock.exists():
|
while pacman_db_lock.exists():
|
||||||
time.sleep(0.25)
|
time.sleep(0.25)
|
||||||
|
|
||||||
if time.time() - started > (60 * 10):
|
if time.monotonic() - started > (60 * 10):
|
||||||
error(tr('Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall.'))
|
error(tr('Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall.'))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue