[GSoC][PATCH 3/7] qemu_domainjob: add `saveDomainStatus` as a callback function to jobs
Prathamesh Chavan
pc44800 at gmail.com
Sun Aug 23 20:18:47 UTC 2020
I have decided to go with the nested callback structure. I'll be
posting a patch related to the same soon.
On Wed, Aug 12, 2020 at 5:35 PM Erik Skultety <eskultet at redhat.com> wrote:
>
> On Tue, Aug 04, 2020 at 08:06:45PM +0530, Prathamesh Chavan wrote:
> > The function `qemuDomainObjSaveStatus` required an access to
> > `virQEMUDriverPtr`.
> > To make jobs hypervisor-agnostic we remove this funciton
> > and replace it with a callback function from `qemuDomainJob`
> >
> > Removal of `virQEMUDriverPtr` as parameter resulted in
> > removal of the same from function, where it was pass.
> > All of such references were removed as the variable
> > was no longer required.
> >
> > Signed-off-by: Prathamesh Chavan <pc44800 at gmail.com>
> > ---
> > src/qemu/qemu_backup.c | 41 +-
> > src/qemu/qemu_backup.h | 3 +-
> > src/qemu/qemu_block.c | 45 +-
> > src/qemu/qemu_block.h | 6 +-
> > src/qemu/qemu_blockjob.c | 45 +-
> > src/qemu/qemu_blockjob.h | 3 +-
> > src/qemu/qemu_checkpoint.c | 29 +-
> > src/qemu/qemu_domain.c | 78 ++-
> > src/qemu/qemu_domain.h | 24 +-
> > src/qemu/qemu_domainjob.c | 50 +-
> > src/qemu/qemu_domainjob.h | 29 +-
> > src/qemu/qemu_driver.c | 848 ++++++++++++++-----------------
> > src/qemu/qemu_hotplug.c | 319 ++++++------
> > src/qemu/qemu_hotplug.h | 30 +-
> > src/qemu/qemu_migration.c | 315 +++++-------
> > src/qemu/qemu_migration.h | 12 +-
> > src/qemu/qemu_migration_cookie.c | 7 +-
> > src/qemu/qemu_migration_params.c | 48 +-
> > src/qemu/qemu_migration_params.h | 15 +-
> > src/qemu/qemu_process.c | 258 +++++-----
> > src/qemu/qemu_process.h | 15 +-
> > tests/qemuhotplugtest.c | 2 +-
> > 22 files changed, 986 insertions(+), 1236 deletions(-)
> >
>
> Hi, I'm sorry for the delay, but I spent a while thinking about other
> approaches to achieve the same what I'm commenting on below. I had to verify
> every single idea by debugging libvirt so that I would not propose something
> that was impossible to do and by doing that, I realized a very interesting
> circular data reference we have:
> (QEMU)driver->xmlopt->config.priv->(QEMU)driver
>
> ...
>
> > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> > index 677fa7ea91..d7a944a886 100644
> > --- a/src/qemu/qemu_domain.c
> > +++ b/src/qemu/qemu_domain.c
> > @@ -634,6 +634,7 @@ static qemuDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks = {
> > .allocJobPrivate = qemuJobAllocPrivate,
> > .freeJobPrivate = qemuJobFreePrivate,
> > .resetJobPrivate = qemuJobResetPrivate,
> > + .saveStatus = qemuDomainSaveStatus,
> > .formatJob = qemuDomainFormatJobPrivate,
> > .parseJob = qemuDomainParseJobPrivate,
> > .setJobInfoOperation =qemuDomainJobInfoSetOperation,
>
> Okay, ^this does the job, it works, but I would call it the easy way out.
> The qemuPrivateJobCallbacks structure hints that it contains callbacks specific
> to job handling to which qemuDomainSaveStatus is simply not related at all.
> It just so happens, that we have to save the domain status basically every time
> we're doing something to the VM.
> Structurally, I see 2 ways to achieve the same code extraction properly.
> First, having another structure for callbacks which would nest the existing
> qemuPrivateJobCallbacks, IOW:
>
> struct _qemuDomainObjPrivateCallbacks {
> /* generic callbacks that we can't really categorize */
> qemuDomainObjPrivateSaveStatus saveStatus;
>
> /* Job related callbacks */
> qemuDomainObjPrivateJobCallbacks jobcb;
> }
>
> We'd then pass ^this structure instead of the qemuDomainObjPrivateJobCallbacks
> one at the relevant places.
>
> I don't like the ^this solution that much either, but I wanted to mention it.
>
> I think what we need to do instead is to look what qemuDomainSaveStatus or
> qemuDomainObjSaveStatus really need. They need to access the driver and its
> config, that's it. In that perspective it relates to the virDomainObj's private
> data.
> Specifically for qemuDomainObjSaveStatus:
>
> ...
> if (virDomainObjIsActive(obj))
> ...
>
> ^This check can easily be extracted to the virDomainObjSave function, there's
> not reason why it should be specific to QEMU only.
>
> ...
> if (virDomainObjSave(obj, driver->xmlopt, cfg->stateDir) < 0)
> ...
>
> ^This is the thing we need to call from the hypervisor-agnostic code, except we
> don't have @driver (note that for example libxl doesn't have @driver as
> part of the virDomainObj's private data).
>
> Considering the above, we need a generic wrapper over virDomainObjSave, let's
> call it virDomainDriverObjSave:
>
> void virDomainDriverObjSave(virDomainObjPtr obj) {
> return obj->privateDataCallbacks.saveStatus(obj);
> }
>
> struct _virDomainObj {
> ...
> void *privateData;
> void (*privateDataFreeFunc) (void *);
> virDomainObjSaveStatusCallbackPtr saveStatus; <<<<<<<<<
> ...
> };
>
>
> The saveStatus callback would then have to live inside xmlopt callbacks and
> be copied over in virDomainObjNew (just like we copy the free callback).
> This is far from ideal, as it involves @xmlopt as we should not be interacting
> with it, but we're already abusing the @xmlopt on so many places that it's such
> an integral part of libvirt that refactoring how and where we use @xmlopt (see
> the circular referencing above) is IMO beyond even a standalone GSoC project.
>
> Alternatively in:
> struct _virDomainObj {
> ...
> void *privateData;
> virDomainObjPrivateDataCallbacks cb;
> ...
> }
>
> and then
>
> struct _virDomainObjPrivateDataCallbacks {
> void (*free) (void *);
> void (*saveStatus) (virDomainObjPtr);
> }
>
> However, ^this would break the consistency we use for freeing privateData in
> object Dispose functions for example for StoragePools, Volumes, Domains, etc.
> And since I am a fan of consistency, I would not favour ^this alternative.
>
> Erik
>
More information about the libvir-list
mailing list