diff options
author | Jorge Hernandez <jh1730@att.com> | 2018-07-17 14:04:29 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2018-07-17 14:04:29 +0000 |
commit | 16793df58db6620a59e89bd95f9b06d621300f6a (patch) | |
tree | 8471043d55bdea3c375509723cdfdccb354ae71e /policy-core/src/main | |
parent | f3c23f41a7ed7b85459c5688e5a1f3c177a1031a (diff) | |
parent | 1480379b0e9907c0d41e8a782468c30f0ee83196 (diff) |
Merge "Distinguish lock from refresh"
Diffstat (limited to 'policy-core/src/main')
3 files changed, 93 insertions, 0 deletions
diff --git a/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockFeatureAPI.java b/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockFeatureAPI.java index 683dd83d..ba6fe856 100644 --- a/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockFeatureAPI.java +++ b/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockFeatureAPI.java @@ -98,6 +98,34 @@ public interface PolicyResourceLockFeatureAPI extends OrderedService { } /** + * This method is called before a lock is refreshed on a resource. It may be invoked + * repeatedly to extend the time that a lock is held. + * + * @param resourceId + * @param owner + * @param holdSec the amount of time, in seconds, that the lock should be held + * @return the result, where <b>OPER_DENIED</b> indicates that the resource is not + * currently locked by the given owner + */ + public default OperResult beforeRefresh(String resourceId, String owner, int holdSec) { + return OperResult.OPER_UNHANDLED; + } + + /** + * This method is called after a lock for a resource has been refreshed (or after the + * refresh has been denied). + * + * @param resourceId + * @param owner + * @param locked {@code true} if the lock was acquired, {@code false} if it was denied + * @return {@code true} if the implementer handled the request, {@code false} + * otherwise + */ + public default boolean afterRefresh(String resourceId, String owner, boolean locked) { + return false; + } + + /** * This method is called before a lock on a resource is released. * * @param resourceId diff --git a/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockManager.java b/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockManager.java index 1a94a531..8e13ced4 100644 --- a/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockManager.java +++ b/policy-core/src/main/java/org/onap/policy/drools/core/lock/PolicyResourceLockManager.java @@ -90,6 +90,28 @@ public class PolicyResourceLockManager extends SimpleLockManager { } @Override + public boolean refresh(String resourceId, String owner, int holdSec) { + if (resourceId == null) { + throw makeNullArgException(MSG_NULL_RESOURCE_ID); + } + + if (owner == null) { + throw makeNullArgException(MSG_NULL_OWNER); + } + + + return doBoolIntercept(impl -> impl.beforeRefresh(resourceId, owner, holdSec), () -> { + + // implementer didn't do the work - defer to the superclass + boolean refreshed = super.refresh(resourceId, owner, holdSec); + + doIntercept(false, impl -> impl.afterRefresh(resourceId, owner, refreshed)); + + return refreshed; + }); + } + + @Override public boolean unlock(String resourceId, String owner) { if (resourceId == null) { throw makeNullArgException(MSG_NULL_RESOURCE_ID); diff --git a/policy-core/src/main/java/org/onap/policy/drools/core/lock/SimpleLockManager.java b/policy-core/src/main/java/org/onap/policy/drools/core/lock/SimpleLockManager.java index 2a44ddcd..081ad4c1 100644 --- a/policy-core/src/main/java/org/onap/policy/drools/core/lock/SimpleLockManager.java +++ b/policy-core/src/main/java/org/onap/policy/drools/core/lock/SimpleLockManager.java @@ -118,6 +118,49 @@ public class SimpleLockManager { } /** + * Attempts to refresh a lock on a resource. + * + * @param resourceId + * @param owner + * @param holdSec the amount of time, in seconds, that the lock should be held + * @return {@code true} if locked, {@code false} if the resource is not currently + * locked by the given owner + * @throws IllegalArgumentException if the resourceId or owner is {@code null} + */ + public boolean refresh(String resourceId, String owner, int holdSec) { + + if (resourceId == null) { + throw makeNullArgException(MSG_NULL_RESOURCE_ID); + } + + if (owner == null) { + throw makeNullArgException(MSG_NULL_OWNER); + } + + boolean refreshed = false; + + synchronized(locker) { + cleanUpLocks(); + + Data existingLock = resource2data.get(resourceId); + if (existingLock != null && existingLock.getOwner().equals(owner)) { + // MUST remove the existing lock from the set + locks.remove(existingLock); + + refreshed = true; + + Data data = new Data(owner, resourceId, currentTime.getMillis() + TimeUnit.SECONDS.toMillis(holdSec)); + resource2data.put(resourceId, data); + locks.add(data); + } + } + + logger.info("refresh lock {} for resource {} owner {}", refreshed, resourceId, owner); + + return refreshed; + } + + /** * Unlocks a resource. * * @param resourceId |