I will apply just this patch as the other 2 breaks the tests.
On 04/10/2015 19:37, Jose Ricardo Ziviani wrote:
From: CrÃstian Deives <cristiandeives(a)gmail.com>
If several users try to update the same VM at the same time, an error
may happen due to concurrent access.
Define a dictionary containing one lock per each VM, and use it when
updating the VM: the lock is acquired before the update operation begins
and it is released when the operation finishes (whether by success or
failure).
Signed-off-by: CrÃstian Deives <cristiandeives(a)gmail.com>
Signed-off-by: Jose Ricardo Ziviani <joserz(a)linux.vnet.ibm.com>
---
src/wok/plugins/kimchi/model/vms.py | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py
index d2dec90..a42e8af 100644
--- a/src/wok/plugins/kimchi/model/vms.py
+++ b/src/wok/plugins/kimchi/model/vms.py
@@ -23,6 +23,7 @@ import lxml.etree as ET
import os
import random
import string
+import threading
import time
import uuid
from lxml import etree, objectify
@@ -79,6 +80,9 @@ XPATH_DOMAIN_UUID = '/domain/uuid'
XPATH_NUMA_CELL = './cpu/numa/cell'
+# key: VM name; value: lock object
+vm_locks = {}
+
class VMsModel(object):
def __init__(self, **kargs):
@@ -220,10 +224,16 @@ class VMModel(object):
self.stats = {}
def update(self, name, params):
- dom = self.get_vm(name, self.conn)
- vm_name, dom = self._static_vm_update(name, dom, params)
- self._live_vm_update(dom, params)
- return vm_name
+ lock = vm_locks.get(name)
+ if lock is None:
+ lock = threading.Lock()
+ vm_locks[name] = lock
+
+ with lock:
+ dom = self.get_vm(name, self.conn)
+ vm_name, dom = self._static_vm_update(name, dom, params)
+ self._live_vm_update(dom, params)
+ return vm_name
def clone(self, name):
"""Clone a virtual machine based on an existing one.