Fix locking methods to retry on deadlock

This patch adds the @retry_on_deadlock decorator to node and cluster
lock methods and .with_lockmode('update') to querys to the cluster/node
lock table.

Closes-Bug: 1765817

Change-Id: Id900a979f609cffeab3f6170877f8489986731f5
This commit is contained in:
Jude Cross 2018-04-17 13:34:22 -07:00
parent 36ec6ef7bf
commit 0a2747e349
1 changed files with 15 additions and 6 deletions

View File

@ -464,6 +464,7 @@ def _release_cluster_lock(session, lock, action_id, scope):
return success
@retry_on_deadlock
def cluster_lock_release(cluster_id, action_id, scope):
'''Release lock on a cluster.
@ -474,16 +475,19 @@ def cluster_lock_release(cluster_id, action_id, scope):
:return: True indicates successful release, False indicates failure.
'''
with session_for_write() as session:
lock = session.query(models.ClusterLock).get(cluster_id)
lock = session.query(
models.ClusterLock).with_lockmode('update').get(cluster_id)
if lock is None:
return False
return _release_cluster_lock(session, lock, action_id, scope)
@retry_on_deadlock
def cluster_lock_steal(cluster_id, action_id):
with session_for_write() as session:
lock = session.query(models.ClusterLock).get(cluster_id)
lock = session.query(
models.ClusterLock).with_lockmode('update').get(cluster_id)
if lock is not None:
lock.action_ids = [action_id]
lock.semaphore = -1
@ -497,9 +501,11 @@ def cluster_lock_steal(cluster_id, action_id):
return lock.action_ids
@retry_on_deadlock
def node_lock_acquire(node_id, action_id):
with session_for_write() as session:
lock = session.query(models.NodeLock).get(node_id)
lock = session.query(
models.NodeLock).with_lockmode('update').get(node_id)
if lock is None:
lock = models.NodeLock(node_id=node_id, action_id=action_id)
session.add(lock)
@ -507,11 +513,12 @@ def node_lock_acquire(node_id, action_id):
return lock.action_id
@retry_on_deadlock
def node_lock_release(node_id, action_id):
with session_for_write() as session:
success = False
lock = session.query(models.NodeLock).get(node_id)
lock = session.query(
models.NodeLock).with_lockmode('update').get(node_id)
if lock is not None and lock.action_id == action_id:
session.delete(lock)
success = True
@ -519,9 +526,11 @@ def node_lock_release(node_id, action_id):
return success
@retry_on_deadlock
def node_lock_steal(node_id, action_id):
with session_for_write() as session:
lock = session.query(models.NodeLock).get(node_id)
lock = session.query(
models.NodeLock).with_lockmode('update').get(node_id)
if lock is not None:
lock.action_id = action_id
lock.save(session)