From 6ac642e301c274b9c3c8968af0d38ee186219f6a Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 25 Jun 2026 12:50:04 +0100 Subject: [PATCH] Remove closeLock from ConcurrentWebSocketSessionDecorator#checkSessionLimits Closes gh-36909 --- .../ConcurrentWebSocketSessionDecorator.java | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/handler/ConcurrentWebSocketSessionDecorator.java b/spring-websocket/src/main/java/org/springframework/web/socket/handler/ConcurrentWebSocketSessionDecorator.java index 042f3e6c045..c6b989434bd 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/handler/ConcurrentWebSocketSessionDecorator.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/handler/ConcurrentWebSocketSessionDecorator.java @@ -208,42 +208,37 @@ public class ConcurrentWebSocketSessionDecorator extends WebSocketSessionDecorat } private void checkSessionLimits() { - if (!shouldNotSend() && this.closeLock.tryLock()) { - try { - if (getTimeSinceSendStarted() > getSendTimeLimit()) { - String format = "Send time %d (ms) for session '%s' exceeded the allowed limit %d"; - String reason = String.format(format, getTimeSinceSendStarted(), getId(), getSendTimeLimit()); - limitExceeded(reason); - } - else if (getBufferSize() > getBufferSizeLimit()) { - switch (this.overflowStrategy) { - case TERMINATE -> { - String format = "Buffer size %d bytes for session '%s' exceeds the allowed limit %d"; - String reason = String.format(format, getBufferSize(), getId(), getBufferSizeLimit()); - limitExceeded(reason); - } - case DROP -> { - int i = 0; - while (getBufferSize() > getBufferSizeLimit()) { - WebSocketMessage message = this.buffer.poll(); - if (message == null) { - break; - } - this.bufferSize.addAndGet(-message.getPayloadLength()); - i++; - } - if (logger.isDebugEnabled()) { - logger.debug("Dropped " + i + " messages, buffer size: " + getBufferSize()); - } - } - default -> - // Should never happen.. - throw new IllegalStateException("Unexpected OverflowStrategy: " + this.overflowStrategy); - } - } + if (!shouldNotSend()) { + if (getTimeSinceSendStarted() > getSendTimeLimit()) { + String format = "Send time %d (ms) for session '%s' exceeded the allowed limit %d"; + String reason = String.format(format, getTimeSinceSendStarted(), getId(), getSendTimeLimit()); + limitExceeded(reason); } - finally { - this.closeLock.unlock(); + else if (getBufferSize() > getBufferSizeLimit()) { + switch (this.overflowStrategy) { + case TERMINATE -> { + String format = "Buffer size %d bytes for session '%s' exceeds the allowed limit %d"; + String reason = String.format(format, getBufferSize(), getId(), getBufferSizeLimit()); + limitExceeded(reason); + } + case DROP -> { + int i = 0; + while (getBufferSize() > getBufferSizeLimit()) { + WebSocketMessage message = this.buffer.poll(); + if (message == null) { + break; + } + this.bufferSize.addAndGet(-message.getPayloadLength()); + i++; + } + if (logger.isDebugEnabled()) { + logger.debug("Dropped " + i + " messages, buffer size: " + getBufferSize()); + } + } + default -> + // Should never happen.. + throw new IllegalStateException("Unexpected OverflowStrategy: " + this.overflowStrategy); + } } } }