mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
hypervisor: add support for delay interval during autostart
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>
This commit is contained in:
parent
c23554fc34
commit
1e9d58ef49
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user