Skip to content
Permalink
Browse files Browse the repository at this point in the history
Allow max MonitoredItems per session to be configured via OpcUaServer…
…ConfigLimits
  • Loading branch information
kevinherron committed Aug 24, 2022
1 parent 7038e89 commit 4534381
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
Expand Up @@ -112,6 +112,15 @@ default UInteger getMaxMonitoredItems() {
return uint(Integer.MAX_VALUE);
}

/**
* Get the maximum number of MonitoredItems, per Session, that can be created.
*
* @return the maximum number of MonitoredItems, per Session, that can be created.
*/
default UInteger getMaxMonitoredItemsPerSession() {
return uint(Integer.MAX_VALUE);
}

//region ServerCapabilities

default Double getMinSupportedSampleRate() {
Expand Down
Expand Up @@ -122,6 +122,8 @@ private static UInteger nextSubscriptionId() {
private final Map<UInteger, Subscription> subscriptions = Maps.newConcurrentMap();
private final List<Subscription> transferred = Lists.newCopyOnWriteArrayList();

private final AtomicLong monitoredItemCount = new AtomicLong(0L);

private final Session session;
private final OpcUaServer server;

Expand Down Expand Up @@ -190,6 +192,7 @@ public void createSubscription(ServiceRequest service) {
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
);

monitoredItemCount.getAndUpdate(count -> count - monitoredItems.size());
server.getMonitoredItemCount().getAndUpdate(count -> count - monitoredItems.size());

monitoredItems.clear();
Expand Down Expand Up @@ -267,6 +270,7 @@ public void deleteSubscription(ServiceRequest service) throws UaException {

results[i] = StatusCode.GOOD;

monitoredItemCount.getAndUpdate(count -> count - deletedItems.size());
server.getMonitoredItemCount().getAndUpdate(count -> count - deletedItems.size());
} else {
results[i] = new StatusCode(StatusCodes.Bad_SubscriptionIdInvalid);
Expand Down Expand Up @@ -348,13 +352,20 @@ public void createMonitoredItems(ServiceRequest service) throws UaException {

List<BaseMonitoredItem<?>> monitoredItems = new ArrayList<>();

long globalMax = server.getConfig()
.getLimits().getMaxMonitoredItems().longValue();

long sessionMax = server.getConfig()
.getLimits().getMaxMonitoredItemsPerSession().longValue();

for (int i = 0; i < itemsToCreate.size(); i++) {
MonitoredItemCreateRequest createRequest = itemsToCreate.get(i);

try {
long maxMonitoredItems = server.getConfig().getLimits().getMaxMonitoredItems().longValue();
long globalCount = server.getMonitoredItemCount().incrementAndGet();
long sessionCount = monitoredItemCount.incrementAndGet();

if (server.getMonitoredItemCount().incrementAndGet() <= maxMonitoredItems) {
if (globalCount <= globalMax && sessionCount <= sessionMax) {
BaseMonitoredItem<?> monitoredItem = createMonitoredItem(
createRequest,
subscription,
Expand All @@ -375,6 +386,7 @@ public void createMonitoredItems(ServiceRequest service) throws UaException {
throw new UaException(StatusCodes.Bad_TooManyMonitoredItems);
}
} catch (UaException e) {
monitoredItemCount.decrementAndGet();
server.getMonitoredItemCount().decrementAndGet();

createResults[i] = new MonitoredItemCreateResult(
Expand Down Expand Up @@ -979,6 +991,7 @@ public void deleteMonitoredItems(ServiceRequest service) throws UaException {

deleteResults[i] = StatusCode.GOOD;

monitoredItemCount.decrementAndGet();
server.getMonitoredItemCount().decrementAndGet();
}
}
Expand Down Expand Up @@ -1250,6 +1263,7 @@ public void sessionClosed(boolean deleteSubscriptions) {
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
);

monitoredItemCount.getAndUpdate(count -> count - deletedItems.size());
server.getMonitoredItemCount().getAndUpdate(count -> count - deletedItems.size());
}

Expand Down Expand Up @@ -1293,6 +1307,7 @@ public void addSubscription(Subscription subscription) {
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
);

monitoredItemCount.getAndUpdate(count -> count - monitoredItems.size());
server.getMonitoredItemCount().getAndUpdate(count -> count - monitoredItems.size());

monitoredItems.clear();
Expand All @@ -1312,6 +1327,8 @@ public Subscription removeSubscription(UInteger subscriptionId) {

if (subscription != null) {
subscription.setStateListener(null);

monitoredItemCount.getAndUpdate(count -> count - subscription.getMonitoredItems().size());
}

return subscription;
Expand Down

0 comments on commit 4534381

Please sign in to comment.