]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
hypervisor: add support for delay interval during autostart
authorDaniel P. Berrangé <berrange@redhat.com>
Mon, 16 Dec 2024 19:45:23 +0000 (19:45 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 12 Feb 2025 18:05:56 +0000 (18:05 +0000)
This delay can reduce the CPU/IO load storm when autostarting many
guests.

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/hypervisor/domain_driver.c
src/hypervisor/domain_driver.h

index 596157545b1e645a8df7241e2fc823c60759ccb7..bea84cd09d27e9a558c0bb73e51680b1921389f5 100644 (file)
@@ -656,11 +656,16 @@ virDomainDriverGetIOThreadsConfig(virDomainDef *targetDef,
     return ret;
 }
 
+typedef struct _virDomainDriverAutoStartState {
+    virDomainDriverAutoStartConfig *cfg;
+    bool first;
+} virDomainDriverAutoStartState;
+
 static int
 virDomainDriverAutoStartOne(virDomainObj *vm,
                             void *opaque)
 {
-    virDomainDriverAutoStartConfig *cfg = opaque;
+    virDomainDriverAutoStartState *state = opaque;
 
     virObjectLock(vm);
     virObjectRef(vm);
@@ -670,7 +675,15 @@ virDomainDriverAutoStartOne(virDomainObj *vm,
 
     if (vm->autostart && !virDomainObjIsActive(vm)) {
         virResetLastError();
-        cfg->callback(vm, cfg->opaque);
+        if (state->cfg->delayMS) {
+            if (!state->first) {
+                g_usleep(state->cfg->delayMS * 1000ull);
+            } else {
+                state->first = false;
+            }
+        }
+
+        state->cfg->callback(vm, state->cfg->opaque);
     }
 
     virDomainObjEndAPI(&vm);
@@ -683,6 +696,7 @@ void
 virDomainDriverAutoStart(virDomainObjList *domains,
                          virDomainDriverAutoStartConfig *cfg)
 {
+    virDomainDriverAutoStartState state = { .cfg = cfg, .first = true };
     bool autostart;
     VIR_DEBUG("Run autostart stateDir=%s", cfg->stateDir);
     if (virDriverShouldAutostart(cfg->stateDir, &autostart) < 0 ||
@@ -691,5 +705,5 @@ virDomainDriverAutoStart(virDomainObjList *domains,
         return;
     }
 
-    virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, cfg);
+    virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, &state);
 }
index 2ad4e96f3e6c97ea26d8cc73ba78075b10b36d37..f81d436c2cf6e635444878e20c115855535d86a8 100644 (file)
@@ -84,6 +84,8 @@ typedef struct _virDomainDriverAutoStartConfig {
     const char *stateDir;
     virDomainDriverAutoStartCallback callback;
     void *opaque;
+    unsigned int delayMS; /* milliseconds to wait between initiating the
+                           * startup of each guest */
 } virDomainDriverAutoStartConfig;
 
 void virDomainDriverAutoStart(virDomainObjList *domains,