Hi Kernal Team,

In RegistryCleanUpTask we need to load all the tenant's registry and delete
some expired registry resources.

I think it may lead to OOM issue if we load all the tenants in a loop since
it takes 30 minutes (default) to unload a tenant.

Can we forcefully unload tenants once the deletion is done in the loop
using  PrivilegedCarbonContext.unloadTenant() method?

Is there a way to check whether a tenant is not utilized at a given time?



Following is the sample code of RegistryCleanUpTask.

Registry registry;
Collection identityDataResource;
try {
    Tenant[] tenants =
IdentityMgtServiceComponent.getRealmService().getTenantManager().getAllTenants();
    for (int i = 0; i < tenants.length + 1; i++) {
        Tenant tenant;
        if ( i == tenants.length) {
            tenant = new Tenant();
            tenant.setDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
            tenant.setId(MultitenantConstants.SUPER_TENANT_ID);
        } else {
            tenant = tenants[i];
        }
        PrivilegedCarbonContext.startTenantFlow();
        
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenant.getDomain());
        
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenant.getId());
        try {
            registry = IdentityMgtServiceComponent.getRegistryService().

getConfigSystemRegistry(PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId());
            identityDataResource = (Collection)
registry.get(CONFIRMATION_REGISTRY_RESOURCE_PATH);
            String[] identityResourcesPaths =
identityDataResource.getChildren();
            for (int j = 0; j < identityResourcesPaths.length; j++) {
                try {
                    Resource currentResource =
registry.get(identityResourcesPaths[j]);
                    if (currentResource instanceof Collection) {
                        Collection secondaryStoreCollection =
(Collection) currentResource;
                        String[] secondaryStoreResourcePaths =
secondaryStoreCollection.getChildren();
                        for (int k = 0; k <
secondaryStoreResourcePaths.length; k++) {
                            checkAndDeleteRegistryResource(registry,
secondaryStoreResourcePaths[k]);
                        }
                    } else {
                        checkAndDeleteRegistryResource(registry,
identityResourcesPaths[j]);
                    }
                } catch (RegistryException e) {
                    log.error("Error while retrieving resource at " +
identityResourcesPaths[j], e);
                }
            }
        } catch (ResourceNotFoundException e) {
            if(log.isDebugEnabled()){
                log.debug("No resource found for tenant " +
tenant.getDomain(), e);
            }
        } catch (RegistryException e) {
            if(log.isDebugEnabled()){
                log.debug("Error while deleting the expired
confirmation code.", e);
            }
        } finally {
            PrivilegedCarbonContext.endTenantFlow();
        }
    }
} catch (UserStoreException e) {
    if(log.isDebugEnabled()){
        log.debug("Error while getting the tenant manager.", e);
    }
}



Thanks

Isura.




-- 

*Isura Dilhara Karunaratne*
Senior Software Engineer | WSO2
Email: is...@wso2.com
Mob : +94 772 254 810
Blog : http://isurad.blogspot.com/
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to