Repository: cloudstack
Updated Branches:
  refs/heads/master 0c1b6b44a -> ce1e53f45


avoid mysql lock-promotion situation.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/de252ada
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/de252ada
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/de252ada

Branch: refs/heads/master
Commit: de252adadf4816b62d5e686b92b42837ae83e20a
Parents: 0c1b6b4
Author: Kelven Yang <[email protected]>
Authored: Sat Mar 15 12:56:19 2014 -0700
Committer: Kelven Yang <[email protected]>
Committed: Tue Mar 18 16:45:02 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/host/dao/HostDaoImpl.java     |  3 +-
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 73 ++++++++++----------
 2 files changed, 40 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/de252ada/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java 
b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
index 426c90d..3a3bdf6 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
@@ -899,7 +899,8 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
 
     @Override
     public boolean updateState(Status oldStatus, Event event, Status 
newStatus, Host vo, Object data) {
-        HostVO host = findById(vo.getId());
+        // lock target row from beginning to avoid lock-promotion caused 
deadlock
+        HostVO host = lockRow(vo.getId(), true);
         if (host == null) {
             if (event == Event.Remove && newStatus == Status.Removed) {
                 host = findByIdIncludingRemoved(vo.getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/de252ada/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java 
b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 7c59492..0c13ae7 100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -417,41 +417,44 @@ public class VMInstanceDaoImpl extends 
GenericDaoBase<VMInstanceVO, Long> implem
 
     @Override
     public boolean updateState(State oldState, Event event, State newState, 
VirtualMachine vm, Object opaque) {
-        if (newState == null) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("There's no way to transition from old state: " 
+ oldState.toString() + " event: " + event.toString());
-            }
-            return false;
-        }
-
-        @SuppressWarnings("unchecked")
-        Pair<Long, Long> hosts = (Pair<Long, Long>)opaque;
-        Long newHostId = hosts.second();
-
-        VMInstanceVO vmi = (VMInstanceVO)vm;
-        Long oldHostId = vmi.getHostId();
-        Long oldUpdated = vmi.getUpdated();
-        Date oldUpdateDate = vmi.getUpdateTime();
-        if (newState.equals(oldState) && newHostId != null && 
newHostId.equals(oldHostId)) {
-            // state is same, don't need to update
-            return true;
-        }
-
-        SearchCriteria<VMInstanceVO> sc = StateChangeSearch.create();
-        sc.setParameters("id", vmi.getId());
-        sc.setParameters("states", oldState);
-        sc.setParameters("host", vmi.getHostId());
-        sc.setParameters("update", vmi.getUpdated());
-
-        vmi.incrUpdated();
-        UpdateBuilder ub = getUpdateBuilder(vmi);
-
-        ub.set(vmi, "state", newState);
-        ub.set(vmi, "hostId", newHostId);
-        ub.set(vmi, "podIdToDeployIn", vmi.getPodIdToDeployIn());
-        ub.set(vmi, _updateTimeAttr, new Date());
-
-        int result = update(vmi, sc);
+       if (newState == null) {
+               if (s_logger.isDebugEnabled()) {
+                       s_logger.debug("There's no way to transition from old 
state: " + oldState.toString() + " event: " + event.toString());
+               }
+               return false;
+       }
+
+       @SuppressWarnings("unchecked")
+               Pair<Long, Long> hosts = (Pair<Long,Long>)opaque;
+               Long newHostId = hosts.second();
+
+       VMInstanceVO vmi = (VMInstanceVO)vm;
+       Long oldHostId = vmi.getHostId();
+       Long oldUpdated = vmi.getUpdated();
+       Date oldUpdateDate = vmi.getUpdateTime();
+       if ( newState.equals(oldState) && newHostId != null && 
newHostId.equals(oldHostId) ) {
+           // state is same, don't need to update
+           return true;
+       }
+
+        // lock the target row at beginning to avoid lock-promotion caused 
deadlock
+        lockRow(vm.getId(), true);
+       
+       SearchCriteria<VMInstanceVO> sc = StateChangeSearch.create();
+       sc.setParameters("id", vmi.getId());
+       sc.setParameters("states", oldState);
+       sc.setParameters("host", vmi.getHostId());
+       sc.setParameters("update", vmi.getUpdated());
+
+       vmi.incrUpdated();
+       UpdateBuilder ub = getUpdateBuilder(vmi);
+
+       ub.set(vmi, "state", newState);
+       ub.set(vmi, "hostId", newHostId);
+       ub.set(vmi, "podIdToDeployIn", vmi.getPodIdToDeployIn());
+       ub.set(vmi, _updateTimeAttr, new Date());
+
+       int result = update(vmi, sc);
         if (result == 0) {
             VMInstanceVO vo = findByIdIncludingRemoved(vm.getId());
 

Reply via email to