]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: fix removal of callbacks in virCloseCallbacksRun
authorMichael Chapman <mike@very.puzzling.org>
Wed, 8 Apr 2015 03:22:39 +0000 (13:22 +1000)
committerJán Tomko <jtomko@redhat.com>
Wed, 8 Apr 2015 07:45:48 +0000 (09:45 +0200)
The close callbacks hash are keyed by a UUID-string, but
virCloseCallbacksRun was attempting to remove them by raw UUID. This
patch ensures the callback entries are removed by UUID-string as well.

This bug caused problems when guest migrations were abnormally aborted:

  # timeout --signal KILL 1 \
      virsh migrate example qemu+tls://remote/system \
        --verbose --compressed --live --auto-converge \
        --abort-on-error --unsafe --persistent \
        --undefinesource --copy-storage-all --xml example.xml
  Killed

  # virsh migrate example qemu+tls://remote/system \
      --verbose --compressed --live --auto-converge \
      --abort-on-error --unsafe --persistent \
      --undefinesource --copy-storage-all --xml example.xml
  error: Requested operation is not valid: domain 'example' is not being migrated

Signed-off-by: Michael Chapman <mike@very.puzzling.org>
src/util/virclosecallbacks.c

index 4128057c5e5ed0bcbd2e3d4b0cc3c020c229affa..9006d361e514878af892243644e3b1654594ad6a 100644 (file)
@@ -331,8 +331,9 @@ virCloseCallbacksRun(virCloseCallbacksPtr closeCallbacks,
         return;
 
     for (i = 0; i < list->nentries; i++) {
-        virHashRemoveEntry(closeCallbacks->list,
-                           list->entries[i].uuid);
+        char uuidstr[VIR_UUID_STRING_BUFLEN];
+        virUUIDFormat(list->entries[i].uuid, uuidstr);
+        virHashRemoveEntry(closeCallbacks->list, uuidstr);
     }
     virObjectUnlock(closeCallbacks);