diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java
index 1e0138f7cf90..ca8d95c74c56 100644
--- a/server/src/main/java/com/cloud/server/StatsCollector.java
+++ b/server/src/main/java/com/cloud/server/StatsCollector.java
@@ -1285,14 +1285,24 @@ protected Point createInfluxDbPoint(Object metricsObject) {
* can be enabled/disabled independently.
*/
class VmStatsCleaner extends ManagedContextRunnable{
+ @Override
protected void runInContext() {
- cleanUpVirtualMachineStats();
+ try {
+ cleanUpVirtualMachineStats();
+ } catch (RuntimeException e) {
+ logger.error("Error trying to clean up VM stats", e);
+ }
}
}
class VolumeStatsCleaner extends ManagedContextRunnable{
+ @Override
protected void runInContext() {
- cleanUpVolumeStats();
+ try {
+ cleanUpVolumeStats();
+ } catch (RuntimeException 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;