diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java index 1e0138f7cf90..e50d47923f36 100644 --- a/server/src/main/java/com/cloud/server/StatsCollector.java +++ b/server/src/main/java/com/cloud/server/StatsCollector.java @@ -1286,13 +1286,21 @@ protected Point createInfluxDbPoint(Object metricsObject) { */ class VmStatsCleaner extends ManagedContextRunnable{ protected void runInContext() { - cleanUpVirtualMachineStats(); + try { + cleanUpVirtualMachineStats(); + } catch (CloudRuntimeException e) { + logger.error("Error trying to clean up VM stats", e); + } } } class VolumeStatsCleaner extends ManagedContextRunnable{ protected void runInContext() { - cleanUpVolumeStats(); + try { + cleanUpVolumeStats(); + } catch (CloudRuntimeException e) { + logger.error("Error trying to clean up Volume stats", e); + } } } diff --git a/server/src/test/java/com/cloud/server/StatsCollectorTest.java b/server/src/test/java/com/cloud/server/StatsCollectorTest.java index 3578e6948a45..46449a9cb6ed 100644 --- a/server/src/test/java/com/cloud/server/StatsCollectorTest.java +++ b/server/src/test/java/com/cloud/server/StatsCollectorTest.java @@ -335,6 +335,49 @@ public void cleanUpVirtualMachineStatsTestIsEnabled() { Mockito.verify(vmStatsDaoMock).removeAllByTimestampLessThan(Mockito.any(), Mockito.anyLong()); } + private void setVmDiskStatsMaxRetentionTimeValue(String value) { + StatsCollector.vmDiskStatsMaxRetentionTime = new ConfigKey("Advanced", Integer.class, "vm.disk.stats.max.retention.time", value, + "The maximum time (in minutes) for keeping Volume stats records in the database. The Volume stats cleanup process will be disabled if this is set to 0 or less than 0.", true); + } + + @Test + public void cleanUpVolumeStatsTestIsDisabled() { + setVmDiskStatsMaxRetentionTimeValue("0"); + + statsCollector.cleanUpVolumeStats(); + + Mockito.verify(volumeStatsDao, Mockito.never()).removeAllByTimestampLessThan(Mockito.any(), Mockito.anyLong()); + } + + @Test + public void cleanUpVolumeStatsTestIsEnabled() { + setVmDiskStatsMaxRetentionTimeValue("1"); + + statsCollector.cleanUpVolumeStats(); + + Mockito.verify(volumeStatsDao).removeAllByTimestampLessThan(Mockito.any(), Mockito.anyLong()); + } + + @Test + public void vmStatsCleanerTestCatchesCloudRuntimeExceptionAndKeepsRunning() { + Mockito.doThrow(new CloudRuntimeException("Communications link failure")).when(statsCollector).cleanUpVirtualMachineStats(); + StatsCollector.VmStatsCleaner vmStatsCleaner = statsCollector.new VmStatsCleaner(); + + vmStatsCleaner.run(); + + Mockito.verify(statsCollector).cleanUpVirtualMachineStats(); + } + + @Test + public void volumeStatsCleanerTestCatchesCloudRuntimeExceptionAndKeepsRunning() { + Mockito.doThrow(new CloudRuntimeException("Communications link failure")).when(statsCollector).cleanUpVolumeStats(); + StatsCollector.VolumeStatsCleaner volumeStatsCleaner = statsCollector.new VolumeStatsCleaner(); + + volumeStatsCleaner.run(); + + Mockito.verify(statsCollector).cleanUpVolumeStats(); + } + @Test public void persistVirtualMachineStatsTestPersistsSuccessfully() { statsCollector.msId = 1L;