Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class RangerRoleCache {
private final int waitTimeInSeconds;
private final ReentrantLock lock = new ReentrantLock();

RangerRoleCacheWrapper roleCacheWrapper;
private final RangerRoleCacheWrapper roleCacheWrapper = new RangerRoleCacheWrapper();

private RangerRoleCache() {
RangerAdminConfig config = RangerAdminConfig.getInstance();
Expand All @@ -69,21 +69,45 @@ public static RangerRoleCache getInstance() {
}

public RangerRoles getLatestRangerRoleOrCached(String serviceName, RoleDBStore roleDBStore, Long lastKnownRoleVersion, Long rangerRoleVersionInDB) throws Exception {
final RangerRoles ret;
RangerRoles ret = null;

if (lastKnownRoleVersion == null || !lastKnownRoleVersion.equals(rangerRoleVersionInDB)) {
roleCacheWrapper = new RangerRoleCacheWrapper();
ret = roleCacheWrapper.getLatestRangerRoles(serviceName, roleDBStore, lastKnownRoleVersion, rangerRoleVersionInDB);
} else {
ret = null;
ret = roleCacheWrapper.getRoles();

if (roleCacheWrapper.getRolesVersion() < rangerRoleVersionInDB) {
boolean lockResult = false;

try {
lockResult = lock.tryLock(waitTimeInSeconds, TimeUnit.SECONDS);

if (lockResult) {
if (roleCacheWrapper.getRolesVersion() < rangerRoleVersionInDB) {
ret = roleCacheWrapper.getLatestRangerRoles(serviceName, roleDBStore, lastKnownRoleVersion, rangerRoleVersionInDB);
} else {
ret = roleCacheWrapper.getRoles();
}
} else {
ret = roleCacheWrapper.getRoles();

LOG.error("Could not get lock in [{}] seconds, returning cached RangerRoles and wait Queue Length:[{}], roles version:[{}]", waitTimeInSeconds, lock.getQueueLength(), (ret != null ? ret.getRoleVersion() : -1L));
}
} catch (InterruptedException exception) {
Thread.currentThread().interrupt();
LOG.error("RangerRoleCache.getLatestRangerRoles:lock got interrupted..", exception);
} finally {
if (lockResult) {
lock.unlock();
}
}
}
}

return ret;
}

private class RangerRoleCacheWrapper {
RangerRoles roles;
Long rolesVersion;
volatile RangerRoles roles;
volatile Long rolesVersion;

RangerRoleCacheWrapper() {
this.roles = null;
Expand All @@ -100,45 +124,28 @@ public Long getRolesVersion() {

public RangerRoles getLatestRangerRoles(String serviceName, RoleDBStore roleDBStore, Long lastKnownRoleVersion, Long rolesVersionInDB) throws Exception {
RangerRoles ret = null;
boolean lockResult = false;

LOG.debug("==> RangerRoleCache.getLatestRangerRoles(ServiceName= {} lastKnownRoleVersion= {} rolesVersionInDB= {})", serviceName, lastKnownRoleVersion, rolesVersionInDB);

try {
lockResult = lock.tryLock(waitTimeInSeconds, TimeUnit.SECONDS);
// 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.
final long startTimeMs = System.currentTimeMillis();
SearchFilter searchFilter = null;
final Set<RangerRole> rolesInDB = new HashSet<>(roleDBStore.getRoles(searchFilter));
final long dbLoadTimeMs = System.currentTimeMillis() - startTimeMs;
Date updateTime = new Date();

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.
final long startTimeMs = System.currentTimeMillis();
SearchFilter searchFilter = null;
final Set<RangerRole> rolesInDB = new HashSet<>(roleDBStore.getRoles(searchFilter));
final long dbLoadTimeMs = System.currentTimeMillis() - startTimeMs;
Date updateTime = new Date();

if (LOG.isDebugEnabled()) {
LOG.debug("loading Roles from database and it took:{} seconds", TimeUnit.MILLISECONDS.toSeconds(dbLoadTimeMs));
}

ret = new RangerRoles();
if (LOG.isDebugEnabled()) {
LOG.debug("loading Roles from database and it took:{} seconds", TimeUnit.MILLISECONDS.toSeconds(dbLoadTimeMs));
}

ret.setRangerRoles(rolesInDB);
ret.setRoleUpdateTime(updateTime);
ret.setRoleVersion(rolesVersionInDB);
ret = new RangerRoles();

rolesVersion = rolesVersionInDB;
roles = ret;
} else {
LOG.debug("Could not get lock in [{}] seconds, returning cached RangerRoles", waitTimeInSeconds);
ret.setRangerRoles(rolesInDB);
ret.setRoleUpdateTime(updateTime);
ret.setRoleVersion(rolesVersionInDB);

ret = getRoles();
}
} catch (InterruptedException exception) {
LOG.error("RangerRoleCache.getLatestRangerRoles:lock got interrupted..", exception);
} finally {
if (lockResult) {
lock.unlock();
}
}
roles = ret;
rolesVersion = rolesVersionInDB;

LOG.debug("<== RangerRoleCache.getLatestRangerRoles(ServiceName= {} lastKnownRoleVersion= {} rolesVersionInDB= {} RangerRoles= {})", serviceName, lastKnownRoleVersion, rolesVersionInDB, ret);

Expand Down
Loading