On Thu, Sep 26, 2024 at 11:27:01AM -0500, Praveen K Paladugu wrote:
On 9/19/2024 8:02 AM, Purna Pavan Chandra Aekkaladevi wrote:
> Implement `virCHProcessEvent` that maps event string to corresponding
> event type and take appropriate actions. As part of this, handle the
> shutdown event by correctly updating the domain state. this change also
> facilitates the handling of other VM lifecycle events, such as booting,
> rebooting, pause, resume, etc.
>
> Signed-off-by: Purna Pavan Chandra Aekkaladevi
<paekkaladevi(a)linux.microsoft.com>
> ---
> src/ch/ch_events.c | 103 ++++++++++++++++++++++++++++++++++++++++++++-
> src/ch/ch_events.h | 26 ++++++++++++
> 2 files changed, 128 insertions(+), 1 deletion(-)
>
> diff --git a/src/ch/ch_events.c b/src/ch/ch_events.c
> index a028f9813e..6ed03d1c90 100644
> --- a/src/ch/ch_events.c
> +++ b/src/ch/ch_events.c
> @@ -22,12 +22,110 @@
> #include <fcntl.h>
> +#include "ch_domain.h"
> #include "ch_events.h"
> +#include "ch_process.h"
> #include "virfile.h"
> #include "virlog.h"
> VIR_LOG_INIT("ch.ch_events");
> +VIR_ENUM_IMPL(virCHEvent,
> + VIR_CH_EVENT_LAST,
> + "vmm:starting",
> + "vmm:shutdown",
> + "vm:booting",
> + "vm:booted",
> + "vm:rebooting",
> + "vm:rebooted",
> + "vm:shutdown",
> + "vm:deleted",
> + "vm:pausing",
> + "vm:paused",
> + "vm:resuming",
> + "vm:resumed",
> + "vm:snapshotting",
> + "vm:snapshotted",
> + "vm:restoring",
> + "vm:restored",
> +);
> +
> +static int virCHEventStopProcess(virDomainObj *vm,
> + virDomainShutoffReason reason)
> +{
> + virCHDriver *driver = ((virCHDomainObjPrivate
*)vm->privateData)->driver;
> +
> + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY))
> + return -1;
> + virCHProcessStop(driver, vm, reason);
> + virDomainObjEndJob(vm);
> +
> + return 0;
> +}
> +
> +static int virCHProcessEvent(virCHMonitor *mon,
> + virJSONValue *eventJSON)
> +{
> + const char *event;
> + const char *source;
> + virCHEvent ev;
> + g_autofree char *timestamp = NULL;
> + g_autofree char *full_event = NULL;
> + virDomainObj *vm = mon->vm;
> + int ret = 0;
> +
> + if (virJSONValueObjectHasKey(eventJSON, "source") == 0) {
> + VIR_WARN("Invalid JSON from monitor, no source key");
> + return -1;
> + }
> + if (virJSONValueObjectHasKey(eventJSON, "event") == 0) {
> + VIR_WARN("Invalid JSON from monitor, no event key");
> + return -1;
> + }
> + source = virJSONValueObjectGetString(eventJSON, "source");
> + event = virJSONValueObjectGetString(eventJSON, "event");
> + full_event = g_strdup_printf("%s:%s", source, event);
> + ev = virCHEventTypeFromString(full_event);
> + VIR_DEBUG("Source: %s Event: %s, ev: %d", source, event, ev);
> +
> + switch (ev) {
> + case VIR_CH_EVENT_VMM_STARTING:
> + case VIR_CH_EVENT_VM_BOOTING:
> + case VIR_CH_EVENT_VM_BOOTED:
> + case VIR_CH_EVENT_VM_REBOOTING:
> + case VIR_CH_EVENT_VM_REBOOTED:
> + case VIR_CH_EVENT_VM_PAUSING:
> + case VIR_CH_EVENT_VM_PAUSED:
> + case VIR_CH_EVENT_VM_RESUMING:
> + case VIR_CH_EVENT_VM_RESUMED:
> + case VIR_CH_EVENT_VM_SNAPSHOTTING:
> + case VIR_CH_EVENT_VM_SNAPSHOTTED:
> + case VIR_CH_EVENT_VM_RESTORING:
> + case VIR_CH_EVENT_VM_RESTORED:
> + case VIR_CH_EVENT_VM_DELETED:
> + break;
> + case VIR_CH_EVENT_VMM_SHUTDOWN:
> + virObjectLock(vm);
> + if (virCHEventStopProcess(vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN)) {
> + VIR_WARN("Failed to mark the VM(%s) as SHUTDOWN!",
> + vm->def->name);
> + ret = -1;
> + }
> + virObjectUnlock(vm);
> + break;
> + case VIR_CH_EVENT_VM_SHUTDOWN:
> + virObjectLock(vm);
> + virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_SHUTDOWN);
Is the ch process already killed in this scenario?
Yes, vmm shutdown event is raised when the process is terminated.
With master branch, I dont the CH process running anymore after issue
`shutdown` command from within the domain.
> > + virObjectUnlock(vm);
> > + break;
> > + case VIR_CH_EVENT_LAST:
> > + default:
> > + VIR_WARN("Unknown event: %s", full_event);
> > + }
> > +
> > + return ret;
> > +}
> > +
> > static int virCHProcessEvents(virCHMonitor *mon)
> > {
> > char *buf = mon->event_buffer.buffer;
> > @@ -88,7 +186,10 @@ static int virCHProcessEvents(virCHMonitor *mon)
> > json_start = buf + start_index;
> > if ((obj = virJSONValueFromString(json_start))) {
> > - /* Process the event string (obj) here */
> > + if (virCHProcessEvent(mon, obj) < 0) {
> > + VIR_WARN("Failed to process JSON event doc:
%s", json_start);
> > + ret = -1;
> > + }
> > virJSONValueFree(obj);
> > } else {
> > VIR_WARN("Invalid JSON event doc: %s",
json_start);
> > diff --git a/src/ch/ch_events.h b/src/ch/ch_events.h
> > index 2e9cdf03bb..3b360628f7 100644
> > --- a/src/ch/ch_events.h
> > +++ b/src/ch/ch_events.h
> > @@ -24,5 +24,31 @@
> > #define CH_EVENT_BUFFER_SZ PIPE_BUF
> > +typedef enum {
> > + /* source: vmm */
> > + VIR_CH_EVENT_VMM_STARTING = 0,
> > + VIR_CH_EVENT_VMM_SHUTDOWN,
> > +
> > + /* source: vm */
> > + VIR_CH_EVENT_VM_BOOTING,
> > + VIR_CH_EVENT_VM_BOOTED,
> > + VIR_CH_EVENT_VM_REBOOTING,
> > + VIR_CH_EVENT_VM_REBOOTED,
> > + VIR_CH_EVENT_VM_SHUTDOWN,
> > + VIR_CH_EVENT_VM_DELETED,
> > + VIR_CH_EVENT_VM_PAUSING,
> > + VIR_CH_EVENT_VM_PAUSED,
> > + VIR_CH_EVENT_VM_RESUMING,
> > + VIR_CH_EVENT_VM_RESUMED,
> > + VIR_CH_EVENT_VM_SNAPSHOTTING,
> > + VIR_CH_EVENT_VM_SNAPSHOTTED,
> > + VIR_CH_EVENT_VM_RESTORING,
> > + VIR_CH_EVENT_VM_RESTORED,
> > +
> > + VIR_CH_EVENT_LAST
> > +} virCHEvent;
> > +
> > +VIR_ENUM_DECL(virCHEvent);
> > +
> > int virCHStartEventHandler(virCHMonitor *mon);
> > void virCHStopEventHandler(virCHMonitor *mon);
>
> --
> Regards,
> Praveen K Paladugu