Skip to content

Commit

Permalink
#3099 Generating event when doPoll takes longer then data source upda…
Browse files Browse the repository at this point in the history
…te time
  • Loading branch information
Patrykb0802 committed Mar 8, 2025
1 parent 2b1e701 commit 807766f
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 10 deletions.
10 changes: 9 additions & 1 deletion src/com/serotonin/mango/rt/dataSource/PollingDataSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.concurrent.atomic.AtomicInteger;

import com.serotonin.mango.util.LoggingUtils;
import com.serotonin.web.i18n.LocalizableMessage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Expand All @@ -49,6 +50,7 @@ abstract public class PollingDataSource extends DataSourceRT implements TimeoutC
private volatile Thread jobThread;
private long jobThreadStartTime;
private static volatile boolean markAsTerminating = false;
public static final int DO_POLL_TIMEOUT_EVENT = 3;

private final AtomicInteger lock = new AtomicInteger(0);

Expand Down Expand Up @@ -96,15 +98,21 @@ public void scheduleTimeout(long fireTime) {
}

if(lock.getAndIncrement() == 0) {
long startTime = System.currentTimeMillis();
try {
jobThreadStartTime = fireTime;
updateChangedPoints();
doPoll(fireTime);
} finally {
long elapsed = System.currentTimeMillis() - startTime;
lock.getAndSet(0);
if (elapsed > pollingPeriodMillis) {
String msg = vo.getName() + ": doPoll execution time (" + elapsed + "ms) exceeded polling period (" + pollingPeriodMillis + "ms)";
LOG.warn(msg);
raiseEvent(DO_POLL_TIMEOUT_EVENT, fireTime, true, new LocalizableMessage("event.doPoll.timeout", vo.getName(), elapsed, pollingPeriodMillis));
}
}
} else {

LOG.warn(vo.getName() + ": poll at " + DateFunctions.getFullSecondTime(fireTime)
+ " aborted because a previous poll started at "
+ DateFunctions.getFullSecondTime(jobThreadStartTime) + " is still running");
Expand Down
20 changes: 20 additions & 0 deletions src/com/serotonin/mango/vo/dataSource/DataSourceVO.java
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,8 @@ public static List<String> getTypeList() {

public static final String XID_PREFIX = "DS_";

public static final int TIMEOUT_EVENT_ID = 3;

public static DataSourceVO<?> createDataSourceVO(int typeId) {
return Type.valueOf(typeId).createDataSourceVO();
}
Expand All @@ -399,6 +401,24 @@ public static String generateXid() {
final public List<EventTypeVO> getEventTypes() {
List<EventTypeVO> eventTypes = new ArrayList<EventTypeVO>();
addEventTypes(eventTypes);

boolean timeoutDefined = false;
for (EventTypeVO et : eventTypes) {
if (et.getTypeRef2() == TIMEOUT_EVENT_ID) {
timeoutDefined = true;
break;
}
}

if (!timeoutDefined) {
eventTypes.add(createEventType(
TIMEOUT_EVENT_ID,
new LocalizableMessage("event.ds.timeout", getName()),
EventType.DuplicateHandling.IGNORE_SAME_MESSAGE,
AlarmLevels.URGENT
));
}

return eventTypes;
}

Expand Down
2 changes: 2 additions & 0 deletions webapp-resources/messages_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3442,3 +3442,5 @@ event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
2 changes: 2 additions & 0 deletions webapp-resources/messages_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3445,3 +3445,5 @@ event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3484,4 +3484,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_fi.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3569,4 +3569,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3438,4 +3438,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_lu.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3457,4 +3457,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_nl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3559,4 +3559,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_pl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3581,4 +3581,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_pt.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3596,4 +3596,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_ru.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3592,4 +3592,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.
4 changes: 3 additions & 1 deletion webapp-resources/messages_zh.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3544,4 +3544,6 @@ event.setPoint.inactivePointMissingX=inactive source point is missing or disable
event.setPoint.inactivePointValueX=inactive source point has no value: {0}
event.setPoint.recursionFailureX=The set point was not performed due to a recursion overflow. There may be an infinite recursion loop in your configuration: {0}
event.setPoint.targetNotSettableX=target point is not settable: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.setPoint.targetPointMissingX=target point is missing or disabled: {0}
event.doPoll.timeout=Data source {0}: doPoll execution took {1} ms, exceeding the update interval of {2} ms.
event.ds.timeout=Data source {0} has exceeded its timeout limit.

0 comments on commit 807766f

Please sign in to comment.