From: <tk...@hy...> - 2007-08-13 21:44:22
|
Author: tkeeney Date: 2007-08-13 14:44:08 -0700 (Mon, 13 Aug 2007) New Revision: 5558 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=5558 Modified: trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier.java trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier_test.java trunk/src/org/hyperic/hq/escalation/server/session/EscalationManagerEJBImpl.java trunk/src/org/hyperic/hq/escalation/server/session/EscalationRuntime.java trunk/src/org/hyperic/hq/escalation/server/session/PerformsEscalations.java Log: [HQ-784] Fixed up escalation scheduling to allow the possibility of unscheduling escalations for an EscalatingEntityIdentifier when it has no currently scheduled escalations. When executing an escalation state, fixed up check to see if the escalating entity has already been deleted. Modified: trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier.java =================================================================== --- trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier.java 2007-08-13 21:42:10 UTC (rev 5557) +++ trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier.java 2007-08-13 21:44:08 UTC (rev 5558) @@ -81,6 +81,13 @@ return _alertType; } + public String toString() { + return this.getClass().getName()+ + " Alert Type: desc="+getAlertType().getDescription()+ + ", code="+getAlertType().getCode()+ + "; Escalating Entity: id="+getId(); + } + public boolean equals(Object obj) { if (obj == this) { return true; Modified: trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier_test.java =================================================================== --- trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier_test.java 2007-08-13 21:42:10 UTC (rev 5557) +++ trunk/src/org/hyperic/hq/escalation/server/session/EscalatingEntityIdentifier_test.java 2007-08-13 21:44:08 UTC (rev 5558) @@ -149,6 +149,10 @@ public String getName() { return null; } + + public boolean isDeleted() { + return false; + } } Modified: trunk/src/org/hyperic/hq/escalation/server/session/EscalationManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/escalation/server/session/EscalationManagerEJBImpl.java 2007-08-13 21:42:10 UTC (rev 5557) +++ trunk/src/org/hyperic/hq/escalation/server/session/EscalationManagerEJBImpl.java 2007-08-13 21:44:08 UTC (rev 5558) @@ -330,7 +330,7 @@ // does not exist. EscalationState s = _stateDAO.get(stateId); - if (hasEscalationStateOrEscalatingEntityBeenRemoved(s)) { + if (hasEscalationStateOrEscalatingEntityBeenDeleted(s)) { // just to be safe endEscalation(s); return; @@ -387,18 +387,23 @@ /** * Check if the escalation state or its associated escalating entity - * has been removed. This may be a rare occurrence that would only surface - * because of subtle timing holes between the scheduling and escalation state - * deletion algorithms. + * has been deleted. * * @param s The escalation state. * @return <code>true</code> if the escalation state or escalating entity - * has been removed. + * has been deleted. */ - private boolean hasEscalationStateOrEscalatingEntityBeenRemoved(EscalationState s) { - return s == null || - s.getAlertType().findDefinition( - new Integer(s.getAlertDefinitionId())) == null; + private boolean hasEscalationStateOrEscalatingEntityBeenDeleted(EscalationState s) { + if (s == null) { + return true; + } + + PerformsEscalations def = s.getAlertType().findDefinition( + new Integer(s.getAlertDefinitionId())); + + // galert defs may be deleted from the DB when the group is deleted, + // so we may get a null value. + return def == null || def.isDeleted(); } /** Modified: trunk/src/org/hyperic/hq/escalation/server/session/EscalationRuntime.java =================================================================== --- trunk/src/org/hyperic/hq/escalation/server/session/EscalationRuntime.java 2007-08-13 21:42:10 UTC (rev 5557) +++ trunk/src/org/hyperic/hq/escalation/server/session/EscalationRuntime.java 2007-08-13 21:44:08 UTC (rev 5558) @@ -189,7 +189,7 @@ try { _log.debug("Transaction committed: success=" + success); if (success) { - unscheduledAllEscalations_((EscalatingEntityIdentifier[]) + unscheduleAllEscalations_((EscalatingEntityIdentifier[]) _escalationsToUnschedule.toArray( new EscalatingEntityIdentifier[ _escalationsToUnschedule.size()])); @@ -215,13 +215,10 @@ for (int i = 0; i < escalatingEntities.length; i++) { Integer stateId = (Integer)_esclEntityIdsToStateIds.get( escalatingEntities[i]); - + // stateId may be null if an escalation has not been scheduled + // for this escalating entity. if (stateId != null) { stateIds.add(stateId); - } else { - // state Id should never be null, but if it is and assertions - // are disabled, just move on - assert false : "stateId should not be null"; } } @@ -238,7 +235,7 @@ } } - private void unscheduledAllEscalations_(EscalatingEntityIdentifier[] esclEntityIds) { + private void unscheduleAllEscalations_(EscalatingEntityIdentifier[] esclEntityIds) { synchronized (_stateIdsToTasks) { for (int i = 0; i < esclEntityIds.length; i++) { Integer stateId = @@ -249,15 +246,17 @@ } private void doUnscheduleEscalation_(Integer stateId) { - Object task = _stateIdsToTasks.remove(stateId); - - if (task != null) { - ClockDaemon.cancel(task); - _log.debug("Canceled state[" + stateId + "]"); - } else { - _log.debug("Canceling state[" + stateId + "] but was " + - "not found"); - } + if (stateId != null) { + Object task = _stateIdsToTasks.remove(stateId); + + if (task != null) { + ClockDaemon.cancel(task); + _log.debug("Canceled state[" + stateId + "]"); + } else { + _log.debug("Canceling state[" + stateId + "] but was " + + "not found"); + } + } } /** @@ -287,6 +286,11 @@ private void scheduleEscalation_(EscalationState state, long schedTime) { Integer stateId = state.getId(); + if (stateId == null) { + throw new IllegalStateException("Cannot schedule a " + + "transient escalation state (stateId=null)."); + } + synchronized (_stateIdsToTasks) { Object task = _stateIdsToTasks.get(stateId); @@ -295,7 +299,7 @@ ClockDaemon.cancel(task); _log.debug("Rescheduling state[" + stateId + "]"); } else { - _log.debug("Scheduleing state[" + stateId + "]"); + _log.debug("Scheduling state[" + stateId + "]"); } task = _schedule.executeAt(new Date(schedTime), Modified: trunk/src/org/hyperic/hq/escalation/server/session/PerformsEscalations.java =================================================================== --- trunk/src/org/hyperic/hq/escalation/server/session/PerformsEscalations.java 2007-08-13 21:42:10 UTC (rev 5557) +++ trunk/src/org/hyperic/hq/escalation/server/session/PerformsEscalations.java 2007-08-13 21:44:08 UTC (rev 5558) @@ -34,6 +34,7 @@ public interface PerformsEscalations { Integer getId(); String getName(); + boolean isDeleted(); EscalationAlertType getAlertType(); Escalation getEscalation(); AlertDefinitionInterface getDefinitionInfo(); |