4141import org .apache .cloudstack .framework .config .Configurable ;
4242import org .apache .cloudstack .framework .jobs .AsyncJobManager ;
4343import org .apache .cloudstack .managed .context .ManagedContextRunnable ;
44+ import org .apache .cloudstack .management .ManagementServerHost ;
4445import org .apache .cloudstack .management .ManagementServerHost .State ;
4546import org .apache .cloudstack .maintenance .command .CancelMaintenanceManagementServerHostCommand ;
4647import 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,48 @@ 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+ ScheduledExecutorService cancelMaintenanceService = Executors .newSingleThreadScheduledExecutor (new NamedThreadFactory ("CancelMaintenance-Job" ));
337+ cancelMaintenanceService .schedule (() -> {
338+ cancelMaintenanceTask (msHost .getState ());
339+ }, 0 , TimeUnit .SECONDS );
340+ cancelMaintenanceService .shutdown ();
341+ }
342+
343+ private void cancelMaintenanceTask (ManagementServerHost .State msState ) {
344+ if (State .PreparingForMaintenance .equals (msState )) {
345+ onCancelPreparingForMaintenance ();
346+ }
347+ if (State .Maintenance .equals (msState )) {
348+ onCancelMaintenance ();
349+ }
328350 }
329351
330352 private void waitForPendingJobs (boolean forceMaintenance ) {
@@ -509,6 +531,9 @@ public void cancelPreparingForMaintenance(ManagementServerHostVO msHost) {
509531 jobManager .enableAsyncJobs ();
510532 if (msHost == null ) {
511533 msHost = msHostDao .findByMsid (ManagementServerNode .getManagementServerId ());
534+ if (msHost == null ) {
535+ throw new CloudRuntimeException ("Invalid node id for the management server" );
536+ }
512537 }
513538 onCancelPreparingForMaintenance ();
514539 msHostDao .updateState (msHost .getId (), State .Up );
@@ -595,6 +620,10 @@ protected void runInContext() {
595620 if (forceMaintenance ) {
596621 logger .debug ("Maintenance window timeout, MS is forced to Maintenance Mode" );
597622 ManagementServerHostVO msHost = msHostDao .findByMsid (ManagementServerNode .getManagementServerId ());
623+ if (msHost == null ) {
624+ logger .warn ("Unable to find the management server, invalid node id" );
625+ return ;
626+ }
598627 msHostDao .updateState (msHost .getId (), State .Maintenance );
599628 managementServerMaintenanceManager .onMaintenance ();
600629 managementServerMaintenanceManager .cancelWaitForPendingJobs ();
@@ -627,6 +656,10 @@ protected void runInContext() {
627656 }
628657 if (managementServerMaintenanceManager .isPreparingForMaintenance ()) {
629658 ManagementServerHostVO msHost = msHostDao .findByMsid (ManagementServerNode .getManagementServerId ());
659+ if (msHost == null ) {
660+ logger .warn ("Unable to find the management server, invalid node id" );
661+ return ;
662+ }
630663 if (totalAgents == 0 ) {
631664 logger .info ("MS is in Maintenance Mode" );
632665 msHostDao .updateState (msHost .getId (), State .Maintenance );
@@ -654,14 +687,16 @@ protected void runInContext() {
654687 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 ()));
655688 managementServerMaintenanceManager .cancelPreparingForMaintenance (msHost );
656689 managementServerMaintenanceManager .cancelWaitForPendingJobs ();
657- return ;
658690 }
659691 } else if (managementServerMaintenanceManager .isPreparingForShutdown ()) {
660692 logger .info ("MS is Ready To Shutdown" );
661693 ManagementServerHostVO msHost = msHostDao .findByMsid (ManagementServerNode .getManagementServerId ());
694+ if (msHost == null ) {
695+ logger .warn ("Unable to find the management server, invalid node id" );
696+ return ;
697+ }
662698 msHostDao .updateState (msHost .getId (), State .ReadyToShutDown );
663699 managementServerMaintenanceManager .cancelWaitForPendingJobs ();
664- return ;
665700 }
666701 } catch (final Exception e ) {
667702 logger .error ("Error trying to check/run pending jobs task" , e );
0 commit comments