[libvirt] [PATCH 5/7] qemu: Wire up PR_MANAGER_STATUS_CHANGED event
Michal Prívozník
mprivozn at redhat.com
Wed Jul 4 12:42:07 UTC 2018
On 07/04/2018 01:42 PM, Peter Krempa wrote:
> On Wed, Jul 04, 2018 at 12:46:53 +0200, Michal Privoznik wrote:
>> This event is emitted on the monitor if one of pr-managers lost
>> connection to its pr-helper process. What libvirt needs to do is
>> restart the pr-helper process iff it corresponds to managed
>> pr-manager.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/qemu/qemu_monitor.c | 15 +++++++++++++
>> src/qemu/qemu_monitor.h | 11 +++++++++
>> src/qemu/qemu_monitor_json.c | 23 +++++++++++++++++++
>> src/qemu/qemu_process.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
>> 4 files changed, 102 insertions(+)
>
> [...]
>
>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index f200729cb1..94b7de76d7 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -1615,6 +1615,58 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>> }
>>
>>
>> +static int
>> +qemuProcessHandlePRManagerStatusChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>> + virDomainObjPtr vm,
>> + const char *prManager,
>> + bool connected,
>> + void *opaque ATTRIBUTE_UNUSED)
>> +{
>> + qemuDomainObjPrivatePtr priv;
>> + size_t i;
>> + int ret = -1;
>> +
>> + virObjectLock(vm);
>> +
>> + VIR_DEBUG("pr-manager %s status changed for domain %p %s connected=%d",
>> + prManager, vm, vm->def->name, connected);
>> +
>> + if (connected) {
>> + /* Connect events are boring. */
>> + ret = 0;
>> + goto cleanup;
>> + }
>> + /* Disconnect events are more interesting. */
>> +
>> + for (i = 0; i < vm->def->ndisks; i++) {
>> + const char *mgralias;
>> +
>> + mgralias = virStorageSourceChainGetManagedPRAlias(vm->def->disks[i]->src);
>> +
>> + if (STREQ_NULLABLE(prManager, mgralias))
>> + break;
>
> I'm not a fan of this. We always know which is the managed alias
Do we? I thought the whole point of storing it in source private data
was to make it independent of qemuDomainGetManagedPRAlias().
Imagine I started a domain with pr-manager.alias = pr-helper0. Then
restarted libvirtd to upgrade it. This new version has, however,
pr-helper1 as default alias (because reasons). Then all of a sudden I
receive this event with alias pr-helper0 (because that is how I started
the domain). I can't do plain:
STREQ(prManager, qemuDomainGetManagedPRAlias())
can I?
> and we
> also know if it is supposed to be running.
>
> The hotplug code already does not inspect disks to do this since there
> is only one instance.
Sure. But hotplug code does not have to care about old instances.
>
>> + }
>> +
>> + if (i == vm->def->ndisks) {
>> + VIR_DEBUG("pr-manager %s not managed, ignoring event",
>> + prManager);
>> + ret = 0;
>> + goto cleanup;
>> + }
>> +
>> + priv = vm->privateData;
>> + priv->prDaemonRunning = false;
>> +
>> + if (qemuProcessStartManagedPRDaemon(vm) < 0)
>
> This has a timeout built in. Thus executing this from the event loop
> will make the whole libvirtd get stuck until it starts. This should not
> be in the event loop.
Ah good point. I'll rewrite this to run it in the qemu event process
thread (or what do we call it).
>
> Also does every disconnect equal to the daemon crashing/stopping?
It should. If qemu sends us bogus events I'm not sure there's much we
can do about it.
Michal
More information about the libvir-list
mailing list