Skip to content
Snippets Groups Projects
Commit 5cc1f887 authored by Michael Hanselmann's avatar Michael Hanselmann
Browse files

LUInstanceCreate: Acquire node allocation lock


Opportunistic locks are not yet used. This patch changes
LUInstanceCreate to acquire the node allocation lock to avoid conflicts
with other opcodes acquiring many node locks.

Signed-off-by: default avatarMichael Hanselmann <hansmi@google.com>
Reviewed-by: default avatarGuido Trotter <ultrotter@google.com>
parent 2cb3181a
No related branches found
No related tags found
No related merge requests found
...@@ -9850,7 +9850,9 @@ class LUInstanceCreate(LogicalUnit): ...@@ -9850,7 +9850,9 @@ class LUInstanceCreate(LogicalUnit):
# specifying a group on instance creation and then selecting nodes from # specifying a group on instance creation and then selecting nodes from
# that group # that group
self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET
self.needed_locks[locking.LEVEL_NODE_RES] = locking.ALL_SET self.needed_locks[locking.LEVEL_NODE_RES] = \
_CopyLockList(self.needed_locks[locking.LEVEL_NODE])
self.needed_locks[locking.LEVEL_NODE_ALLOC] = locking.ALL_SET
else: else:
self.op.pnode = _ExpandNodeName(self.cfg, self.op.pnode) self.op.pnode = _ExpandNodeName(self.cfg, self.op.pnode)
nodelist = [self.op.pnode] nodelist = [self.op.pnode]
...@@ -9872,6 +9874,7 @@ class LUInstanceCreate(LogicalUnit): ...@@ -9872,6 +9874,7 @@ class LUInstanceCreate(LogicalUnit):
   
if src_node is None: if src_node is None:
self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET
self.needed_locks[locking.LEVEL_NODE_ALLOC] = locking.ALL_SET
self.op.src_node = None self.op.src_node = None
if os.path.isabs(src_path): if os.path.isabs(src_path):
raise errors.OpPrereqError("Importing an instance from a path" raise errors.OpPrereqError("Importing an instance from a path"
...@@ -10255,12 +10258,14 @@ class LUInstanceCreate(LogicalUnit): ...@@ -10255,12 +10258,14 @@ class LUInstanceCreate(LogicalUnit):
self._RunAllocator() self._RunAllocator()
   
# Release all unneeded node locks # Release all unneeded node locks
_ReleaseLocks(self, locking.LEVEL_NODE, keep_locks = filter(None, [self.op.pnode, self.op.snode, self.op.src_node])
keep=filter(None, [self.op.pnode, self.op.snode, _ReleaseLocks(self, locking.LEVEL_NODE, keep=keep_locks)
self.op.src_node])) _ReleaseLocks(self, locking.LEVEL_NODE_RES, keep=keep_locks)
_ReleaseLocks(self, locking.LEVEL_NODE_RES, _ReleaseLocks(self, locking.LEVEL_NODE_ALLOC)
keep=filter(None, [self.op.pnode, self.op.snode,
self.op.src_node])) assert (self.owned_locks(locking.LEVEL_NODE) ==
self.owned_locks(locking.LEVEL_NODE_RES)), \
"Node locks differ from node resource locks"
   
#### node related checks #### node related checks
   
...@@ -10485,6 +10490,7 @@ class LUInstanceCreate(LogicalUnit): ...@@ -10485,6 +10490,7 @@ class LUInstanceCreate(LogicalUnit):
assert not (self.owned_locks(locking.LEVEL_NODE_RES) - assert not (self.owned_locks(locking.LEVEL_NODE_RES) -
self.owned_locks(locking.LEVEL_NODE)), \ self.owned_locks(locking.LEVEL_NODE)), \
"Node locks differ from node resource locks" "Node locks differ from node resource locks"
assert not self.glm.is_owned(locking.LEVEL_NODE_ALLOC)
   
ht_kind = self.op.hypervisor ht_kind = self.op.hypervisor
if ht_kind in constants.HTS_REQ_PORT: if ht_kind in constants.HTS_REQ_PORT:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment