[libvirt] [RFC 0/1] convert virStorageSource to GObject

Daniel Henrique Barboza posted 1 patch 4 years, 6 months ago
Test syntax-check passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20191015124246.27071-1-danielhb413@gmail.com
src/conf/domain_conf.c                | 13 ++---
src/conf/snapshot_conf.c              |  3 +-
src/qemu/qemu_blockjob.c              | 43 ++++++--------
src/qemu/qemu_domain.c                |  6 +-
src/qemu/qemu_driver.c                | 14 ++---
src/qemu/qemu_hotplug.c               |  3 +-
src/qemu/qemu_migration.c             |  2 +-
src/storage/storage_backend_gluster.c |  2 +-
src/storage/storage_util.c            |  4 +-
src/util/virstoragefile.c             | 84 +++++++++++++--------------
src/util/virstoragefile.h             |  9 ++-
tests/qemublocktest.c                 |  6 +-
tests/virstoragetest.c                | 12 ++--
13 files changed, 98 insertions(+), 103 deletions(-)
[libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Daniel Henrique Barboza 4 years, 6 months ago
I was hoping to quickly re-send the qemu_driver cleanups I've
sent some time ago, now using Glib. I started by attempting to
change the first VIR_AUTOUNREF() call in qemu_driver.c to
g_autoptr(), which happens to be a virStorageSourcePtr type,
then I realized that it wasn't that simple.

Following up the instructions found on commit 16121a88a7, I started
the conversion. Then 'make check' started to fail because some
calls to virObjectRef/virObjectUnref were still remaining
in the code, messing up stuff related with mirrorChain in
qemu_blockjob.c. Turns out it was easier to burn through all the
instances and change them to use GLib.

This is being sent as RFC because x-I am aware that docs/hacking.html
mentions that we shouldn't mix up certain GLib macros with Libvirt
ones, thus I am uncertain of whether I have messed up or not.
'make check' works, did a few sanity checks with libvirtd as
well.

Hopefully this is somewhere near the mark. I intend to do such
convertions from time to time, based on the cleanups I wanted to
make in the qemu_driver file prior to the GLib introduction.


Daniel Henrique Barboza (1):
  util: convert virStorageSource class to use GObject

 src/conf/domain_conf.c                | 13 ++---
 src/conf/snapshot_conf.c              |  3 +-
 src/qemu/qemu_blockjob.c              | 43 ++++++--------
 src/qemu/qemu_domain.c                |  6 +-
 src/qemu/qemu_driver.c                | 14 ++---
 src/qemu/qemu_hotplug.c               |  3 +-
 src/qemu/qemu_migration.c             |  2 +-
 src/storage/storage_backend_gluster.c |  2 +-
 src/storage/storage_util.c            |  4 +-
 src/util/virstoragefile.c             | 84 +++++++++++++--------------
 src/util/virstoragefile.h             |  9 ++-
 tests/qemublocktest.c                 |  6 +-
 tests/virstoragetest.c                | 12 ++--
 13 files changed, 98 insertions(+), 103 deletions(-)

-- 
2.21.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Peter Krempa 4 years, 6 months ago
On Tue, Oct 15, 2019 at 09:42:45 -0300, Daniel Henrique Barboza wrote:
> I was hoping to quickly re-send the qemu_driver cleanups I've
> sent some time ago, now using Glib. I started by attempting to
> change the first VIR_AUTOUNREF() call in qemu_driver.c to
> g_autoptr(), which happens to be a virStorageSourcePtr type,
> then I realized that it wasn't that simple.
> 
> Following up the instructions found on commit 16121a88a7, I started
> the conversion. Then 'make check' started to fail because some
> calls to virObjectRef/virObjectUnref were still remaining
> in the code, messing up stuff related with mirrorChain in
> qemu_blockjob.c. Turns out it was easier to burn through all the
> instances and change them to use GLib.
> 
> This is being sent as RFC because x-I am aware that docs/hacking.html
> mentions that we shouldn't mix up certain GLib macros with Libvirt
> ones, thus I am uncertain of whether I have messed up or not.
> 'make check' works, did a few sanity checks with libvirtd as
> well.
> 
> Hopefully this is somewhere near the mark. I intend to do such
> convertions from time to time, based on the cleanups I wanted to
> make in the qemu_driver file prior to the GLib introduction.

I'd prefer if this kind of experiments is done on something simpler than
virStorageSource.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Daniel P. Berrangé 4 years, 6 months ago
On Tue, Oct 15, 2019 at 09:42:45AM -0300, Daniel Henrique Barboza wrote:
> I was hoping to quickly re-send the qemu_driver cleanups I've
> sent some time ago, now using Glib. I started by attempting to
> change the first VIR_AUTOUNREF() call in qemu_driver.c to
> g_autoptr(), which happens to be a virStorageSourcePtr type,
> then I realized that it wasn't that simple.

It should be that simple with this commit:

  commit 667ff797e8eb8d82f30ab430216a8d2eef6b915a
  Author: Daniel P. Berrangé <berrange@redhat.com>
  Date:   Fri Oct 4 17:14:10 2019 +0100

    src: add support for g_autoptr with virObject instances

we should be able to use g_autoptr for any virObject, without
having to lock-step convert to GObject.

What actual problem did you find ?

> Following up the instructions found on commit 16121a88a7, I started
> the conversion. Then 'make check' started to fail because some
> calls to virObjectRef/virObjectUnref were still remaining
> in the code, messing up stuff related with mirrorChain in
> qemu_blockjob.c. Turns out it was easier to burn through all the
> instances and change them to use GLib.

Yes, if you convert from virObject to GObject, you *must*
convert all virObjectRef/Unref calls at that time.

> This is being sent as RFC because x-I am aware that docs/hacking.html
> mentions that we shouldn't mix up certain GLib macros with Libvirt
> ones, thus I am uncertain of whether I have messed up or not.
> 'make check' works, did a few sanity checks with libvirtd as
> well.

Yes, the need to not mix  g_auto* with VIR_AUTO*, is why I did commit
667ff797e8eb8d82f30ab430216a8d2eef6b915a to let you use g_autoptr
with virObject, without first converting to GObject.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Daniel Henrique Barboza 4 years, 6 months ago

On 10/15/19 9:55 AM, Daniel P. Berrangé wrote:
> On Tue, Oct 15, 2019 at 09:42:45AM -0300, Daniel Henrique Barboza wrote:
>> I was hoping to quickly re-send the qemu_driver cleanups I've
>> sent some time ago, now using Glib. I started by attempting to
>> change the first VIR_AUTOUNREF() call in qemu_driver.c to
>> g_autoptr(), which happens to be a virStorageSourcePtr type,
>> then I realized that it wasn't that simple.
> It should be that simple with this commit:
>
>    commit 667ff797e8eb8d82f30ab430216a8d2eef6b915a
>    Author: Daniel P. Berrangé <berrange@redhat.com>
>    Date:   Fri Oct 4 17:14:10 2019 +0100
>
>      src: add support for g_autoptr with virObject instances
>
> we should be able to use g_autoptr for any virObject, without
> having to lock-step convert to GObject.
>
> What actual problem did you find ?

I failed to notice this commit. Just tried it again and it worked.

What happened yesterday was that I attempted to do a simple
VIR_AUTOUNREF -> g_autopt replace, faced compile errors and then, since
I didn't notice this commit about, I assumed "I guess I need to convert
this guy to GObject".

In fact, the compile error happened because g_autoptr() does not operate
with a 'Ptr' type - something that I learned only during the conversion
process.

Well, hopefully this patch can serve as a baseline for a future 
conversion for
this object type. Guess I can go back safely to re-send the cleanup 
patches tha
  are already pending in the ML hehehe


>
>> Following up the instructions found on commit 16121a88a7, I started
>> the conversion. Then 'make check' started to fail because some
>> calls to virObjectRef/virObjectUnref were still remaining
>> in the code, messing up stuff related with mirrorChain in
>> qemu_blockjob.c. Turns out it was easier to burn through all the
>> instances and change them to use GLib.
> Yes, if you convert from virObject to GObject, you *must*
> convert all virObjectRef/Unref calls at that time.
>
>> This is being sent as RFC because x-I am aware that docs/hacking.html
>> mentions that we shouldn't mix up certain GLib macros with Libvirt
>> ones, thus I am uncertain of whether I have messed up or not.
>> 'make check' works, did a few sanity checks with libvirtd as
>> well.
> Yes, the need to not mix  g_auto* with VIR_AUTO*, is why I did commit
> 667ff797e8eb8d82f30ab430216a8d2eef6b915a to let you use g_autoptr
> with virObject, without first converting to GObject.

What if there are other object types in the same function  using the VIR 
macros?
For example, inside qemu_driver.c: qemuDomainBlockCopyCommon:


     VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = 
virQEMUDriverGetConfig(driver);
     const char *format = NULL;
     bool mirror_reuse = !!(flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT);
     bool mirror_shallow = !!(flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW);
     bool existing = mirror_reuse;
     qemuBlockJobDataPtr job = NULL;
     VIR_AUTOUNREF(virStorageSourcePtr) mirror = mirrorsrc;
     bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
     bool mirror_initialized = false;
     VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
     VIR_AUTOPTR(qemuBlockStorageSourceChainData) crdata = NULL;


Let's say that I change the virStorageSourcePtr up there to

    g_autoptr(virStorageSource) mirror = mirrorsrc;


As long as there are no VIR macros acting in the 'mirror' variable, is 
it to use g_autoptr
there even when everyone else is using VIR_AUTO* macros?




Thanks,

DHB


>
> Regards,
> Daniel

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Daniel P. Berrangé 4 years, 6 months ago
On Tue, Oct 15, 2019 at 10:51:39AM -0300, Daniel Henrique Barboza wrote:
> 
> 
> On 10/15/19 9:55 AM, Daniel P. Berrangé wrote:
> > On Tue, Oct 15, 2019 at 09:42:45AM -0300, Daniel Henrique Barboza wrote:
> > > I was hoping to quickly re-send the qemu_driver cleanups I've
> > > sent some time ago, now using Glib. I started by attempting to
> > > change the first VIR_AUTOUNREF() call in qemu_driver.c to
> > > g_autoptr(), which happens to be a virStorageSourcePtr type,
> > > then I realized that it wasn't that simple.
> > It should be that simple with this commit:
> > 
> >    commit 667ff797e8eb8d82f30ab430216a8d2eef6b915a
> >    Author: Daniel P. Berrangé <berrange@redhat.com>
> >    Date:   Fri Oct 4 17:14:10 2019 +0100
> > 
> >      src: add support for g_autoptr with virObject instances
> > 
> > we should be able to use g_autoptr for any virObject, without
> > having to lock-step convert to GObject.
> > 
> > What actual problem did you find ?
> 
> I failed to notice this commit. Just tried it again and it worked.
> 
> What happened yesterday was that I attempted to do a simple
> VIR_AUTOUNREF -> g_autopt replace, faced compile errors and then, since
> I didn't notice this commit about, I assumed "I guess I need to convert
> this guy to GObject".
> 
> In fact, the compile error happened because g_autoptr() does not operate
> with a 'Ptr' type - something that I learned only during the conversion
> process.

Yeah, you need to drop the 'Ptr' suffix in the type name when
converting to g_autoptr, as it adds the pointer itself.


> > > This is being sent as RFC because x-I am aware that docs/hacking.html
> > > mentions that we shouldn't mix up certain GLib macros with Libvirt
> > > ones, thus I am uncertain of whether I have messed up or not.
> > > 'make check' works, did a few sanity checks with libvirtd as
> > > well.
> > Yes, the need to not mix  g_auto* with VIR_AUTO*, is why I did commit
> > 667ff797e8eb8d82f30ab430216a8d2eef6b915a to let you use g_autoptr
> > with virObject, without first converting to GObject.
> 
> What if there are other object types in the same function  using the VIR
> macros?
> For example, inside qemu_driver.c: qemuDomainBlockCopyCommon:
> 
> 
>     VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg =
> virQEMUDriverGetConfig(driver);
>     const char *format = NULL;
>     bool mirror_reuse = !!(flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT);
>     bool mirror_shallow = !!(flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW);
>     bool existing = mirror_reuse;
>     qemuBlockJobDataPtr job = NULL;
>     VIR_AUTOUNREF(virStorageSourcePtr) mirror = mirrorsrc;
>     bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
>     bool mirror_initialized = false;
>     VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
>     VIR_AUTOPTR(qemuBlockStorageSourceChainData) crdata = NULL;
> 
> 
> Let's say that I change the virStorageSourcePtr up there to
> 
>    g_autoptr(virStorageSource) mirror = mirrorsrc;
> 
> 
> As long as there are no VIR macros acting in the 'mirror' variable, is it to
> use g_autoptr
> there even when everyone else is using VIR_AUTO* macros?

You should change all variables in the method at the same time.
Both the VIR_AUTOUNEF calls here can use g_autoptr, as can the
two VIR_AUTOPTR calls.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [RFC 0/1] convert virStorageSource to GObject
Posted by Daniel Henrique Barboza 4 years, 6 months ago

On 10/15/19 2:15 PM, Daniel P. Berrangé wrote:
> On Tue, Oct 15, 2019 at 10:51:39AM -0300, Daniel Henrique Barboza wrote:
>>
>> On 10/15/19 9:55 AM, Daniel P. Berrangé wrote:
>>> On Tue, Oct 15, 2019 at 09:42:45AM -0300, Daniel Henrique Barboza wrote:
>>>> I was hoping to quickly re-send the qemu_driver cleanups I've
>>>> sent some time ago, now using Glib. I started by attempting to
>>>> change the first VIR_AUTOUNREF() call in qemu_driver.c to
>>>> g_autoptr(), which happens to be a virStorageSourcePtr type,
>>>> then I realized that it wasn't that simple.
>>> It should be that simple with this commit:
>>>
>>>     commit 667ff797e8eb8d82f30ab430216a8d2eef6b915a
>>>     Author: Daniel P. Berrangé <berrange@redhat.com>
>>>     Date:   Fri Oct 4 17:14:10 2019 +0100
>>>
>>>       src: add support for g_autoptr with virObject instances
>>>
>>> we should be able to use g_autoptr for any virObject, without
>>> having to lock-step convert to GObject.
>>>
>>> What actual problem did you find ?
>> I failed to notice this commit. Just tried it again and it worked.
>>
>> What happened yesterday was that I attempted to do a simple
>> VIR_AUTOUNREF -> g_autopt replace, faced compile errors and then, since
>> I didn't notice this commit about, I assumed "I guess I need to convert
>> this guy to GObject".
>>
>> In fact, the compile error happened because g_autoptr() does not operate
>> with a 'Ptr' type - something that I learned only during the conversion
>> process.
> Yeah, you need to drop the 'Ptr' suffix in the type name when
> converting to g_autoptr, as it adds the pointer itself.
>
>
>>>> This is being sent as RFC because x-I am aware that docs/hacking.html
>>>> mentions that we shouldn't mix up certain GLib macros with Libvirt
>>>> ones, thus I am uncertain of whether I have messed up or not.
>>>> 'make check' works, did a few sanity checks with libvirtd as
>>>> well.
>>> Yes, the need to not mix  g_auto* with VIR_AUTO*, is why I did commit
>>> 667ff797e8eb8d82f30ab430216a8d2eef6b915a to let you use g_autoptr
>>> with virObject, without first converting to GObject.
>> What if there are other object types in the same function  using the VIR
>> macros?
>> For example, inside qemu_driver.c: qemuDomainBlockCopyCommon:
>>
>>
>>      VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg =
>> virQEMUDriverGetConfig(driver);
>>      const char *format = NULL;
>>      bool mirror_reuse = !!(flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT);
>>      bool mirror_shallow = !!(flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW);
>>      bool existing = mirror_reuse;
>>      qemuBlockJobDataPtr job = NULL;
>>      VIR_AUTOUNREF(virStorageSourcePtr) mirror = mirrorsrc;
>>      bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
>>      bool mirror_initialized = false;
>>      VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
>>      VIR_AUTOPTR(qemuBlockStorageSourceChainData) crdata = NULL;
>>
>>
>> Let's say that I change the virStorageSourcePtr up there to
>>
>>     g_autoptr(virStorageSource) mirror = mirrorsrc;
>>
>>
>> As long as there are no VIR macros acting in the 'mirror' variable, is it to
>> use g_autoptr
>> there even when everyone else is using VIR_AUTO* macros?
> You should change all variables in the method at the same time.
> Both the VIR_AUTOUNEF calls here can use g_autoptr, as can the
> two VIR_AUTOPTR calls.

Thanks for clarifying. I was going to re-send the patches adding GLib
macros instead of VIR_AUTO* ones, which would end up breaking this
rule because these patches are changing stuff in smaller steps.

What I'll end up is to basically re-send them as they are now, but with an
extra patch to change everything to GLib at once. That way we'll stay
compliant every step of the way.




DHB


>
> Regards,
> Daniel

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list