Michal Privoznik wrote:
Like in previous commit, lets use FindByUUID() instead of
ListFindByID(). The latter is suboptimal as it needs to iterate over
each item in the domain object list, lock it and compare the IDs. If
an object is already locked, we must wait until it's unlocked. During
this wait, we keep the whole list locked, and potentially block other
thread trying to access the list.
There's no such problem with ListFindByUUID() since UUID is the key to
the hash table, therefore it can be looked up without need for locking
each single domain object.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/libxl/libxl_domain.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 3039427..55d1313 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -494,7 +494,7 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event
*event)
if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
goto error;
- vm = virDomainObjListFindByID(driver->domains, event->domid);
+ vm = virDomainObjListFindByUUID(driver->domains, event->domuuid.uuid);
Sadly, this won't work. event->domuuid is not populated when libxl
invokes the event handler
Breakpoint 1, libxlDomainEventHandler (data=0x7fffe0012310,
event=0x55555588abb0)
at libxl/libxl_domain.c:477
(gdb) p event->domuuid
$2 = {uuid = '\000' <repeats 15 times>}
Regards,
Jim
if (!vm) {
VIR_INFO("Received event for unknown domain ID %d", event->domid);
goto error;