Hi Chalitha,

Thanks for checking up on this. It's great if you can send a PR for
carbon-kernel 4.4.x branch on this.

Thanks!

*Jayanga Kaushalya*
Software Engineer
Mobile: +94777860160
WSO2 Inc. | http://wso2.com
lean.enterprise.middleware

On Fri, Jun 24, 2016 at 2:00 PM, Chalitha Kulathunga <chalit...@wso2.com>
wrote:

> + IS team members
>
> On Fri, Jun 24, 2016 at 1:37 PM, Chalitha Kulathunga <chalit...@wso2.com>
> wrote:
>
>> Hi kernal team,
>>
>> When multiple threads access updatePermissionTree() method for the first
>> time, they all will end up in the else block. Those threads will call the
>> updatePermissionTreeFromDB() method one by one. Seems like this is creating
>> a bottleneck in the execution flow.
>>
>> void updatePermissionTree() throws UserStoreException {
>>     PermissionTreeCacheKey cacheKey = new 
>> PermissionTreeCacheKey(cacheIdentifier, tenantId);
>>     GhostResource<TreeNode> cacheEntry = (GhostResource<TreeNode>) 
>> permissionCache.get(cacheKey);
>>     if (permissionCache.containsKey(cacheKey)) {
>>         if (cacheEntry.getResource() == null) {
>>             synchronized (this) {
>>                 cacheEntry = (GhostResource<TreeNode>) 
>> permissionCache.get(cacheKey);
>>                 if (cacheEntry.getResource() == null) {
>>                     updatePermissionTreeFromDB();
>>                     cacheEntry.setResource(root);
>>                     if (log.isDebugEnabled()) {
>>                         log.debug("Set resource to true");
>>                     }
>>                 }
>>             }
>>         }
>>     } else {
>>         synchronized (this) {
>>             updatePermissionTreeFromDB();
>>             cacheKey = new PermissionTreeCacheKey(cacheIdentifier, tenantId);
>>             cacheEntry = new GhostResource<TreeNode>(root);
>>             permissionCache.put(cacheKey, cacheEntry);
>>             if (log.isDebugEnabled()) {
>>                 log.debug("Loaded from database");
>>             }
>>         }
>>     }
>> }
>>
>>
>> Can this be modified as follows to avoid the above mentioned issue?
>>
>> void updatePermissionTree() throws UserStoreException {
>>     PermissionTreeCacheKey cacheKey = new 
>> PermissionTreeCacheKey(cacheIdentifier, tenantId);
>>     GhostResource<TreeNode> cacheEntry = (GhostResource<TreeNode>) 
>> permissionCache.get(cacheKey);
>>     if (cacheEntry != null && cacheEntry.getResource() != null) {
>>         return;
>>     }
>>     synchronized (this) {
>>         if (cacheEntry != null && cacheEntry.getResource() != null) {
>>             return;
>>         }
>>         if (cacheEntry == null) {
>>             cacheEntry = new GhostResource<TreeNode>(null);
>>             permissionCache.put(cacheKey, cacheEntry);
>>         }
>>         if (cacheEntry.getResource() == null) {
>>             updatePermissionTreeFromDB();
>>             cacheEntry.setResource(root);
>>             if (log.isDebugEnabled()) {
>>                 log.debug("Resource Loaded from database for cachekey: " + 
>> cacheEntry);
>>             }
>>         }
>>     }
>> }
>>
>>
>> Thanks,
>> Chalitha
>>
>>
>> --
>> *Chalitha Sanyuja Kulathunga*
>> *Software Engineer*
>> WSO2 Inc.; http://wso2.com
>> email: chalit...@wso2.com cell: +94 77 5927581 <%2B94%2077%207779495>
>>
>
>
>
> --
> *Chalitha Sanyuja Kulathunga*
> *Software Engineer*
> WSO2 Inc.; http://wso2.com
> email: chalit...@wso2.com cell: +94 77 5927581 <%2B94%2077%207779495>
>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to