]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/devicehealth: fix _get_device_metrics ValueError 41946/head
authorSage Weil <sage@newdream.net>
Sun, 20 Jun 2021 22:49:27 +0000 (17:49 -0500)
committerSage Weil <sage@newdream.net>
Thu, 24 Jun 2021 19:55:32 +0000 (14:55 -0500)
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 <sage@newdream.net>
src/pybind/mgr/devicehealth/module.py

index d42a7cecd8ed9cc3191ea1a2db26588bc30d9baa..e407c2cb32193cb43069387ea4a709dc532b45d0 100644 (file)
@@ -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)