Refactor main server loop a bit, to add basic retry w/ error logging

hopefully this lets us get past a simple Postgres restart..
This commit is contained in:
Lance Edgar 2017-06-01 17:16:31 -05:00
parent 27adc5ed70
commit c4b371cedd
2 changed files with 20 additions and 17 deletions

View file

@ -92,6 +92,7 @@ class TempmonClient(Daemon):
try: try:
session.commit() session.commit()
except: except:
# TODO: pretty sure we need to add a retry for this..
log.exception("failed to commit changes to database") log.exception("failed to commit changes to database")
raise raise

View file

@ -61,22 +61,28 @@ class TempmonServerDaemon(Daemon):
self.now = make_utc() self.now = make_utc()
session = TempmonSession() session = TempmonSession()
clients = session.query(tempmon.Client)\ try:
.filter(tempmon.Client.enabled == True) clients = session.query(tempmon.Client)\
for client in clients: .filter(tempmon.Client.enabled == True)
self.check_readings_for_client(session, client) for client in clients:
self.check_readings_for_client(session, client)
session.commit() except:
session.close() log.exception("Failed to check client probe readings (but will keep trying)")
session.rollback()
# TODO: not sure this is really necessary? else:
self.set_last_checked() session.commit()
finally:
session.close()
def check_readings_for_client(self, session, client): def check_readings_for_client(self, session, client):
delay = client.delay or 60 delay = client.delay or 60
cutoff = self.now - datetime.timedelta(seconds=delay + 60) cutoff = self.now - datetime.timedelta(seconds=delay + 60)
online = False
for probe in client.enabled_probes(): for probe in client.enabled_probes():
self.check_readings_for_probe(session, probe, cutoff) online = bool(self.check_readings_for_probe(session, probe, cutoff))
if not online and client.online:
log.info("marking client as OFFLINE: {}".format(client))
client.online = False
def check_readings_for_probe(self, session, probe, cutoff): def check_readings_for_probe(self, session, probe, cutoff):
readings = session.query(tempmon.Reading)\ readings = session.query(tempmon.Reading)\
@ -103,6 +109,8 @@ class TempmonServerDaemon(Daemon):
else: # no readings for probe else: # no readings for probe
self.update_status(probe, self.enum.TEMPMON_PROBE_STATUS_ERROR) self.update_status(probe, self.enum.TEMPMON_PROBE_STATUS_ERROR)
return readings
def update_status(self, probe, status, reading=None): def update_status(self, probe, status, reading=None):
data = { data = {
'probe': probe, 'probe': probe,
@ -154,12 +162,6 @@ class TempmonServerDaemon(Daemon):
probe.status_alert_sent = self.now probe.status_alert_sent = self.now
def set_last_checked(self):
session = Session()
api.save_setting(session, 'tempmon.server.last_checked', self.now.strftime(self.timefmt))
session.commit()
session.close()
def make_daemon(config, pidfile=None): def make_daemon(config, pidfile=None):
""" """