ControlLoopEventManager.unlock only returns the TargetLock if
the PolicyGuard.unlock operation is successful. However, if
the lock has already expired, then PolicyGuard.unlock will return
false, and ControlLoopEventManager.unlock will then return null.
As a result, the rules do not retract the TargetLock. (The rules
do, however, retract any left-over TargetLock objects during the
clean-up phase. Nevertheless, the earlier rules should not have
to depend on the clean-up rules to do that.)
Modified the code to address this issue.
Change-Id: I2e6099a4e3511053d2e6e1373cae4b480798d1b6
Issue-ID: POLICY-872
Signed-off-by: Jim Hahn <jrh3@att.com>
if (this.targetLock == null) {
return null;
}
- if (PolicyGuard.unlockTarget(this.targetLock)) {
- TargetLock returnLock = this.targetLock;
- this.targetLock = null;
- return returnLock;
- }
- return null;
+
+ TargetLock returnLock = this.targetLock;
+ this.targetLock = null;
+
+ PolicyGuard.unlockTarget(returnLock);
+
+ // always return the old target lock so rules can retract it
+ return returnLock;
}
public enum NEW_EVENT_STATUS {
lockLock = manager.lockCurrentOperation();
assertNotNull(lockLock);
PolicyGuard.unlockTarget(lockLock.getB());
- assertNull(manager.unlockCurrentOperation());
+ assertEquals(lockLock.getB(), manager.unlockCurrentOperation());
clom.startOperation(event);