[libvirt] [PATCH] systemd: fix build without dbus

Daniel P. Berrange berrange at redhat.com
Mon Jan 19 13:30:31 UTC 2015


On Mon, Jan 19, 2015 at 02:24:34PM +0100, Martin Kletzander wrote:
> On Mon, Jan 19, 2015 at 02:13:12PM +0100, Martin Kletzander wrote:
> >On Mon, Jan 19, 2015 at 12:34:52PM +0000, Daniel P. Berrange wrote:
> >>The virDBusMethodCall method has a DBusError as one of its
> >>parameters. If the caller wants to pass a non-NULL value
> >>for this, it immediately makes the calling code require
> >>DBus at build time. This has led to breakage of non-DBus
> >>builds several times. It is desirable that only the virdbus.c
> >>file should need WITH_DBUS conditionals, so we must ideally
> >>remove the DBusError parameter from the method.
> >>
> >>We can't simply raise a libvirt error, since the whole point
> >>of this parameter is to give the callers a way to check if
> >>the error is one they want to ignore, without having the logs
> >>polluted with an error message. So, we add a virErrorPtr
> >>parameter which the caller can then either ignore or raise
> >>using virSetError.
> >>
> >>Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> >>---
> >>src/util/virdbus.c     | 31 +++++++++++++++++++------------
> >>src/util/virdbus.h     |  4 ++--
> >>src/util/virfirewall.c | 34 ++++++++++------------------------
> >>src/util/virsystemd.c  | 15 +++++++--------
> >>4 files changed, 38 insertions(+), 46 deletions(-)
> >>
> >>This is a build-breaker fix, but I'm not pushing since the
> >>fix is too complicated to go in without some review.
> >>
> >[...]
> >>diff --git a/src/util/virdbus.h b/src/util/virdbus.h
> >>index d0c7de2..e2b8d2b 100644
> >>--- a/src/util/virdbus.h
> >>+++ b/src/util/virdbus.h
> >>@@ -28,7 +28,7 @@
> >># else
> >>#  define DBusConnection void
> >>#  define DBusMessage void
> >>-#  define DBusError void
> >
> >Using virError instead of DBusError is fine, but
> >
> >>+#  define dbus_message_unref(m) do {} while (0)
> >
> >ewww, can't we just cleanly separate DBus code from libvirt code
> >instead of adding more of these?
> >
> >>diff --git a/src/util/virfirewall.c b/src/util/virfirewall.c
> >>index b536912..a01b703 100644
> >>--- a/src/util/virfirewall.c
> >>+++ b/src/util/virfirewall.c
> >[...]
> >>@@ -789,10 +777,13 @@ virFirewallApplyRuleFirewallD(virFirewallRulePtr rule,
> >>                         "sa&s",
> >>                         ipv,
> >>                         (int)rule->argsLen,
> >>-                          rule->args) < 0)
> >>+                          rule->args) < 0) {
> >>+        VIR_ERROR("Here fail");
> >
> >Leftover from debugging?
> >
> >>       goto cleanup;
> >>+    }
> >>
> >>-    if (dbus_error_is_set(&error)) {
> >>+    VIR_ERROR("Error %d: %s\n", error.level, error.message);
> >>+    if (error.level == VIR_ERR_ERROR) {
> >>       /*
> >>        * As of firewalld-0.3.9.3-1.fc20.noarch the name and
> >>        * message fields in the error look like
> >[...]
> >>@@ -862,12 +850,10 @@ virFirewallApplyRule(virFirewallPtr firewall,
> >>       if (virFirewallApplyRuleDirect(rule, ignoreErrors, &output) < 0)
> >>           return -1;
> >>       break;
> >>-#if WITH_DBUS
> >>   case VIR_FIREWALL_BACKEND_FIREWALLD:
> >>       if (virFirewallApplyRuleFirewallD(rule, ignoreErrors, &output) < 0)
> >
> >Another thing that's pre-existing, but we are adding more and more of
> >them.  I don't like that libvirt is still using systemd stuff even if
> >configured not to (--without-systemd).
> >
> >>diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
> >>index 3eea5c2..0b71b26 100644
> >>--- a/src/util/virsystemd.c
> >>+++ b/src/util/virsystemd.c
> >>@@ -252,8 +252,8 @@ int virSystemdCreateMachine(const char *name,
> >>
> >>   VIR_DEBUG("Attempting to create machine via systemd");
> >>   if (virAtomicIntGet(&hasCreateWithNetwork)) {
> >>-        DBusError error;
> >>-        dbus_error_init(&error);
> >>+        virError error;
> >>+        memset(&error, 0, sizeof(error));
> >>
> >>       if (virDBusCallMethod(conn,
> >>                             NULL,
> >>@@ -280,21 +280,20 @@ int virSystemdCreateMachine(const char *name,
> >>                             "Before", "as", 1, "libvirt-guests.service") < 0)
> >>           goto cleanup;
> >>
> >>-        if (dbus_error_is_set(&error)) {
> >>+        if (error.level == VIR_ERR_ERROR) {
> >>           if (STREQ_NULLABLE("org.freedesktop.DBus.Error.UnknownMethod",
> >>-                               error.name)) {
> >>+                               error.str1)) {
> >>               VIR_INFO("CreateMachineWithNetwork isn't supported, switching "
> >>                        "to legacy CreateMachine method for systemd-machined");
> >>-                dbus_error_free(&error);
> >>+                virResetError(&error);
> >>               virAtomicIntSet(&hasCreateWithNetwork, 0);
> >>               /* Could re-structure without Using goto, but this
> >>                * avoids another atomic read which would trigger
> >>                * another memory barrier */
> >>               goto fallback;
> >>           }
> >>-            virReportError(VIR_ERR_DBUS_SERVICE,
> >>-                           _("CreateMachineWithNetwork: %s"),
> >>-                           error.message ? error.message : _("unknown error"));
> >>+            virSetError(&error);
> >>+            virResetError(&error);
> >>           goto cleanup;
> >>       }
> >>   } else {
> >>--
> >
> >This is pretty hackish IMHO. Since
> >"org.freedesktop.DBus.Error.UnknownMethod" isn't specific for systemd,
> >we can make virDBusCall() report whether unknown method was called or
> >not and then decide what to do with it two layers up in the stack.  It
> >also simplifies virSystemdCreateMachine() a lot.
> >
> 
> Not to mention DBus offers introspection of service properties, but I
> must admit I have no idea how to make use of it using its C API.

The introspection is primarily intended to non-C language bindings that
need to know what data types to use when encoding/decoding data, since
their languages are typically loosely typed. While you could parse the
introspection to check if a method exists ahead of time, it is really
way overkill for this problem and would require a seriously large amount
of code to deal with it. There's just no win for doing that here.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list