From 73b9653cfe3d415987af6249fd0d96763b33672a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 20 Jun 2021 17:49:27 -0500 Subject: [PATCH] mgr/devicehealth: fix _get_device_metrics ValueError This appears to have broken with abd35d47696c208990355395d48c1c1e261de95c The SQL OR doesn't work because in the case that sample is passed, _t2epoch(min_sample) is 0 and the 0 <= time portion of the expression is always true. Fixes: https://tracker.ceph.com/issues/51294 Signed-off-by: Sage Weil --- src/pybind/mgr/devicehealth/module.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/pybind/mgr/devicehealth/module.py b/src/pybind/mgr/devicehealth/module.py index d42a7cecd8e..e407c2cb321 100644 --- a/src/pybind/mgr/devicehealth/module.py +++ b/src/pybind/mgr/devicehealth/module.py @@ -526,7 +526,7 @@ CREATE TABLE DeviceHealthMetrics ( self.set_device_wear_level(devid, -1.0) def _t2epoch(self, t: Optional[str]) -> int: - if t is None: + if not t: return 0 else: return int(datetime.strptime(t, TIME_FORMAT).strftime("%s")) @@ -536,20 +536,33 @@ CREATE TABLE DeviceHealthMetrics ( min_sample: Optional[str] = None) -> Dict[str, Dict[str, Any]]: res = {} - SQL = """ + SQL_EXACT = """ SELECT time, raw_smart FROM DeviceHealthMetrics - WHERE devid = ? AND (time = ? OR ? <= time) + WHERE devid = ? AND time = ? + ORDER BY time DESC; + """ + SQL_MIN = """ + SELECT time, raw_smart + FROM DeviceHealthMetrics + WHERE devid = ? AND ? <= time ORDER BY time DESC; """ - isample = self._t2epoch(sample) - imin_sample = self._t2epoch(min_sample) + isample = None + imin_sample = None + if sample: + isample = self._t2epoch(sample) + else: + imin_sample = self._t2epoch(min_sample) self.log.debug(f"_get_device_metrics: {devid} {sample} {min_sample}") with self._db_lock, self.db: - cursor = self.db.execute(SQL, (devid, isample, imin_sample)) + if isample: + cursor = self.db.execute(SQL_EXACT, (devid, isample)) + else: + cursor = self.db.execute(SQL_MIN, (devid, imin_sample)) for row in cursor: t = row['time'] dt = datetime.utcfromtimestamp(t).strftime(TIME_FORMAT) -- 2.39.5