Hi Kiran, For backward compatibility, the `considerlasthost` is default to true if it is not set.
The issue seems to be fixed in 4.19.1.0 by https://github.com/apache/cloudstack/pull/9037 However, I cannot find the changes in the code base of 4.19 branch. https://github.com/apache/cloudstack/blob/4.19/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java#L449-L453 It looks like something is wrong during the merge of the 4.18 to 4.19 branch. cc @Daan Hoogland <daan.hoogl...@shapeblue.com> @suresh.anapa...@shapeblue.com <suresh.anapa...@shapeblue.com> -Wei On Fri, Jan 10, 2025 at 7:58 AM Kiran Chavala <kiran.chav...@shapeblue.com> wrote: > Hi Eric > > I am not hitting the issue on the latest 4.20 release of cloudstack > > For a normal end user, it doesn’t consider the last host to start the > virtual machine > > the startVirtualMachine Api call has the parameter “considerlasthost” for > the admin user > > > https://cloudstack.apache.org/api/apidocs-4.20/apis/startVirtualMachine.html > > For a normal user there is no parameter “ considerlasthost” , the > deployment planner picks up the available host > > Normal user > > (localcloud2) 🐱 > start virtualmachine > bootintosetup= clusterid= filter= hostid= id= > podid= > > > Regards > Kiran > > From: Eric Green <eric.lee.gr...@gmail.com> > Date: Friday, 10 January 2025 at 4:05 AM > To: users@cloudstack.apache.org <users@cloudstack.apache.org> > Subject: A possible bug in instance start for end users when a host is > deleted > This appears to me to be a bug. Is it a known bug? I tried searching the > Github bug list but Github's search function is awful. > > Cloudstack 4.19.1.3, Ubuntu 20.04 management server, Ubuntu 22.04 compute > hosts, KVM hypervisor. > > Scenario: There are four physical hosts, A, B, C, D. Let's say they're > host ID 62,63,64,65 in the hosts table. Each host has at least one virtual > machine running on it. > > Shut down the virtual machines on host A (without starting them elsewhere) > which sets the last_host_id to 62, and delete host A in the Infrastructure > tab. > > As an end user (not an admin), try to start one of the virtual machines > that were formerly on host A. > > End result: The deployment planner returns the last_host_id of host A as > the host to start the VM on. Since that host is marked deleted, the > deployment executor removes it from the list of available hosts to start > the VM on, and then throws an exception. The exception then appears on the > GUI as a red box that basically gives the end user zero useful information. > > Expected result: The same as for admin users — the deployment planner > notices that host A is deleted and cannot be used to deploy the VM, and > instead picks a host from [B,C,D]. > > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Adding pods to avoid lists for non-explicit VM deployment: [] > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Adding clusters to avoid lists for non-explicit VM deployment: [] > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Adding hosts to avoid lists for non-explicit VM deployment: [] > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > DeploymentPlanner allocation algorithm: null > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Trying to allocate a host and storage pools from dc:1, > pod:null,cluster:null, requested cpu: 4000, requested ram: (4.00 GB) > 4294967296 > 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Is ROOT volume READY (pool already allocated)?: Yes > 2025-01-09 13:28:35,466 DEBUG [c.c.a.ApiServer] > (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) CIDRs from > which account 'Account > [{"accountName":"eric.green","id":8,"uuid":"e8baeda0-90a5-4c97-aa51-0adbfa3c0e4c"}]' > is allowed to perform API calls: 0.0.0.0/0,::/0 > 2025-01-09 <http://0.0.0.0/0,::/02025-01-09> 13:28:35,466 DEBUG > [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 > job-418252 ctx-34040330) (logid:086f0ba0) Deploy avoids pods: [], clusters: > [], hosts: [] > 2025-01-09 13:28:35,466 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > Deploy hosts with priorities {} , hosts have NORMAL priority by default > 2025-01-09 13:28:35,467 DEBUG [c.c.d.DeploymentPlanningManagerImpl] > (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) > This VM has last host_id specified, trying to choose the same host: 62 > 2025-01-09 13:28:35,471 DEBUG [o.a.c.a.StaticRoleBasedAPIAccessChecker] > (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) RoleService > is enabled. We will use it instead of StaticRoleBasedAPIAccessChecker. > 2025-01-09 13:28:35,471 DEBUG [o.a.c.r.ApiRateLimitServiceImpl] > (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) API rate > limiting is disabled. We will not use ApiRateLimitService. > 2025-01-09 13:28:35,473 ERROR [c.c.a.ApiAsyncJobDispatcher] > (API-Job-Executor-81:ctx-4b9a2500 job-418252) (logid:086f0ba0) Unexpected > exception while executing > org.apache.cloudstack.api.command.user.vm.StartVMCmd > java.lang.NullPointerException > at > com.cloud.host.dao.HostDaoImpl.loadHostTags(HostDaoImpl.java:879) > at jdk.internal.reflect.GeneratedMethodAccessor336.invoke(Unknown > Source) > 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 > com.cloud.utils.db.TransactionContextInterceptor.invoke(TransactionContextInterceptor.java:34) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) > 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.$Proxy96.loadHostTags(Unknown Source) > at > com.cloud.deploy.DeploymentPlanningManagerImpl.planDeployment(DeploymentPlanningManagerImpl.java:451) > at > org.apache.cloudstack.engine.cloud.entity.api.VMEntityManagerImpl.reserveVirtualMachine(VMEntityManagerImpl.java:206) > at > org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl.reserve(VirtualMachineEntityImpl.java:202) > at > com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:5445) > at > com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:5299) > at > com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:3224) > at jdk.internal.reflect.GeneratedMethodAccessor787.invoke(Unknown > Source) > 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.apache.cloudstack.network.contrail.management.EventUtils$EventInterceptor.invoke(EventUtils.java:107) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) > at > com.cloud.event.ActionEventInterceptor.invoke(ActionEventInterceptor.java:52) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) > 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.$Proxy186.startVirtualMachine(Unknown Source) > at > org.apache.cloudstack.api.command.user.vm.StartVMCmd.execute(StartVMCmd.java:181) > 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) > > > >