From 82421c232458dcaa17c67fd15a357220dda6d1f2 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 6 Mar 2017 14:36:48 +0100 Subject: [PATCH] Fixed double removal of already executed triggers. --- .../impl/trigger/TriggerScannerTaskHandler.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java index b6ec56052af..100c4ecf711 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java @@ -188,8 +188,7 @@ private void fireTriggers(AbstractScannerResultHandler handler, Pris LOGGER.warn("Trigger without a timestamp in {}", object); } else { if (isHot(handler, timestamp)) { - fireTrigger(trigger, object, workerTask, coordinatorTask, result); - removeTrigger(object, trigger.asPrismContainerValue(), workerTask, triggerContainer.getDefinition()); + fireTrigger(trigger, object, triggerContainer.getDefinition(), workerTask, coordinatorTask, result); } else { LOGGER.trace("Trigger {} is not hot (timestamp={}, thisScanTimestamp={}, lastScanTimestamp={})", trigger, timestamp, handler.getThisScanTimestamp(), handler.getLastScanTimestamp()); @@ -217,18 +216,22 @@ private boolean isHot(AbstractScannerResultHandler handler, XMLGrego return handler.getLastScanTimestamp() == null || handler.getLastScanTimestamp().compare(timestamp) == DatatypeConstants.LESSER; } - private void fireTrigger(TriggerType trigger, PrismObject object, Task workerTask, Task coordinatorTask, OperationResult result) { + private void fireTrigger(TriggerType trigger, PrismObject object, + PrismContainerDefinition triggerContainerDefinition, + Task workerTask, Task coordinatorTask, OperationResult result) { String handlerUri = trigger.getHandlerUri(); if (handlerUri == null) { LOGGER.warn("Trigger without handler URI in {}", object); return; } LOGGER.debug("Firing trigger {} in {}: id={}", handlerUri, object, trigger.getId()); + if (triggerAlreadySeen(coordinatorTask, handlerUri, object.getOid()+":"+trigger.getId())) { + LOGGER.debug("Handler {} already executed for {}:{}", handlerUri, ObjectTypeUtil.toShortString(object), trigger.getId()); + return; + } TriggerHandler handler = triggerHandlerRegistry.getHandler(handlerUri); if (handler == null) { LOGGER.warn("No registered trigger handler for URI {} in {}", handlerUri, trigger); - } else if (triggerAlreadySeen(coordinatorTask, handlerUri, object.getOid()+":"+trigger.getId())) { - LOGGER.trace("Handler {} already executed for {}:{}", handlerUri, ObjectTypeUtil.toShortString(object), trigger.getId()); } else { try { handler.handle(object, trigger, workerTask, result); @@ -239,6 +242,7 @@ private void fireTrigger(TriggerType trigger, PrismObject object, Ta result.recordPartialError(e); } } + removeTrigger(object, trigger.asPrismContainerValue(), workerTask, triggerContainerDefinition); } private void removeTrigger(PrismObject object, PrismContainerValue triggerCVal, Task task,