mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Do not use row lock in sync-queue scheduling to work around mysql locking issues.
This commit is contained in:
parent
7fa4715b99
commit
5310e66f30
@ -119,10 +119,12 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I
|
|||||||
s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging);
|
s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging);
|
||||||
s_fsm.addTransition(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging);
|
s_fsm.addTransition(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging);
|
||||||
|
|
||||||
|
s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
||||||
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
||||||
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
||||||
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
||||||
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
|
||||||
|
|
||||||
s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
||||||
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
||||||
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
|
||||||
|
|||||||
@ -659,8 +659,24 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
|
|||||||
|
|
||||||
private Runnable getHeartbeatTask() {
|
private Runnable getHeartbeatTask() {
|
||||||
return new ManagedContextRunnable() {
|
return new ManagedContextRunnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void runInContext() {
|
protected void runInContext() {
|
||||||
|
GlobalLock scanLock = GlobalLock.getInternLock("AsyncJobManagerHeartbeat");
|
||||||
|
try {
|
||||||
|
if (scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) {
|
||||||
|
try {
|
||||||
|
reallyRun();
|
||||||
|
} finally {
|
||||||
|
scanLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
scanLock.releaseRef();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void reallyRun() {
|
||||||
try {
|
try {
|
||||||
List<SyncQueueItemVO> l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE);
|
List<SyncQueueItemVO> l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE);
|
||||||
if (l != null && l.size() > 0) {
|
if (l != null && l.size() > 0) {
|
||||||
|
|||||||
@ -83,7 +83,7 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
|
|||||||
return Transaction.execute(new TransactionCallback<SyncQueueItemVO>() {
|
return Transaction.execute(new TransactionCallback<SyncQueueItemVO>() {
|
||||||
@Override
|
@Override
|
||||||
public SyncQueueItemVO doInTransaction(TransactionStatus status) {
|
public SyncQueueItemVO doInTransaction(TransactionStatus status) {
|
||||||
SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
|
SyncQueueVO queueVO = _syncQueueDao.findById(queueId);
|
||||||
if(queueVO == null) {
|
if(queueVO == null) {
|
||||||
s_logger.error("Sync queue(id: " + queueId + ") does not exist");
|
s_logger.error("Sync queue(id: " + queueId + ") does not exist");
|
||||||
return null;
|
return null;
|
||||||
@ -141,8 +141,8 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
|
|||||||
List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
|
List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
|
||||||
if(l != null && l.size() > 0) {
|
if(l != null && l.size() > 0) {
|
||||||
for(SyncQueueItemVO item : l) {
|
for(SyncQueueItemVO item : l) {
|
||||||
SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
|
SyncQueueVO queueVO = _syncQueueDao.findById(item.getQueueId());
|
||||||
SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
|
SyncQueueItemVO itemVO = _syncQueueItemDao.findById(item.getId());
|
||||||
if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
|
if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
|
||||||
Long processNumber = queueVO.getLastProcessNumber();
|
Long processNumber = queueVO.getLastProcessNumber();
|
||||||
if (processNumber == null)
|
if (processNumber == null)
|
||||||
@ -185,7 +185,7 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
|
|||||||
public void doInTransactionWithoutResult(TransactionStatus status) {
|
public void doInTransactionWithoutResult(TransactionStatus status) {
|
||||||
SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
|
SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
|
||||||
if(itemVO != null) {
|
if(itemVO != null) {
|
||||||
SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
|
SyncQueueVO queueVO = _syncQueueDao.findById(itemVO.getQueueId());
|
||||||
|
|
||||||
_syncQueueItemDao.expunge(itemVO.getId());
|
_syncQueueItemDao.expunge(itemVO.getId());
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
|
|||||||
public void doInTransactionWithoutResult(TransactionStatus status) {
|
public void doInTransactionWithoutResult(TransactionStatus status) {
|
||||||
SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
|
SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
|
||||||
if(itemVO != null) {
|
if(itemVO != null) {
|
||||||
SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
|
SyncQueueVO queueVO = _syncQueueDao.findById(itemVO.getQueueId());
|
||||||
|
|
||||||
itemVO.setLastProcessMsid(null);
|
itemVO.setLastProcessMsid(null);
|
||||||
itemVO.setLastProcessNumber(null);
|
itemVO.setLastProcessNumber(null);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user