BartJM opened a new issue, #9887:
URL: https://github.com/apache/cloudstack/issues/9887

   <!--
   Verify first that your issue/request is not already reported on GitHub.
   Also test if the latest release and main branch are affected too.
   Always add information AFTER of these HTML comments, but no need to delete 
the comments.
   -->
   
   ##### ISSUE TYPE
   <!-- Pick one below and delete the rest -->
    * Bug Report
   
   ##### COMPONENT NAME
   <!--
   Categorize the issue, e.g. API, VR, VPN, UI, etc.
   -->
   ~~~
   Maintenance Mode
   ~~~
   
   ##### CLOUDSTACK VERSION
   <!--
   New line separated list of affected versions, commit ID for issues on main 
branch.
   -->
   
   ~~~
   4.19.1.2
   ~~~
   
   ##### CONFIGURATION
   <!--
   Information about the configuration if relevant, e.g. basic network, 
advanced networking, etc.  N/A otherwise
   -->
   ~~~
   host.maintenance.local.storage.strategy: Migration
   ~~~
   
   ##### OS / ENVIRONMENT
   <!--
   Information about the environment if relevant, N/A otherwise
   -->
   
   
   ##### SUMMARY
   <!-- Explain the problem/feature briefly -->
   Nullpointer exception when setting a host in maintenance if the host has a 
running vm with a local storage data disk.
   
   Found the bug while fixing another bug where the host going into maintenance 
is not avoided so maintenance for local storage vms can fail.
   During testing I did not find a path in the current version to reach the 
breaking code without a debugger attached.
   
   Bug is caused by the deployment returning `null` causing a nullpointer in 
https://github.com/apache/cloudstack/blob/18fe4226cecc930ec0b39c43e5b63a48c17c2ad4/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java#L1471
   
   Deployment returns null as the only suitable storage pool returned by 
`findSuitablePoolsForVolumes` in 
`server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java` for 
the data disk is the host the data disk is located on.  (Only applies for data 
disk, for a local storage root disk all suitable storage pools are evaluated). 
With that host being avoided to prepare it for maintenance the deployment 
planner has no suitable hosts returning null.
   
   Migrating the vm using the ui does not cause issues.
   
   ##### STEPS TO REPRODUCE
   <!--
   For bugs, show exactly how to reproduce the problem, using a minimal 
test-case. Use Screenshots if accurate.
   
   For new features, show how the feature would be used.
   -->
   * Create a vm with a local storage data disk.
   * Add breakpoint at the start of 
https://github.com/apache/cloudstack/blob/18fe4226cecc930ec0b39c43e5b63a48c17c2ad4/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java#L300
   * Set host with the vm in maintenance
   * Add the host going into maintenance to the avoids `avoids.addHost();`
   * Continue running
   
   <!-- Paste example playbooks or commands between quotes below -->
   
   
   <!-- You can also paste gist.github.com links for larger files -->
   
   ##### EXPECTED RESULTS
   <!-- What did you expect to happen when running the steps above? -->
   VM migrated and host going into maintenance
   
   ##### ACTUAL RESULTS
   <!-- What actually happened? -->
   
   <!-- Paste verbatim command output between quotes below -->
   ~~~
   2024-11-01 16:04:39,428 ERROR [c.c.a.ApiAsyncJobDispatcher] 
(API-Job-Executor-5:ctx-b739d4ae job-371) (logid:51494050) Unexpected exception 
while executing org.apache.cloudstack.api.command.
   admin.host.PrepareForMaintenanceCmd
   java.lang.NullPointerException
           at 
com.cloud.resource.ResourceManagerImpl.migrateAwayVmWithVolumes(ResourceManagerImpl.java:1471)
           at 
com.cloud.resource.ResourceManagerImpl.doMaintain(ResourceManagerImpl.java:1403)
           at 
com.cloud.resource.ResourceManagerImpl.maintain(ResourceManagerImpl.java:1489)
           at 
com.cloud.resource.ResourceManagerImpl.maintain(ResourceManagerImpl.java:1543)
           at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
           at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
           at java.base/java.lang.reflect.Method.invoke(Method.java:566)
           at 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
           at 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
           at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
           at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
           at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
           at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
           at com.sun.proxy.$Proxy200.maintain(Unknown Source)
           at 
org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd.execute(PrepareForMaintenanceCmd.java:101)
           at com.cloud.api.ApiDispatcher.dispatch(ApiDispatcher.java:172)
           at 
com.cloud.api.ApiAsyncJobDispatcher.runJob(ApiAsyncJobDispatcher.java:112)
           at 
org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl$5.runInContext(AsyncJobManagerImpl.java:654)
           at 
org.apache.cloudstack.managed.context.ManagedContextRunnable$1.run(ManagedContextRunnable.java:48)
           at 
org.apache.cloudstack.managed.context.impl.DefaultManagedContext$1.call(DefaultManagedContext.java:55)
           at 
org.apache.cloudstack.managed.context.impl.DefaultManagedContext.callWithContext(DefaultManagedContext.java:102)
           at 
org.apache.cloudstack.managed.context.impl.DefaultManagedContext.runWithContext(DefaultManagedContext.java:52)
           at 
org.apache.cloudstack.managed.context.ManagedContextRunnable.run(ManagedContextRunnable.java:45)
           at 
org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl$5.run(AsyncJobManagerImpl.java:602)
           at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
           at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
           at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
           at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
           at java.base/java.lang.Thread.run(Thread.java:829)
   
   ~~~
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@cloudstack.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to