guard against stopping stats background threads (#13659)

* guard against stopping stats background threats

* stats cleanup test

* override annotation, and specic and generic enough catch

---------

Co-authored-by: Daan Hoogland <dahn@apache.org>
This commit is contained in:
dahn 2026-08-17 09:42:54 +02:00 committed by GitHub
parent 69fc541737
commit 1e5d534c3c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 2 deletions

View File

@ -1285,14 +1285,24 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
* can be enabled/disabled independently.</p>
*/
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);
}
}
}

View File

@ -335,6 +335,49 @@ public class StatsCollectorTest {
Mockito.verify(vmStatsDaoMock).removeAllByTimestampLessThan(Mockito.any(), Mockito.anyLong());
}
private void setVmDiskStatsMaxRetentionTimeValue(String value) {
StatsCollector.vmDiskStatsMaxRetentionTime = new ConfigKey<Integer>("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;