Skip to content

Commit db7bc89

Browse files
author
Alex Huang
committed
added cluster awareness to vm start/stop
1 parent b8767ba commit db7bc89

6 files changed

Lines changed: 68 additions & 1 deletion

File tree

server/src/com/cloud/ha/HaWorkVO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,6 @@ public HaWorkVO(final long instanceId, final VirtualMachine.Type type, final Wor
192192

193193
@Override
194194
public String toString() {
195-
return new StringBuilder("[HA-Work:id=").append(id).append(":type=").append(workType.toString()).append(":vm=").append(instanceId).append(":state=").append(previousState.toString()).append("]").toString();
195+
return new StringBuilder("HAWork[").append(id).append("-").append(workType).append("-").append(instanceId).append("-").append(previousState).append("-").append(step).append("]").toString();
196196
}
197197
}

server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public void onManagementNodeJoined(List<ManagementServerHostVO> nodeList, long s
3939

4040
@Override
4141
public void onManagementNodeLeft(List<ManagementServerHostVO> nodeList, long selfNodeId) {
42+
for (ManagementServerHostVO node : nodeList) {
43+
cancelWorkItems(node.getMsid());
44+
}
4245
}
4346

4447
@Override

server/src/com/cloud/vm/ItWorkDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package com.cloud.vm;
1919

20+
import java.util.List;
21+
2022
import com.cloud.utils.db.GenericDao;
2123
import com.cloud.vm.ItWorkVO.Step;
2224
import com.cloud.vm.VirtualMachine.State;
@@ -38,4 +40,6 @@ public interface ItWorkDao extends GenericDao<ItWorkVO, String> {
3840
void cleanup(long wait);
3941

4042
boolean updateStep(ItWorkVO work, Step step);
43+
44+
List<ItWorkVO> listWorkInProgressFor(long nodeId);
4145
}

server/src/com/cloud/vm/ItWorkDaoImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package com.cloud.vm;
1919

20+
import java.util.List;
21+
2022
import javax.ejb.Local;
2123

2224
import com.cloud.utils.db.GenericDaoBase;
@@ -32,6 +34,7 @@ public class ItWorkDaoImpl extends GenericDaoBase<ItWorkVO, String> implements I
3234
protected final SearchBuilder<ItWorkVO> AllFieldsSearch;
3335
protected final SearchBuilder<ItWorkVO> CleanupSearch;
3436
protected final SearchBuilder<ItWorkVO> OutstandingWorkSearch;
37+
protected final SearchBuilder<ItWorkVO> WorkInProgressSearch;
3538

3639
protected ItWorkDaoImpl() {
3740
super();
@@ -52,6 +55,11 @@ protected ItWorkDaoImpl() {
5255
OutstandingWorkSearch.and("op", OutstandingWorkSearch.entity().getType(), Op.EQ);
5356
OutstandingWorkSearch.and("step", OutstandingWorkSearch.entity().getStep(), Op.NEQ);
5457
OutstandingWorkSearch.done();
58+
59+
WorkInProgressSearch = createSearchBuilder();
60+
WorkInProgressSearch.and("server", WorkInProgressSearch.entity().getManagementServerId(), Op.EQ);
61+
WorkInProgressSearch.and("step", WorkInProgressSearch.entity().getStep(), Op.NIN);
62+
WorkInProgressSearch.done();
5563
}
5664

5765
@Override
@@ -85,4 +93,14 @@ public boolean updateStep(ItWorkVO work, Step step) {
8593
work.setStep(step);
8694
return update(work.getId(), work);
8795
}
96+
97+
@Override
98+
public List<ItWorkVO> listWorkInProgressFor(long nodeId) {
99+
SearchCriteria<ItWorkVO> sc = WorkInProgressSearch.create();
100+
sc.setParameters("server", nodeId);
101+
sc.setParameters("step", Step.Done);
102+
103+
return search(sc, null);
104+
105+
}
88106
}

server/src/com/cloud/vm/ItWorkVO.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,9 @@ public long getSecondsTaskIsInactive() {
155155
public long getSecondsTaskHasBeenCreated() {
156156
return InaccurateClock.getTimeInSeconds() - this.createdAt;
157157
}
158+
159+
@Override
160+
public String toString() {
161+
return new StringBuilder("ItWork[").append(id).append("-").append(type.toString()).append("-").append(instanceId).append("-").append(step.toString()).append("]").toString();
162+
}
158163
}

server/src/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ public <T extends VMInstanceVO> boolean advanceExpunge(T vm, User caller, Accoun
409409
@Override
410410
public boolean start() {
411411
_executor.scheduleAtFixedRate(new CleanupTask(), _cleanupInterval, _cleanupInterval, TimeUnit.SECONDS);
412+
cancelWorkItems(_nodeId);
412413
return true;
413414
}
414415

@@ -446,6 +447,7 @@ public boolean configure(String name, Map<String, Object> xmlParams) throws Conf
446447
_nodeId = _clusterMgr.getId();
447448

448449
_agentMgr.registerForHostEvents(this, true, true, true);
450+
449451
return true;
450452
}
451453

@@ -1050,6 +1052,41 @@ public <T extends VMInstanceVO> T migrate(T vm, long srcHostId, DeployDestinatio
10501052
}
10511053
}
10521054

1055+
protected void cancelWorkItems(long nodeId) {
1056+
GlobalLock scanLock = GlobalLock.getInternLock(this.getClass().getName());
1057+
1058+
try {
1059+
if (scanLock.lock(3)) {
1060+
try {
1061+
List<ItWorkVO> works = _workDao.listWorkInProgressFor(nodeId);
1062+
for (ItWorkVO work : works) {
1063+
s_logger.info("Handling unfinished work item: " + work);
1064+
try {
1065+
VMInstanceVO vm = _vmDao.findById(work.getInstanceId());
1066+
if (vm != null) {
1067+
if (work.getType() == State.Starting) {
1068+
_haMgr.scheduleRestart(vm, true);
1069+
} else if (work.getType() == State.Stopping) {
1070+
_haMgr.scheduleStop(vm, vm.getHostId(), WorkType.CheckStop);
1071+
} else if (work.getType() == State.Migrating) {
1072+
_haMgr.scheduleMigration(vm);
1073+
}
1074+
}
1075+
work.setStep(Step.Done);
1076+
_workDao.update(work.getId(), work);
1077+
} catch (Exception e) {
1078+
s_logger.error("Error while handling " + work, e);
1079+
}
1080+
}
1081+
} finally {
1082+
scanLock.unlock();
1083+
}
1084+
}
1085+
} finally {
1086+
scanLock.releaseRef();
1087+
}
1088+
}
1089+
10531090
@Override
10541091
public boolean migrateAway(VirtualMachine.Type vmType, long vmId, long srcHostId) throws InsufficientServerCapacityException {
10551092
VirtualMachineGuru<? extends VMInstanceVO> vmGuru = _vmGurus.get(vmType);

0 commit comments

Comments
 (0)