Any update on this please?

On Thu, Oct 8, 2015 at 10:50 PM, Chanaka Fernando <chana...@wso2.com> wrote:

> Hi NuwanD,
>
> The fix is not in kernel but in carbon-mediation. What I need is kernel
> team's opinion on usage of the aforementioned method. If we can get their
> input, fix is straightforward.
>
> On Thu, Oct 8, 2015 at 9:58 PM, Nuwan Dias <nuw...@wso2.com> wrote:
>
>> Hi all,
>>
>> Will this be fixed in kernel 4.4.2? Its causing integration test failures
>> in API Manager and we would like this to be fixed soon.
>>
>> Thanks,
>> NuwanD.
>>
>> On Thu, Oct 8, 2015 at 6:22 PM, Chanaka Fernando <chana...@wso2.com>
>> wrote:
>>
>>> [Adding Kishanthan]
>>>
>>> On Thu, Oct 8, 2015 at 6:14 PM, Chanaka Fernando <chana...@wso2.com>
>>> wrote:
>>>
>>>> Hi All,
>>>>
>>>> At last, I was able to find the root cause for this behavior. This is
>>>> actually coming from carbon-mediation code. What actually happens is that
>>>> when ESB starts with a tenant, it will not load the tenant until it
>>>> receives the first request. When It receives the first request, it will
>>>> call the MultitenantMessageReceiver.processRequest() method. Within this
>>>> method, it will call the following method.
>>>>
>>>> PrivilegedCarbonContext.startTenantFlow();
>>>>
>>>>
>>>> This will get the ThreadLocal variable *parentContextHolderStack *and
>>>> get the stack  and push the carbonContextDataHolder object to the
>>>> stack. After this, tenant loading happens and within the initialization of
>>>> the carbon mediation registry we have the following code segment.
>>>>
>>>> *org.wso2.carbon.mediation.registry.WSO2Registry.java*
>>>>
>>>> /**
>>>>  *  Carbon Kernel mandates to set Threadlocal before calling anything in 
>>>> kernel
>>>>  */
>>>> private void setTenantInfo() {
>>>>     // Preserve user name
>>>>     String username = 
>>>> PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
>>>>     *PrivilegedCarbonContext.destroyCurrentContext();*
>>>>     PrivilegedCarbonContext cc = 
>>>> PrivilegedCarbonContext.getThreadLocalCarbonContext();
>>>>     cc.setTenantDomain(domain);
>>>>     cc.setTenantId(tenantId);
>>>>     if (username != null) {         // Set back the user name
>>>>         
>>>> PrivilegedCarbonContext.getThreadLocalCarbonContext().setUsername(username);
>>>>     }
>>>> }
>>>>
>>>> Within the above method following line causes the issue.
>>>>
>>>> PrivilegedCarbonContext.destroyCurrentContext();
>>>>
>>>> When this method is called, it will reset the *parentContextHolderStack
>>>> *and the initial object push into the stack is destroyed. Then after
>>>> tenant loading, within the MultitenantMessageReceiver.processRequest()
>>>> method, it tries to end the tenant flow within finally block and try to pop
>>>> the object which it pushes early. But right now, we have a new context
>>>> stack and it will throw the emptyStackException due to that.
>>>>
>>>> @Sameera/KasunG: Do we really need to use the following code segment
>>>> within the above method?
>>>>
>>>>
>>>> *PrivilegedCarbonContext.destroyCurrentContext();*
>>>>
>>>> I saw this method called within carbon-mediation components in 3
>>>> different locations. AFAIU, we don't need to destroy the current context
>>>> when we are accessing the ThreadLocalContext. Please share your thoughts
>>>> such that we can fix this issue. Issue is fixed when I comment out the
>>>> above line :)
>>>>
>>>>
>>>> Thanks,
>>>> Chanaka
>>>>
>>>>
>>>>
>>>> On Wed, Oct 7, 2015 at 5:34 PM, Chanaka Fernando <chana...@wso2.com>
>>>> wrote:
>>>>
>>>>> Hi Sameera/KasunG,
>>>>>
>>>>> I have debugged the code to find the root cause for this empty stack
>>>>> exception. This is causing several other issues at the ESB layer. What
>>>>> actually happens is that inside the
>>>>> MultitenantMessageReceiver.processRequest() method, we have the following
>>>>> code segment.
>>>>>
>>>>> try {
>>>>>     PrivilegedCarbonContext.startTenantFlow();
>>>>>     PrivilegedCarbonContext privilegedCarbonContext = 
>>>>> PrivilegedCarbonContext.getThreadLocalCarbonContext();
>>>>>     privilegedCarbonContext.setTenantDomain(tenantDomain, true);
>>>>>     // this is to prevent non-blocking transports from sending 202
>>>>>     
>>>>> mainInMsgContext.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN,
>>>>>  "SKIP");
>>>>>
>>>>>     ConfigurationContext tenantConfigCtx =
>>>>>                                            
>>>>> TenantAxisUtils.getTenantConfigurationContext(tenantDomain,
>>>>>                                                                           
>>>>>                mainConfigCtx);
>>>>>     if (tenantConfigCtx == null) {
>>>>>         // Throw AxisFault: Tenant does not exist
>>>>>         handleException(mainInMsgContext, new AxisFault("Tenant " + 
>>>>> tenantDomain +
>>>>>                                                         "  not found"));
>>>>>         return;
>>>>>     }
>>>>>
>>>>>     if (mainInMsgContext.isDoingREST()) { // Handle REST requests
>>>>>         doREST(mainInMsgContext, to, tenantDomain, tenantConfigCtx, 
>>>>> serviceAndOperation);
>>>>>     } else {
>>>>>         doSOAP(mainInMsgContext, tenantDomain, tenantConfigCtx, 
>>>>> serviceAndOperation);
>>>>>     }
>>>>> } finally {
>>>>>     PrivilegedCarbonContext.endTenantFlow();
>>>>> }
>>>>>
>>>>>
>>>>> When we are calling the endTenantFlow() method, it will go inside the
>>>>> following method within the CarbonContextDataHolder class.
>>>>>
>>>>> /**
>>>>>  * This will end the tenant flow and restore the previous CarbonContext.
>>>>>  */
>>>>> public void endTenantFlow() {
>>>>>     Stack<CarbonContextDataHolder> carbonContextDataHolders = 
>>>>> parentContextHolderStack.get();
>>>>>     if (carbonContextDataHolders != null) {
>>>>>         currentContextHolder.set(carbonContextDataHolders.pop());
>>>>>     }
>>>>> }
>>>>>
>>>>>
>>>>> At the time of calling this method carbonContextDataHolders stack has
>>>>> become empty and causing the EmptyStackException. When I debug the code, I
>>>>> found that there is a scheduled task running in a different thread and
>>>>> accessing the same method frequently. This is coming from
>>>>> AbstractQuartzTaskManager class method.
>>>>>
>>>>> public void triggerComplete(Trigger trigger, JobExecutionContext 
>>>>> jobExecutionContext,
>>>>>         Trigger.CompletedExecutionInstruction 
>>>>> completedExecutionInstruction) {
>>>>>     PrivilegedCarbonContext.startTenantFlow();
>>>>>     
>>>>> PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(getTenantId(),
>>>>>  true);
>>>>>     if(trigger.getNextFireTime() == null) {
>>>>>         try {
>>>>>             TaskUtils.setTaskFinished(getTaskRepository(), 
>>>>> trigger.getJobKey().getName(), true);
>>>>>         } catch (TaskException e) {
>>>>>             log.error("Error in Finishing Task [" + 
>>>>> trigger.getJobKey().getName() +
>>>>>                     "]: " + e.getMessage(), e);
>>>>>         }
>>>>>     }
>>>>>     PrivilegedCarbonContext.endTenantFlow();
>>>>> }
>>>>>
>>>>>
>>>>> What I could not figure out is the thread which is emptying the stack.
>>>>> Is it possible that a different thread can access this
>>>>> carbonContextDataHolders stack and popping out the element before the
>>>>> PassThroughMessageProcessor thread access the same?
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Jul 8, 2015 at 11:12 AM, Jagath Sisirakumara Ariyarathne <
>>>>> jaga...@wso2.com> wrote:
>>>>>
>>>>>> Hi Sameera,
>>>>>>
>>>>>> I will check it and update.
>>>>>>
>>>>>> Thanks.
>>>>>>
>>>>>> On Wed, Jul 8, 2015 at 11:10 AM, Sameera Jayasoma <same...@wso2.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Jagath,
>>>>>>>
>>>>>>> Can you debug and see whey the stack becomes empty? Thats a serious
>>>>>>> problem. Stack should be become empty here.
>>>>>>>
>>>>>>> Checking whether the stack is empty will stop the error log, but it
>>>>>>> doesn't fix the actual problem here.
>>>>>>>
>>>>>>> On Wed, Jul 8, 2015 at 10:50 AM, Sameera Jayasoma <same...@wso2.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I understand, but we need to understand why that stack becomes
>>>>>>>> empty.  AFAIK, if we follow the proper APIs, stack should not become 
>>>>>>>> empty
>>>>>>>>
>>>>>>>> On Tue, Jul 7, 2015 at 5:47 PM, Kasun Indrasiri <ka...@wso2.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Yeah, we should always check for an empty stack.
>>>>>>>>>
>>>>>>>>> On Tue, Jul 7, 2015 at 5:17 PM, Malaka Silva <mal...@wso2.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> I think we need to check isEmpty as well.
>>>>>>>>>>
>>>>>>>>>> On Tue, Jul 7, 2015 at 3:41 PM, Jagath Sisirakumara Ariyarathne <
>>>>>>>>>> jaga...@wso2.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I am working on [1] and found that the cause of the exception
>>>>>>>>>>> mentioned below is in the code segment in org
>>>>>>>>>>> .wso2.carbon.context.internal.CarbonContextDataHolder in
>>>>>>>>>>> carbon.utils.
>>>>>>>>>>>
>>>>>>>>>>> public void endTenantFlow() {
>>>>>>>>>>>
>>>>>>>>>>>     Stack<CarbonContextDataHolder> carbonContextDataHolders = 
>>>>>>>>>>> parentContextHolderStack.get();
>>>>>>>>>>>     if (carbonContextDataHolders != null) {
>>>>>>>>>>>         currentContextHolder.set(carbonContextDataHolders.pop());
>>>>>>>>>>>     }
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> *Exception :*
>>>>>>>>>>>
>>>>>>>>>>> java.util.EmptyStackException
>>>>>>>>>>>     at java.util.Stack.peek(Stack.java:102)
>>>>>>>>>>>     at java.util.Stack.pop(Stack.java:84)
>>>>>>>>>>>     at 
>>>>>>>>>>> org.wso2.carbon.context.internal.CarbonContextDataHolder.endTenantFlow(CarbonContextDataHolder.java:1291)
>>>>>>>>>>>     at 
>>>>>>>>>>> org.wso2.carbon.context.PrivilegedCarbonContext.endTenantFlow(PrivilegedCarbonContext.java:75)
>>>>>>>>>>>     at 
>>>>>>>>>>> org.wso2.carbon.ntask.core.impl.TaskQuartzJobAdapter.execute(TaskQuartzJobAdapter.java:69)
>>>>>>>>>>>     at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
>>>>>>>>>>>     at 
>>>>>>>>>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>>>>>>>>>>>     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
>>>>>>>>>>>     at 
>>>>>>>>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>>>>>>>>>>>     at 
>>>>>>>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>>>>>>>>>>>     at java.lang.Thread.run(Thread.java:745)
>>>>>>>>>>>
>>>>>>>>>>> Issue occurs when it tries to pop elements from 
>>>>>>>>>>> carbonContextDataHolders stack when it is empty.
>>>>>>>>>>>
>>>>>>>>>>> Is it a possible scenario that this stack being empty and shouldn't 
>>>>>>>>>>> it be handled at CarbonContextDataHolder (check isEmpty in stack)?
>>>>>>>>>>>
>>>>>>>>>>> [1] - https://wso2.org/jira/browse/ESBJAVA-3832
>>>>>>>>>>>
>>>>>>>>>>> Thanks
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Jagath Ariyarathne
>>>>>>>>>>> Technical Lead
>>>>>>>>>>> WSO2 Inc.  http://wso2.com/
>>>>>>>>>>> Email: jaga...@wso2.com
>>>>>>>>>>> Mob  : +94 77 386 7048
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>>
>>>>>>>>>> Best Regards,
>>>>>>>>>>
>>>>>>>>>> Malaka Silva
>>>>>>>>>> Senior Tech Lead
>>>>>>>>>> M: +94 777 219 791
>>>>>>>>>> Tel : 94 11 214 5345
>>>>>>>>>> Fax :94 11 2145300
>>>>>>>>>> Skype : malaka.sampath.silva
>>>>>>>>>> LinkedIn : http://www.linkedin.com/pub/malaka-silva/6/33/77
>>>>>>>>>> Blog : http://mrmalakasilva.blogspot.com/
>>>>>>>>>>
>>>>>>>>>> WSO2, Inc.
>>>>>>>>>> lean . enterprise . middleware
>>>>>>>>>> http://www.wso2.com/
>>>>>>>>>> http://www.wso2.com/about/team/malaka-silva/
>>>>>>>>>> <http://wso2.com/about/team/malaka-silva/>
>>>>>>>>>>
>>>>>>>>>> Save a tree -Conserve nature & Save the world for your future.
>>>>>>>>>> Print this email only if it is absolutely necessary.
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Dev mailing list
>>>>>>>>>> Dev@wso2.org
>>>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Kasun Indrasiri
>>>>>>>>> Software Architect
>>>>>>>>> WSO2, Inc.; http://wso2.com
>>>>>>>>> lean.enterprise.middleware
>>>>>>>>>
>>>>>>>>> cell: +94 77 556 5206
>>>>>>>>> Blog : http://kasunpanorama.blogspot.com/
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Dev mailing list
>>>>>>>>> Dev@wso2.org
>>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Sameera Jayasoma,
>>>>>>>> Software Architect,
>>>>>>>>
>>>>>>>> WSO2, Inc. (http://wso2.com)
>>>>>>>> email: same...@wso2.com
>>>>>>>> blog: http://blog.sameera.org
>>>>>>>> twitter: https://twitter.com/sameerajayasoma
>>>>>>>> flickr: http://www.flickr.com/photos/sameera-jayasoma/collections
>>>>>>>> Mobile: 0094776364456
>>>>>>>>
>>>>>>>> Lean . Enterprise . Middleware
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Sameera Jayasoma,
>>>>>>> Software Architect,
>>>>>>>
>>>>>>> WSO2, Inc. (http://wso2.com)
>>>>>>> email: same...@wso2.com
>>>>>>> blog: http://blog.sameera.org
>>>>>>> twitter: https://twitter.com/sameerajayasoma
>>>>>>> flickr: http://www.flickr.com/photos/sameera-jayasoma/collections
>>>>>>> Mobile: 0094776364456
>>>>>>>
>>>>>>> Lean . Enterprise . Middleware
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Dev mailing list
>>>>>>> Dev@wso2.org
>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Jagath Ariyarathne
>>>>>> Technical Lead
>>>>>> WSO2 Inc.  http://wso2.com/
>>>>>> Email: jaga...@wso2.com
>>>>>> Mob  : +94 77 386 7048
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Dev mailing list
>>>>>> Dev@wso2.org
>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> --
>>>>> Chanaka Fernando
>>>>> Senior Technical Lead
>>>>> WSO2, Inc.; http://wso2.com
>>>>> lean.enterprise.middleware
>>>>>
>>>>> mobile: +94 773337238
>>>>> Blog : http://soatutorials.blogspot.com
>>>>> LinkedIn:http://www.linkedin.com/pub/chanaka-fernando/19/a20/5b0
>>>>> Twitter:https://twitter.com/chanakaudaya
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> --
>>>> Chanaka Fernando
>>>> Senior Technical Lead
>>>> WSO2, Inc.; http://wso2.com
>>>> lean.enterprise.middleware
>>>>
>>>> mobile: +94 773337238
>>>> Blog : http://soatutorials.blogspot.com
>>>> LinkedIn:http://www.linkedin.com/pub/chanaka-fernando/19/a20/5b0
>>>> Twitter:https://twitter.com/chanakaudaya
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> --
>>> Chanaka Fernando
>>> Senior Technical Lead
>>> WSO2, Inc.; http://wso2.com
>>> lean.enterprise.middleware
>>>
>>> mobile: +94 773337238
>>> Blog : http://soatutorials.blogspot.com
>>> LinkedIn:http://www.linkedin.com/pub/chanaka-fernando/19/a20/5b0
>>> Twitter:https://twitter.com/chanakaudaya
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> Dev@wso2.org
>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>
>>>
>>
>>
>> --
>> Nuwan Dias
>>
>> Technical Lead - WSO2, Inc. http://wso2.com
>> email : nuw...@wso2.com
>> Phone : +94 777 775 729
>>
>
>
>
> --
> --
> Chanaka Fernando
> Senior Technical Lead
> WSO2, Inc.; http://wso2.com
> lean.enterprise.middleware
>
> mobile: +94 773337238
> Blog : http://soatutorials.blogspot.com
> LinkedIn:http://www.linkedin.com/pub/chanaka-fernando/19/a20/5b0
> Twitter:https://twitter.com/chanakaudaya
>
>
>
>
>


-- 
--
Chanaka Fernando
Senior Technical Lead
WSO2, Inc.; http://wso2.com
lean.enterprise.middleware

mobile: +94 773337238
Blog : http://soatutorials.blogspot.com
LinkedIn:http://www.linkedin.com/pub/chanaka-fernando/19/a20/5b0
Twitter:https://twitter.com/chanakaudaya
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to