Skip to content

Commit b02d862

Browse files
Vineeth Pillaibryteise
authored andcommitted
ch_monitor: Minor refactor of the cloud-hypervisor crash detection
Signed-off-by: Vineeth Pillai <viremana@linux.microsoft.com>
1 parent 77e469c commit b02d862

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

src/ch/ch_monitor.c

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,26 @@ static int virCHMonitorValidateEventsJSON(virCHMonitorPtr mon,
704704
return events;
705705
}
706706

707+
/*
708+
* Caller should have locked the Domain
709+
*/
710+
static inline int virCHMonitorShutdownVm(virDomainObjPtr vm,
711+
virDomainShutoffReason reason)
712+
{
713+
virCHDriverPtr driver = CH_DOMAIN_PRIVATE(vm)->driver;
714+
g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
715+
716+
if (virCHDomainObjBeginJob(vm, CH_JOB_MODIFY))
717+
return -1;
718+
719+
virCHProcessStop(driver, vm, reason);
720+
if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir))
721+
VIR_WARN("Failed to persist the domain after shutdown!");
722+
virCHDomainObjEndJob(vm);
723+
724+
return 0;
725+
}
726+
707727
/*
708728
* Caller should have reference on Monitor and Domain
709729
*/
@@ -750,21 +770,15 @@ static int virCHMonitorProcessEvent(virCHMonitorPtr mon,
750770
case virCHMonitorVmmEventShutdown: // shutdown inside vmm
751771
case virCHMonitorVmEventShutdown:
752772
{
753-
g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
754773
virDomainState state;
755774

756775
virObjectLock(vm);
757776
state = virDomainObjGetState(vm, NULL);
758777
if ((ev == virCHMonitorVmmEventShutdown ||
759-
state == VIR_DOMAIN_SHUTDOWN) &&
760-
(virCHDomainObjBeginJob(vm, CH_JOB_MODIFY) == 0)) {
761-
762-
if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir))
763-
VIR_WARN("Failed to persist the domain after shutdown!");
764-
765-
virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
766-
767-
virCHDomainObjEndJob(vm);
778+
state == VIR_DOMAIN_SHUTDOWN)) {
779+
if (virCHMonitorShutdownVm(vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN))
780+
VIR_WARN("Failed to mark the VM(%s) as SHUTDOWN!",
781+
vm->def->name);
768782
}
769783
virObjectUnlock(vm);
770784
break;
@@ -936,10 +950,16 @@ static int virCHMonitorReadProcessEvents(virCHMonitorPtr mon,
936950

937951
ret = read(monitor_fd, buf + sz, max_sz - sz);
938952
if (ret == 0 || (ret < 0 && errno == EINTR)) {
939-
if ((virPidFileReadPathIfAlive(priv->pidfile, &pid, priv->ch_path)) < 0 || (pid < 0)) {
940-
virCHProcessStop(CH_DOMAIN_PRIVATE(vm)->driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED);
941-
return -1;
953+
if (virPidFileReadPathIfAlive(priv->pidfile, &pid, priv->ch_path) < 0 ||
954+
(pid < 0)) {
955+
virObjectLock(vm);
956+
if (virCHMonitorShutdownVm(vm, VIR_DOMAIN_SHUTOFF_CRASHED))
957+
VIR_WARN("Failed to mark the VM(%s) as SHUTDOWN!",
958+
vm->def->name);
959+
virObjectUnlock(vm);
960+
return 0;
942961
}
962+
943963
g_usleep(G_USEC_PER_SEC);
944964
continue;
945965
} else if (ret < 0) {

0 commit comments

Comments
 (0)