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

Ramachandran updated RANGER-3898:
---------------------------------
    Summary:  Ranger Roles cache Improvement  (was: Bug in Ranger Roles 
Improvement)

>  Ranger Roles cache Improvement
> -------------------------------
>
>                 Key: RANGER-3898
>                 URL: https://issues.apache.org/jira/browse/RANGER-3898
>             Project: Ranger
>          Issue Type: Bug
>          Components: Ranger
>    Affects Versions: 3.0.0
>            Reporter: Ramachandran
>            Assignee: Ramachandran
>            Priority: Major
>         Attachments: 0001-RANGER-3898-Bug-in-Ranger-Roles-Cache.patch
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> It seems Apache Ranger open source contains a bug where else block in the 
> below code will not be called at all 
> In the below code else block is a dead code
>  
> {code:java}
> public RangerRoles getLatestRangerRoleOrCached(String serviceName, 
> RoleDBStore roleDBStore, Long lastKnownRoleVersion, Long 
> rangerRoleVersionInDB) throws Exception {
>    final RangerRoles ret;
>    if (lastKnownRoleVersion == null || 
> !lastKnownRoleVersion.equals(rangerRoleVersionInDB)) {
>       roleCacheWrapper = new RangerRoleCacheWrapper();
>       ret              = roleCacheWrapper.getLatestRangerRoles(serviceName, 
> roleDBStore, lastKnownRoleVersion, rangerRoleVersionInDB);
>    } else if (lastKnownRoleVersion.equals(rangerRoleVersionInDB)) {
>       ret = null;
>    } else {
>       ret = roleCacheWrapper.getRoles();
>    }
>    return ret;
> }{code}
> The below behaviour also broken  
> when multiple threads are trying to access and one or more threads got 
> timeout while acquiring the lock,it will fetch the roles from cache but ,we 
> are not setting the roles in cache anywhere in our code 
>  
> {code}
> public RangerRoles getLatestRangerRoles(String serviceName, RoleDBStore 
> roleDBStore, Long lastKnownRoleVersion, Long rolesVersionInDB) throws 
> Exception {
>    RangerRoles ret           = null;
>    boolean     lockResult = false;
>    if (LOG.isDebugEnabled()) {
>       LOG.debug("==> RangerRoleCache.getLatestRangerRoles(ServiceName= " + 
> serviceName + " lastKnownRoleVersion= " + lastKnownRoleVersion + " 
> rolesVersionInDB= " + rolesVersionInDB + ")");
>    }
>    try {
>       lockResult = lock.tryLock(waitTimeInSeconds, TimeUnit.SECONDS);
>       if (lockResult) {
>          // We are getting all the Roles to be downloaded for now. Should do 
> downloades for each service based on what roles are there in the policies.
>          SearchFilter          searchFilter = null;
>          final Set<RangerRole> rolesInDB    = new 
> HashSet<>(roleDBStore.getRoles(searchFilter));
>          Date updateTime = new Date();
>          if (rolesInDB != null) {
>             ret = new RangerRoles();
>             ret.setRangerRoles(rolesInDB);
>             ret.setRoleUpdateTime(updateTime);
>             ret.setRoleVersion(rolesVersionInDB);
>             rolesVersion = rolesVersionInDB;
>          } else {
>             LOG.error("Could not get Ranger Roles from database ...");
>          }
>       } else {
>          if (LOG.isDebugEnabled()) {
>             LOG.debug("Could not get lock in [" + waitTimeInSeconds + "] 
> seconds, returning cached RangerRoles");
>          }
>          ret = getRoles();
>       }
>    } catch (InterruptedException exception) {
>       LOG.error("RangerRoleCache.getLatestRangerRoles:lock got 
> interrupted..", exception);
>    } finally {
>       if (lockResult) {
>          lock.unlock();
>       }
>    }
>    if (LOG.isDebugEnabled()) {
>       LOG.debug("<== RangerRoleCache.getLatestRangerRoles(ServiceName= " + 
> serviceName + " lastKnownRoleVersion= " + lastKnownRoleVersion + " 
> rolesVersionInDB= " + rolesVersionInDB + " RangerRoles= " + ret + ")");
>    }
>    return ret;
> }{code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to