Martin Peřina has posted comments on this change. Change subject: fklsnr: Introduce standalone fence_kdump listener ......................................................................
Patch Set 12: (19 comments) http://gerrit.ovirt.org/#/c/27201/12/packaging/services/ovirt-fence-kdump-listener/db.py File packaging/services/ovirt-fence-kdump-listener/db.py: Line 165: ) Line 166: ret = self._process_results(cursor=cursor) Line 167: Line 168: if ret is None: Line 169: ret = [] > how ret can be None? Done Line 170: Line 171: self.logger.debug("Result: '%s'", ret) Line 172: return ret Line 173: Line 192: name, Line 193: args, Line 194: ) Line 195: ret = self._process_results(cursor=cursor) Line 196: except (psycopg2.Error, psycopg2.Warning) as e: > why at call procedure you handle error differently? Done Line 197: raise DbException( Line 198: message=( Line 199: "Error calling procedure '%s'" % name Line 200: ), Line 238: value, # v_option_value Line 239: id, # v_option_in Line 240: version, # v_version Line 241: ), Line 242: ) > we do not need these two above, right? Sorry, I forgot to remove them. Line 243: Line 244: def update_vds_kdump_status(self, status, address): Line 245: res = self._db_mgr.call_procedure( Line 246: name='UpsertKdumpStatusForIp', Line 249: status, # v_status Line 250: json.dumps(address), # v_address Line 251: ), Line 252: ) Line 253: return res[0]['upsertkdumpstatusforip'] if res else None > why not return boolean? so you have exception if error and true/false if lo Done Line 254: Line 255: def update_heartbeat(self): Line 256: return self._db_mgr.call_procedure( Line 257: name='UpsertExternalVariable', Line 269: Line 270: for record in result: Line 271: # address needs to be converted from string to tuple Line 272: record['address'] = tuple(json.loads(record['address'])) Line 273: return result > consider: Done Line 274: Line 275: Line 276: class DbException(Exception): Line 277: def __init__(self, message, cause): http://gerrit.ovirt.org/#/c/27201/12/packaging/services/ovirt-fence-kdump-listener/listener.py File packaging/services/ovirt-fence-kdump-listener/listener.py: Line 15: import datetime Line 16: import gettext Line 17: import socket Line 18: import time Line 19: > two spaces Done Line 20: import db Line 21: Line 22: from ovirt_engine import base Line 23: Line 16: import gettext Line 17: import socket Line 18: import time Line 19: Line 20: import db > from . import db, and ove this after the engine import so you have from gen Done Line 21: Line 22: from ovirt_engine import base Line 23: Line 24: _ = lambda m: gettext.dgettext(message=m, domain='ovirt-fence-kdump-listener') Line 17: import socket Line 18: import time Line 19: Line 20: import db Line 21: > two spaces Done Line 22: from ovirt_engine import base Line 23: Line 24: _ = lambda m: gettext.dgettext(message=m, domain='ovirt-fence-kdump-listener') Line 25: Line 136: ) Line 137: ) Line 138: Line 139: # message is valid, update timestamp Line 140: entry['updated'] = datetime.datetime.utcnow() > should be also dirty No, dirty is set to True in run when creating new session (we need to save status 'dumping' to db to signal dumping has started). I don't see a reason why to do db update when status didn't change. Line 141: Line 142: if entry['status'] == self.SESSION_STATE_INITIAL: Line 143: self.logger.debug( Line 144: "Started to dump '%s'", Line 158: if entry['status'] == self.SESSION_STATE_INITIAL: Line 159: entry['status'] = self.SESSION_STATE_CLOSED Line 160: # Host is not dumping now, so receiving invalid messages Line 161: # shouldn't update the db Line 162: entry['dirty'] = False > no need to set dirty as in CLOSED the database layer will not sync Done Line 163: Line 164: def _house_keeping_sessions(self): Line 165: for session in self._sessions.values(): Line 166: Line 191: ): Line 192: self._dao.update_heartbeat() Line 193: self._lastHeartbeat = datetime.datetime.utcnow() Line 194: Line 195: def _save_sessions(self): > what about having separate interval for that? Do we need separate interval? Currently we update heartbeat in db every 5 seconds and in the same interval we update status for hosts which status changed (so it means 1 db update with status 'dumping' and 1 db update with status 'finished' per dumping host). Line 196: # update db state for all updated sessions Line 197: for session in self._sessions.values(): Line 198: if session['dirty']: Line 199: rows_updated = self._dao.update_vds_kdump_status( Line 208: "address '{address}'." Line 209: ).format( Line 210: address=session['address'][0], Line 211: ) Line 212: ) > I am not fund of overflow log with errors... debug ok... please consider to I will change this to debug to get this patch merged, but I think it should be logged as error or warning to notify sysadmin about fence_kdump misconfiguration ... Line 213: # set status to finished to be removed in next step Line 214: session['status'] = self.SESSION_STATE_CLOSED Line 215: Line 216: if session['status'] == self.SESSION_STATE_FINISHED: Line 217: # mark finished session saved to db as close, so they can Line 218: # be removed from sessions on next house keeping Line 219: session['status'] = self.SESSION_STATE_CLOSED Line 220: Line 221: session['dirty'] = False > please move the dirty false immediately after database update, it belongs t Done Line 222: Line 223: def _load_sessions(self): Line 224: if not self._afterFirstDbSync: Line 225: # load sessions from db on 1st successfull db connection Line 227: # if session is not in _sessions, add it, otherwise Line 228: # _sessions contains more up to date session info Line 229: if record['address'] not in self._sessions: Line 230: session = { Line 231: 'status': record['status'], > status is dumping... no need to return anything else from query. Done Line 232: 'address': record['address'], Line 233: 'updated': self._lastDbSync, Line 234: 'dirty': False, Line 235: } Line 229: if record['address'] not in self._sessions: Line 230: session = { Line 231: 'status': record['status'], Line 232: 'address': record['address'], Line 233: 'updated': self._lastDbSync, > this should be now() as we want to count from the moment we loaded, so it w Done Line 234: 'dirty': False, Line 235: } Line 236: self._sessions[session['address']] = session Line 237: Line 231: 'status': record['status'], Line 232: 'address': record['address'], Line 233: 'updated': self._lastDbSync, Line 234: 'dirty': False, Line 235: } > please have one function to construct initial session and override your dat Done Line 236: self._sessions[session['address']] = session Line 237: Line 238: self._afterFirstDbSync = True Line 239: Line 237: Line 238: self._afterFirstDbSync = True Line 239: Line 240: def _db_sync(self): Line 241: if self._db_manager.validate_connection(): > if not self._db_connection_valid we should have a longer interval before re As far as I remember the return from open_connection when db is down was almost instant, but I will check it again to be sure. Line 242: self._db_connection_valid = True Line 243: try: Line 244: self._heartbeat() Line 245: self._save_sessions() Line 243: try: Line 244: self._heartbeat() Line 245: self._save_sessions() Line 246: self._load_sessions() Line 247: self._lastDbSync = datetime.datetime.utcnow() > I do not think we need this ^ Done Line 248: except db.DbException as e: Line 249: self.logger.error( Line 250: _( Line 251: "Error during synchronization with database, " Line 286: message=data, Line 287: ) Line 288: Line 289: Line 290: class InvalidMessage(Exception): > you can have this as inner class Done Line 291: pass Line 292: Line 293: -- To view, visit http://gerrit.ovirt.org/27201 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ieec3bad47bbba860a52a9ff4e2eb7f61277f4e36 Gerrit-PatchSet: 12 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Peřina <mper...@redhat.com> Gerrit-Reviewer: Alon Bar-Lev <alo...@redhat.com> Gerrit-Reviewer: Barak Azulay <bazu...@redhat.com> Gerrit-Reviewer: Eli Mesika <emes...@redhat.com> Gerrit-Reviewer: Martin Peřina <mper...@redhat.com> Gerrit-Reviewer: Oved Ourfali <oourf...@redhat.com> Gerrit-Reviewer: Saggi Mizrahi <smizr...@redhat.com> Gerrit-Reviewer: automat...@ovirt.org Gerrit-Reviewer: oVirt Jenkins CI Server Gerrit-HasComments: Yes _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches