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

Reply via email to