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(a)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 :|