Skip to content

Commit 4534381

Browse files
committed
Allow max MonitoredItems per session to be configured via OpcUaServerConfigLimits
1 parent 7038e89 commit 4534381

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

Diff for: opc-ua-sdk/sdk-server/src/main/java/org/eclipse/milo/opcua/sdk/server/api/config/OpcUaServerConfigLimits.java

+9
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,15 @@ default UInteger getMaxMonitoredItems() {
112112
return uint(Integer.MAX_VALUE);
113113
}
114114

115+
/**
116+
* Get the maximum number of MonitoredItems, per Session, that can be created.
117+
*
118+
* @return the maximum number of MonitoredItems, per Session, that can be created.
119+
*/
120+
default UInteger getMaxMonitoredItemsPerSession() {
121+
return uint(Integer.MAX_VALUE);
122+
}
123+
115124
//region ServerCapabilities
116125

117126
default Double getMinSupportedSampleRate() {

Diff for: opc-ua-sdk/sdk-server/src/main/java/org/eclipse/milo/opcua/sdk/server/subscriptions/SubscriptionManager.java

+19-2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ private static UInteger nextSubscriptionId() {
122122
private final Map<UInteger, Subscription> subscriptions = Maps.newConcurrentMap();
123123
private final List<Subscription> transferred = Lists.newCopyOnWriteArrayList();
124124

125+
private final AtomicLong monitoredItemCount = new AtomicLong(0L);
126+
125127
private final Session session;
126128
private final OpcUaServer server;
127129

@@ -190,6 +192,7 @@ public void createSubscription(ServiceRequest service) {
190192
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
191193
);
192194

195+
monitoredItemCount.getAndUpdate(count -> count - monitoredItems.size());
193196
server.getMonitoredItemCount().getAndUpdate(count -> count - monitoredItems.size());
194197

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

268271
results[i] = StatusCode.GOOD;
269272

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

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

355+
long globalMax = server.getConfig()
356+
.getLimits().getMaxMonitoredItems().longValue();
357+
358+
long sessionMax = server.getConfig()
359+
.getLimits().getMaxMonitoredItemsPerSession().longValue();
360+
351361
for (int i = 0; i < itemsToCreate.size(); i++) {
352362
MonitoredItemCreateRequest createRequest = itemsToCreate.get(i);
353363

354364
try {
355-
long maxMonitoredItems = server.getConfig().getLimits().getMaxMonitoredItems().longValue();
365+
long globalCount = server.getMonitoredItemCount().incrementAndGet();
366+
long sessionCount = monitoredItemCount.incrementAndGet();
356367

357-
if (server.getMonitoredItemCount().incrementAndGet() <= maxMonitoredItems) {
368+
if (globalCount <= globalMax && sessionCount <= sessionMax) {
358369
BaseMonitoredItem<?> monitoredItem = createMonitoredItem(
359370
createRequest,
360371
subscription,
@@ -375,6 +386,7 @@ public void createMonitoredItems(ServiceRequest service) throws UaException {
375386
throw new UaException(StatusCodes.Bad_TooManyMonitoredItems);
376387
}
377388
} catch (UaException e) {
389+
monitoredItemCount.decrementAndGet();
378390
server.getMonitoredItemCount().decrementAndGet();
379391

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

980992
deleteResults[i] = StatusCode.GOOD;
981993

994+
monitoredItemCount.decrementAndGet();
982995
server.getMonitoredItemCount().decrementAndGet();
983996
}
984997
}
@@ -1250,6 +1263,7 @@ public void sessionClosed(boolean deleteSubscriptions) {
12501263
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
12511264
);
12521265

1266+
monitoredItemCount.getAndUpdate(count -> count - deletedItems.size());
12531267
server.getMonitoredItemCount().getAndUpdate(count -> count - deletedItems.size());
12541268
}
12551269

@@ -1293,6 +1307,7 @@ public void addSubscription(Subscription subscription) {
12931307
eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems)
12941308
);
12951309

1310+
monitoredItemCount.getAndUpdate(count -> count - monitoredItems.size());
12961311
server.getMonitoredItemCount().getAndUpdate(count -> count - monitoredItems.size());
12971312

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

13131328
if (subscription != null) {
13141329
subscription.setStateListener(null);
1330+
1331+
monitoredItemCount.getAndUpdate(count -> count - subscription.getMonitoredItems().size());
13151332
}
13161333

13171334
return subscription;

0 commit comments

Comments
 (0)