[ 
https://issues.apache.org/jira/browse/CLOUDSTACK-8603?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Koushik Das resolved CLOUDSTACK-8603.
-------------------------------------
    Resolution: Fixed

> Random list VM failures at scale (more than 1000 VMs) when VM has resource 
> tags
> -------------------------------------------------------------------------------
>
>                 Key: CLOUDSTACK-8603
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-8603
>             Project: CloudStack
>          Issue Type: Bug
>      Security Level: Public(Anyone can view this level - this is the 
> default.) 
>          Components: Management Server
>    Affects Versions: 4.5.0, 4.5.1
>            Reporter: Koushik Das
>            Assignee: Koushik Das
>             Fix For: 4.6.0
>
>
> Random failures seen in list VM API call (VMs having resource tag) with the 
> following exception. As can be seen from the stack trace, exception is thrown 
> while creating the list response. The test scenario involved doing VM 
> creation/deletion/list operations concurrently over a period of time.
> 2015-05-27 00:16:54,239 ERROR [c.c.a.ApiServer] 
> (catalina-exec-24:ctx-c122d00c ctx-fcdc0d00 ctx-3df89f23) (logid:6004902e) 
> unhandled exception executing api command: [Ljava.lang.String;@76642f16
> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
> at java.util.ArrayList.rangeCheck(ArrayList.java:635)
> at java.util.ArrayList.get(ArrayList.java:411)
> at 
> com.cloud.api.query.dao.ResourceTagJoinDaoImpl.searchById(ResourceTagJoinDaoImpl.java:154)
> at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
> at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:606)
> at 
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
> at 
> com.cloud.utils.db.TransactionContextInterceptor.invoke(TransactionContextInterceptor.java:34)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
> at 
> org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
> at 
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
> at com.sun.proxy.$Proxy86.searchById(Unknown Source)
> at com.cloud.api.ApiDBUtils.findResourceTagViewById(ApiDBUtils.java:1636)
> at 
> com.cloud.api.query.dao.UserVmJoinDaoImpl.newUserVmResponse(UserVmJoinDaoImpl.java:266)
> at sun.reflect.GeneratedMethodAccessor126.invoke(Unknown Source)
> at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:606)
> at 
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
> at 
> com.cloud.utils.db.TransactionContextInterceptor.invoke(TransactionContextInterceptor.java:34)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
> at 
> org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
> at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
> at 
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
> at com.sun.proxy.$Proxy176.newUserVmResponse(Unknown Source)
> at com.cloud.api.ApiDBUtils.newUserVmResponse(ApiDBUtils.java:1600)
> at 
> com.cloud.api.query.ViewResponseHelper.createUserVmResponse(ViewResponseHelper.java:140)
> at 
> com.cloud.api.query.QueryManagerImpl.searchForUserVMs(QueryManagerImpl.java:762)
> at 
> org.apache.cloudstack.api.command.user.vm.ListVMsCmd.execute(ListVMsCmd.java:227)
> at com.cloud.api.ApiDispatcher.dispatch(ApiDispatcher.java:150)
> at com.cloud.api.ApiServer.queueCommand(ApiServer.java:700)
> at com.cloud.api.ApiServer.handleRequest(ApiServer.java:525)
> at com.cloud.api.ApiServlet.processRequestInContext(ApiServlet.java:282)
> There are 2 part to list VM API:
> a. Get a list of VMs based on search criteria from the user_vm_view view in 
> DB.
> b. Create the response records corresponding to each VM obtained as part of 
> (a). This record creation involves fetching additional data from other 
> views/tables in the DB. One such view is resource_tag_view.
> Now consider the following sequence of events that may lead to the issue:
> a. List VM call fetches a lot of VMs from user_vm_view.
> b. VM response is created for each VM by iterating over the list obtained 
> from (a).
> c. Now while (b) is in progress, a VM which is in the list from (a) and not 
> yet processed in (b) got destroyed.
> d. Now when response generation happens for destroyed VM, there is a DB query 
> to fetch resource tag details from resource_tag_view. This query returns 
> empty as the resource tag got deleted from DB as part of VM destroy.
> e. In the resource tag fetching code there is no check for the condition 
> mentioned in (d) and so the index out of bound exception.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to