]> git.basschouten.com Git - openhab-addons.git/commitdiff
[rrd4j] Avoid IAE thrown if e.g. invalid start/end time given (#14238)
authorChristoph Weitkamp <github@christophweitkamp.de>
Fri, 20 Jan 2023 10:58:47 +0000 (11:58 +0100)
committerGitHub <noreply@github.com>
Fri, 20 Jan 2023 10:58:47 +0000 (11:58 +0100)
Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java

index b2a40a6aeb461701f3b4e8ce820e6154b9811811..4359dc8b6a7532e1afca1c125b01b34f89a2be32 100644 (file)
@@ -280,7 +280,10 @@ public class RRD4jPersistenceService implements QueryablePersistenceService {
         }
 
         long start = 0L;
-        long end = filter.getEndDate() == null ? System.currentTimeMillis() / 1000
+        // set end to {@link Instant#MAX} instead of current timestamp to enable requesting future time ranges including
+        // boundary values via REST API
+        // see discussion in https://github.com/openhab/openhab-addons/pull/14238
+        long end = filter.getEndDate() == null ? Instant.MAX.getEpochSecond()
                 : filter.getEndDate().toInstant().getEpochSecond();
 
         try {
@@ -308,13 +311,21 @@ public class RRD4jPersistenceService implements QueryablePersistenceService {
                         start = end;
                     }
                 } else {
-                    throw new UnsupportedOperationException("rrd4j does not allow querys without a begin date, "
-                            + "unless order is descending and a single value is requested");
+                    throw new UnsupportedOperationException(
+                            "rrd4j does not allow querys without a begin date, unless order is descending and a single value is requested");
                 }
             } else {
                 start = filter.getBeginDate().toInstant().getEpochSecond();
             }
 
+            // do not call method {@link RrdDb#createFetchRequest(ConsolFun, long, long, long)} if start > end to avoid
+            // an IAE to be thrown
+            if (start > end) {
+                logger.warn("Could not query rrd4j database for item '{}': start ({}) > end ({})", itemName, start,
+                        end);
+                return List.of();
+            }
+
             FetchRequest request = db.createFetchRequest(getConsolidationFunction(db), start, end, 1);
             FetchData result = request.fetchData();