avoid float with time, and be safe against crashes during file writing

This commit is contained in:
holger krekel 2024-04-03 18:06:50 +02:00
parent 60d7e516dd
commit ae455fa9e1

View File

@ -25,6 +25,7 @@ The meaning and format of tokens is basically a matter of Delta-Chat Core and
the `notification.delta.chat` service.
"""
import os
import time
import math
import logging
@ -40,7 +41,7 @@ import requests
class PersistentQueueItem:
path: Path
addr: str
start_ts: float
start_ts: int
token: str
def delete(self):
@ -50,13 +51,15 @@ class PersistentQueueItem:
def create(cls, queue_dir, addr, start_ts, token):
queue_id = uuid4().hex
path = queue_dir.joinpath(queue_id)
path.write_text(f"{addr}\n{start_ts}\n{token}")
tmp_path = path.with_name(path.name + ".tmp")
tmp_path.write_text(f"{addr}\n{start_ts}\n{token}")
os.rename(tmp_path, path)
return cls(path, addr, start_ts, token)
@classmethod
def read_from_path(cls, path):
addr, start_ts, token = path.read_text().split("\n", maxsplit=2)
return cls(path, addr, float(start_ts), token)
return cls(path, addr, int(start_ts), token)
class Notifier:
@ -74,7 +77,7 @@ class Notifier:
return 0 if retry_num == 0 else pow(self.BASE_DELAY, retry_num)
def new_message_for_addr(self, addr, metadata):
start_ts = time.time()
start_ts = int(time.time())
for token in metadata.get_tokens_for_addr(addr):
queue_item = PersistentQueueItem.create(
self.notification_dir, addr, start_ts, token
@ -130,7 +133,7 @@ class NotifyThread(Thread):
when, queue_item = self.notifier.retry_queues[self.retry_num].get()
if when is None:
return False
wait_time = when - time.time()
wait_time = when - int(time.time())
if wait_time > 0:
sleep(wait_time)
self.perform_request_to_notification_server(requests_session, queue_item)