From 2b6c96a40e5ec049ee4fad154d6ec21136362561 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 31 Aug 2010 17:21:42 -0700 Subject: [PATCH] Fix a problem on releasing memory lock in Merovingian.java --- utils/src/com/cloud/utils/db/Merovingian.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/utils/src/com/cloud/utils/db/Merovingian.java b/utils/src/com/cloud/utils/db/Merovingian.java index 1c6577b07be..7b809aa5602 100644 --- a/utils/src/com/cloud/utils/db/Merovingian.java +++ b/utils/src/com/cloud/utils/db/Merovingian.java @@ -278,6 +278,8 @@ public class Merovingian { Ternary lock = _locks.get(key); if (lock != null) { + validLock = true; + if (lock.second() > 1) { lock.second(lock.second() - 1); if (s_logger.isTraceEnabled()) { @@ -286,7 +288,6 @@ public class Merovingian { return false; } - validLock = true; if (s_logger.isDebugEnabled() && !_locks.keySet().iterator().next().equals(key)) { s_logger.trace("Lock: Releasing out of order for " + key); @@ -306,16 +307,17 @@ public class Merovingian { } catch (SQLException e) { s_logger.warn("unable to rollback for " + key); } finally { - synchronized(s_memLocks) { - Pair memLock = s_memLocks.get(key); - memLock.second(memLock.second() - 1); - if (memLock.second() <= 0) { - s_memLocks.remove(key); - } - - if(validLock) + if(validLock) { + synchronized(s_memLocks) { + Pair memLock = s_memLocks.get(key); + memLock.second(memLock.second() - 1); + if (memLock.second() <= 0) { + s_memLocks.remove(key); + } + memLock.first().unlock(); - } + } + } } return true; }