Skip to content

Commit c7387fd

Browse files
code improvements
1 parent e2c590d commit c7387fd

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

plugins/maintenance/src/main/java/org/apache/cloudstack/maintenance/ManagementServerMaintenanceManagerImpl.java

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.cloudstack.framework.config.Configurable;
4242
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
4343
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
44+
import org.apache.cloudstack.management.ManagementServerHost;
4445
import org.apache.cloudstack.management.ManagementServerHost.State;
4546
import org.apache.cloudstack.maintenance.command.CancelMaintenanceManagementServerHostCommand;
4647
import org.apache.cloudstack.maintenance.command.CancelShutdownManagementServerHostCommand;
@@ -245,6 +246,9 @@ public void triggerShutdown() {
245246
this.shutdownTriggered = true;
246247
prepareForShutdown(true);
247248
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
249+
if (msHost == null) {
250+
throw new CloudRuntimeException("Invalid node id for the management server");
251+
}
248252
msHostDao.updateState(msHost.getId(), State.ShuttingDown);
249253
}
250254

@@ -269,12 +273,18 @@ private void prepareForShutdown(boolean postTrigger) {
269273
public void prepareForShutdown() {
270274
prepareForShutdown(false);
271275
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
276+
if (msHost == null) {
277+
throw new CloudRuntimeException("Invalid node id for the management server");
278+
}
272279
msHostDao.updateState(msHost.getId(), State.PreparingForShutDown);
273280
}
274281

275282
@Override
276283
public void cancelShutdown() {
277284
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
285+
if (msHost == null) {
286+
throw new CloudRuntimeException("Invalid node id for the management server");
287+
}
278288
if (!this.preparingForShutdown && !(State.PreparingForShutDown.equals(msHost.getState()) || State.ReadyToShutDown.equals(msHost.getState()))) {
279289
throw new CloudRuntimeException("Shutdown has not been triggered");
280290
}
@@ -295,36 +305,46 @@ public void prepareForMaintenance(String lbAlorithm, boolean forced) {
295305
if (this.preparingForMaintenance) {
296306
throw new CloudRuntimeException("Maintenance has already been initiated");
297307
}
308+
309+
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
310+
if (msHost == null) {
311+
throw new CloudRuntimeException("Invalid node id for the management server");
312+
}
298313
this.preparingForMaintenance = true;
299314
this.maintenanceStartTime = System.currentTimeMillis();
300315
this.lbAlgorithm = lbAlorithm;
301316
jobManager.disableAsyncJobs();
302317
onPreparingForMaintenance();
303318
waitForPendingJobs(forced);
304-
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
305319
msHostDao.updateState(msHost.getId(), State.PreparingForMaintenance);
306320
}
307321

308322
@Override
309323
public void cancelMaintenance() {
310324
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
325+
if (msHost == null) {
326+
throw new CloudRuntimeException("Invalid node id for the management server");
327+
}
311328
if (!this.preparingForMaintenance && !(State.Maintenance.equals(msHost.getState()) || State.PreparingForMaintenance.equals(msHost.getState()))) {
312329
throw new CloudRuntimeException("Maintenance has not been initiated");
313330
}
314331
resetMaintenanceParams();
315332
resetShutdownParams();
316333
jobManager.enableAsyncJobs();
317334
cancelWaitForPendingJobs();
318-
if (msHost != null) {
319-
if (State.PreparingForMaintenance.equals(msHost.getState())) {
320-
onCancelPreparingForMaintenance();
321-
}
322-
if (State.Maintenance.equals(msHost.getState())) {
323-
onCancelMaintenance();
324-
}
325-
}
326-
327335
msHostDao.updateState(msHost.getId(), State.Up);
336+
Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("CancelMaintenance-Job")).schedule(() -> {
337+
cancelMaintenanceTask(msHost.getState());
338+
}, 0, TimeUnit.SECONDS);
339+
}
340+
341+
private void cancelMaintenanceTask(ManagementServerHost.State msState) {
342+
if (State.PreparingForMaintenance.equals(msState)) {
343+
onCancelPreparingForMaintenance();
344+
}
345+
if (State.Maintenance.equals(msState)) {
346+
onCancelMaintenance();
347+
}
328348
}
329349

330350
private void waitForPendingJobs(boolean forceMaintenance) {
@@ -509,6 +529,9 @@ public void cancelPreparingForMaintenance(ManagementServerHostVO msHost) {
509529
jobManager.enableAsyncJobs();
510530
if (msHost == null) {
511531
msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
532+
if (msHost == null) {
533+
throw new CloudRuntimeException("Invalid node id for the management server");
534+
}
512535
}
513536
onCancelPreparingForMaintenance();
514537
msHostDao.updateState(msHost.getId(), State.Up);
@@ -595,6 +618,10 @@ protected void runInContext() {
595618
if (forceMaintenance) {
596619
logger.debug("Maintenance window timeout, MS is forced to Maintenance Mode");
597620
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
621+
if (msHost == null) {
622+
logger.warn("Unable to find the management server, invalid node id");
623+
return;
624+
}
598625
msHostDao.updateState(msHost.getId(), State.Maintenance);
599626
managementServerMaintenanceManager.onMaintenance();
600627
managementServerMaintenanceManager.cancelWaitForPendingJobs();
@@ -627,6 +654,10 @@ protected void runInContext() {
627654
}
628655
if (managementServerMaintenanceManager.isPreparingForMaintenance()) {
629656
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
657+
if (msHost == null) {
658+
logger.warn("Unable to find the management server, invalid node id");
659+
return;
660+
}
630661
if (totalAgents == 0) {
631662
logger.info("MS is in Maintenance Mode");
632663
msHostDao.updateState(msHost.getId(), State.Maintenance);
@@ -654,14 +685,16 @@ protected void runInContext() {
654685
logger.warn(String.format("Unable to prepare for maintenance, cannot transfer direct agents on this management server node %d (id: %s)", ManagementServerNode.getManagementServerId(), msHost.getUuid()));
655686
managementServerMaintenanceManager.cancelPreparingForMaintenance(msHost);
656687
managementServerMaintenanceManager.cancelWaitForPendingJobs();
657-
return;
658688
}
659689
} else if (managementServerMaintenanceManager.isPreparingForShutdown()) {
660690
logger.info("MS is Ready To Shutdown");
661691
ManagementServerHostVO msHost = msHostDao.findByMsid(ManagementServerNode.getManagementServerId());
692+
if (msHost == null) {
693+
logger.warn("Unable to find the management server, invalid node id");
694+
return;
695+
}
662696
msHostDao.updateState(msHost.getId(), State.ReadyToShutDown);
663697
managementServerMaintenanceManager.cancelWaitForPendingJobs();
664-
return;
665698
}
666699
} catch (final Exception e) {
667700
logger.error("Error trying to check/run pending jobs task", e);

plugins/maintenance/src/test/java/org/apache/cloudstack/maintenance/ManagementServerMaintenanceManagerImplTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ public void prepareForMaintenanceAndCancelFromMaintenanceState() {
325325
Mockito.doNothing().when(jobManagerMock).enableAsyncJobs();
326326
spy.cancelMaintenance();
327327
Mockito.verify(jobManagerMock).enableAsyncJobs();
328-
Mockito.verify(spy, Mockito.times(1)).onCancelMaintenance();
329328
}
330329

331330
@Test
@@ -344,7 +343,6 @@ public void prepareForMaintenanceAndCancelFromPreparingForMaintenanceState() {
344343
Mockito.doNothing().when(jobManagerMock).enableAsyncJobs();
345344
spy.cancelMaintenance();
346345
Mockito.verify(jobManagerMock).enableAsyncJobs();
347-
Mockito.verify(spy, Mockito.times(1)).onCancelPreparingForMaintenance();
348346
}
349347

350348
@Test

0 commit comments

Comments
 (0)