Hi all,
There are some HA bugs in CS 4.5.2.
1. some "type"s should refer to "WorkType" in HighAvailabilityDaoImpl.java.
The same to master branch.
2. Mismatch uses of HighAvailabilityManagerImpl. _timeBetweenFailures. It
may be in seconds as
<eclipse-javadoc:%E2%98%82=cloud-server/src%3Ccom.cloud.ha%7BHaWorkVO.java%E
2%98%83HaWorkVO> HaWorkVO.timeToTry.
3. In
<eclipse-javadoc:%E2%98%82=cloud-server/src%3Ccom.cloud.ha%7BHighAvailabilit
yManagerImpl.java%E2%98%83HighAvailabilityManagerImpl>
HighAvailabilityManagerImpl.restart(
<eclipse-javadoc:%E2%98%82=cloud-server/src%3Ccom.cloud.ha%7BHighAvailabilit
yManagerImpl.java%E2%98%83HighAvailabilityManagerImpl~restart~QHaWorkVO;%E2%
98%82HaWorkVO> HaWorkVO work), the items' size got from
_haDao.listRunningHaWorkForVm is at least 1
And we add order for HA work taken sql, so that VR's HA can do first before
User VM's for efficiency.
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 29d0e2c..90cb97d 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -430,7 +430,8 @@ public class HighAvailabilityManagerImpl extends
ManagerBase implements HighAvai
}
items = _haDao.listRunningHaWorkForVm(work.getInstanceId());
- if (items.size() > 0) {
+ // Current HA work is running, so items.size is at least 1
+ if (items.size() > 1) {
StringBuilder str = new StringBuilder("Waiting because there's
HA work being executed on an item currently. Work Ids =[");
for (HaWorkVO item : items) {
str.append(item.getId()).append(", ");
@@ -796,7 +797,7 @@ public class HighAvailabilityManagerImpl extends
ManagerBase implements HighAvai
_maxRetries = NumbersUtil.parseInt(value, 5);
value = params.get("time.between.failures");
- _timeBetweenFailures = NumbersUtil.parseLong(value, 3600) * 1000;
+ _timeBetweenFailures = NumbersUtil.parseLong(value, 3600);
value = params.get("time.between.cleanup");
_timeBetweenCleanups = NumbersUtil.parseLong(value, 3600 * 24);
@@ -859,7 +860,7 @@ public class HighAvailabilityManagerImpl extends
ManagerBase implements HighAvai
s_logger.info("HA Cleanup Thread Running");
try {
- _haDao.cleanup(System.currentTimeMillis() -
_timeBetweenFailures);
+ _haDao.cleanup(System.currentTimeMillis() -
_timeBetweenFailures * 1000);
} catch (Exception e) {
s_logger.warn("Error while cleaning up", e);
}
diff --git a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
index 724f4f6..4ed7f53 100644
--- a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
+++ b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
@@ -98,20 +98,20 @@ public class HighAvailabilityDaoImpl extends
GenericDaoBase<HaWorkVO, Long> impl
FutureHaWorkSearch = createSearchBuilder();
FutureHaWorkSearch.and("instance",
FutureHaWorkSearch.entity().getInstanceId(), Op.EQ);
- FutureHaWorkSearch.and("type",
FutureHaWorkSearch.entity().getType(), Op.EQ);
+ FutureHaWorkSearch.and("type",
FutureHaWorkSearch.entity().getWorkType(), Op.EQ);
FutureHaWorkSearch.and("id", FutureHaWorkSearch.entity().getId(),
Op.GT);
FutureHaWorkSearch.done();
RunningHaWorkSearch = createSearchBuilder();
RunningHaWorkSearch.and("instance",
RunningHaWorkSearch.entity().getInstanceId(), Op.EQ);
- RunningHaWorkSearch.and("type",
RunningHaWorkSearch.entity().getType(), Op.EQ);
+ RunningHaWorkSearch.and("type",
RunningHaWorkSearch.entity().getWorkType(), Op.EQ);
RunningHaWorkSearch.and("taken",
RunningHaWorkSearch.entity().getDateTaken(), Op.NNULL);
RunningHaWorkSearch.and("step",
RunningHaWorkSearch.entity().getStep(), Op.NIN);
RunningHaWorkSearch.done();
PendingHaWorkSearch = createSearchBuilder();
PendingHaWorkSearch.and("instance",
PendingHaWorkSearch.entity().getInstanceId(), Op.EQ);
- PendingHaWorkSearch.and("type",
PendingHaWorkSearch.entity().getType(), Op.EQ);
+ PendingHaWorkSearch.and("type",
PendingHaWorkSearch.entity().getWorkType(), Op.EQ);
PendingHaWorkSearch.and("step",
PendingHaWorkSearch.entity().getStep(), Op.NIN);
PendingHaWorkSearch.done();
}
@@ -154,7 +154,7 @@ public class HighAvailabilityDaoImpl extends
GenericDaoBase<HaWorkVO, Long> impl
sc.setParameters("time", System.currentTimeMillis() >> 10);
sc.setParameters("step", Step.Done, Step.Cancelled);
- final Filter filter = new Filter(HaWorkVO.class, null, true,
0l, 1l);
+ final Filter filter = new Filter(HaWorkVO.class, "type", true,
0l, 1l);
txn.start();
final List<HaWorkVO> vos = lockRows(sc, filter, true);