]> xenbits.xensource.com Git - libvirt.git/commitdiff
remote: fix dom->id after virDomainCreateWithFlags
authorMarek Marczykowski <marmarek@invisiblethingslab.com>
Thu, 23 May 2013 00:01:30 +0000 (02:01 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 23 May 2013 13:07:16 +0000 (15:07 +0200)
The same issue as (already fixed) in virDomainCreate -
REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS doesn't return new domain ID, only
-1 on error or 0 on success.

Besides this one fix it is more general problem - local domain object
ID can desynchronize with the real one, for example in case of another
client creates/destroys domain in the meantime. Perhaps virDomainGetID
should be called remotely (with all performance implications...)? Or
some event-based notification used?

Signed-off-by: Marek Marczykowski <marmarek@invisiblethingslab.com>
src/remote/remote_driver.c
src/remote/remote_protocol.x

index 11ad1d03491a5d8afce20b4266cd00440203c256..2cda559108e84c9566c495013117212c1c882427 100644 (file)
@@ -2400,6 +2400,46 @@ done:
     return rv;
 }
 
+static int
+remoteDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
+{
+    int rv = -1;
+    struct private_data *priv = dom->conn->privateData;
+    remote_domain_create_with_flags_args args;
+    remote_domain_lookup_by_uuid_args args2;
+    remote_domain_lookup_by_uuid_ret ret2;
+
+    remoteDriverLock(priv);
+
+    make_nonnull_domain(&args.dom, dom);
+    args.flags = flags;
+
+    if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS,
+             (xdrproc_t)xdr_remote_domain_create_with_flags_args, (char *)&args,
+             (xdrproc_t)xdr_void, (char *)NULL) == -1) {
+        goto done;
+    }
+
+    /* Need to do a lookup figure out ID of newly started guest, because
+     * bug in design of REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS means we aren't getting
+     * it returned.
+     */
+    memcpy(args2.uuid, dom->uuid, VIR_UUID_BUFLEN);
+    memset(&ret2, 0, sizeof(ret2));
+    if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_LOOKUP_BY_UUID,
+             (xdrproc_t) xdr_remote_domain_lookup_by_uuid_args, (char *) &args2,
+             (xdrproc_t) xdr_remote_domain_lookup_by_uuid_ret, (char *) &ret2) == -1)
+        goto done;
+
+    dom->id = ret2.dom.id;
+    xdr_free((xdrproc_t) &xdr_remote_domain_lookup_by_uuid_ret, (char *) &ret2);
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
 static char *
 remoteDomainGetSchedulerType(virDomainPtr domain, int *nparams)
 {
index f61d10c0cdaae382b1e1c20ee33c0f4dfef02d2c..1ebbce786e3fc8880430a2a6b0e18f0ca9e4cf51 100644 (file)
@@ -3875,7 +3875,7 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_EVENT_IO_ERROR_REASON = 195,
 
     /**
-     * @generate: both
+     * @generate: server
      */
     REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196,