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
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to