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);

Reply via email to