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,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 );
0 commit comments