mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Do app-level iteration to avoid mysql deadlocks
This commit is contained in:
parent
66486d4322
commit
cd8801f6f7
@ -1,4 +1,4 @@
|
|||||||
// Licensed to the Apache Software Foundation (ASF) under one
|
// Licensed to the Apacohe Software Foundation (ASF) under one
|
||||||
// or more contributor license agreements. See the NOTICE file
|
// or more contributor license agreements. See the NOTICE file
|
||||||
// distributed with this work for additional information
|
// distributed with this work for additional information
|
||||||
// regarding copyright ownership. The ASF licenses this file
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
@ -569,7 +569,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
|||||||
@Override
|
@Override
|
||||||
public boolean start() {
|
public boolean start() {
|
||||||
// TODO, initial delay is hardcoded
|
// TODO, initial delay is hardcoded
|
||||||
_executor.scheduleAtFixedRate(new CleanupTask(), 5000, VmJobStateReportInterval.value(), TimeUnit.SECONDS);
|
_executor.scheduleAtFixedRate(new CleanupTask(), 5, VmJobStateReportInterval.value(), TimeUnit.SECONDS);
|
||||||
_executor.scheduleAtFixedRate(new TransitionTask(), VmOpCleanupInterval.value(), VmOpCleanupInterval.value(), TimeUnit.SECONDS);
|
_executor.scheduleAtFixedRate(new TransitionTask(), VmOpCleanupInterval.value(), VmOpCleanupInterval.value(), TimeUnit.SECONDS);
|
||||||
cancelWorkItems(_nodeId);
|
cancelWorkItems(_nodeId);
|
||||||
|
|
||||||
|
|||||||
@ -20,9 +20,10 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
|
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
|
||||||
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO.Step;
|
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO.Step;
|
||||||
@ -41,9 +42,14 @@ import com.cloud.utils.db.TransactionStatus;
|
|||||||
import com.cloud.vm.VirtualMachine;
|
import com.cloud.vm.VirtualMachine;
|
||||||
|
|
||||||
public class VmWorkJobDaoImpl extends GenericDaoBase<VmWorkJobVO, Long> implements VmWorkJobDao {
|
public class VmWorkJobDaoImpl extends GenericDaoBase<VmWorkJobVO, Long> implements VmWorkJobDao {
|
||||||
|
private static final Logger s_logger = Logger.getLogger(VmWorkJobDaoImpl.class);
|
||||||
|
|
||||||
protected SearchBuilder<VmWorkJobVO> PendingWorkJobSearch;
|
protected SearchBuilder<VmWorkJobVO> PendingWorkJobSearch;
|
||||||
protected SearchBuilder<VmWorkJobVO> PendingWorkJobByCommandSearch;
|
protected SearchBuilder<VmWorkJobVO> PendingWorkJobByCommandSearch;
|
||||||
|
protected SearchBuilder<VmWorkJobVO> ExpungingWorkJobSearch;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected AsyncJobDao _baseJobDao;
|
||||||
|
|
||||||
public VmWorkJobDaoImpl() {
|
public VmWorkJobDaoImpl() {
|
||||||
}
|
}
|
||||||
@ -63,6 +69,12 @@ public class VmWorkJobDaoImpl extends GenericDaoBase<VmWorkJobVO, Long> implemen
|
|||||||
PendingWorkJobByCommandSearch.and("step", PendingWorkJobByCommandSearch.entity().getStep(), Op.NEQ);
|
PendingWorkJobByCommandSearch.and("step", PendingWorkJobByCommandSearch.entity().getStep(), Op.NEQ);
|
||||||
PendingWorkJobByCommandSearch.and("cmd", PendingWorkJobByCommandSearch.entity().getCmd(), Op.EQ);
|
PendingWorkJobByCommandSearch.and("cmd", PendingWorkJobByCommandSearch.entity().getCmd(), Op.EQ);
|
||||||
PendingWorkJobByCommandSearch.done();
|
PendingWorkJobByCommandSearch.done();
|
||||||
|
|
||||||
|
ExpungingWorkJobSearch = createSearchBuilder();
|
||||||
|
ExpungingWorkJobSearch.and("jobStatus", ExpungingWorkJobSearch.entity().getStatus(), Op.NEQ);
|
||||||
|
ExpungingWorkJobSearch.and("cutDate", ExpungingWorkJobSearch.entity().getLastUpdated(), Op.LT);
|
||||||
|
ExpungingWorkJobSearch.and("dispatcher", ExpungingWorkJobSearch.entity().getDispatcher(), Op.EQ);
|
||||||
|
ExpungingWorkJobSearch.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -124,33 +136,19 @@ public class VmWorkJobDaoImpl extends GenericDaoBase<VmWorkJobVO, Long> implemen
|
|||||||
|
|
||||||
expunge(sc);
|
expunge(sc);
|
||||||
*/
|
*/
|
||||||
Transaction.execute(new TransactionCallbackNoReturn() {
|
|
||||||
@Override
|
|
||||||
public void doInTransactionWithoutResult(TransactionStatus status) {
|
|
||||||
TransactionLegacy txn = TransactionLegacy.currentTxn();
|
|
||||||
|
|
||||||
PreparedStatement pstmt = null;
|
// loop at application level to avoid mysql deadlock issues
|
||||||
try {
|
SearchCriteria<VmWorkJobVO> sc = ExpungingWorkJobSearch.create();
|
||||||
pstmt = txn.prepareAutoCloseStatement(
|
sc.setParameters("jobStatus", JobInfo.Status.IN_PROGRESS);
|
||||||
"DELETE FROM vm_work_job WHERE id IN (SELECT id FROM async_job WHERE job_dispatcher='VmWorkJobDispatcher' AND job_status != 0 AND last_updated < ?)");
|
sc.setParameters("lastUpdated", cutDate);
|
||||||
pstmt.setString(1, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutDate));
|
sc.setParameters("dispatcher", "VmWorkJobDispatcher");
|
||||||
|
List<VmWorkJobVO> expungeList = listBy(sc);
|
||||||
pstmt.execute();
|
for (VmWorkJobVO job : expungeList) {
|
||||||
} catch (SQLException e) {
|
if (s_logger.isDebugEnabled())
|
||||||
} catch (Throwable e) {
|
s_logger.debug("Expunge completed work job-" + job.getId());
|
||||||
}
|
expunge(job.getId());
|
||||||
|
_baseJobDao.expunge(job.getId());
|
||||||
try {
|
}
|
||||||
pstmt = txn.prepareAutoCloseStatement(
|
|
||||||
"DELETE FROM async_job WHERE job_dispatcher='VmWorkJobDispatcher' AND job_status != 0 AND last_updated < ?");
|
|
||||||
pstmt.setString(1, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutDate));
|
|
||||||
|
|
||||||
pstmt.execute();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
} catch (Throwable e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user