You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2025/06/26 09:06:05 UTC
(tomcat) branch 9.0.x updated: Improve stability of APR/native connector.
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push:
new 8a83c3c42d Improve stability of APR/native connector.
8a83c3c42d is described below
commit 8a83c3c42d20762782678932c14005cd3397a018
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Jun 26 10:05:59 2025 +0100
Improve stability of APR/native connector.
This addresses at least some of the intermittent issues observed with
the APR unit tests.
---
java/org/apache/tomcat/util/net/AprEndpoint.java | 82 ++++++++++++++++--------
webapps/docs/changelog.xml | 3 +
2 files changed, 57 insertions(+), 28 deletions(-)
diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java b/java/org/apache/tomcat/util/net/AprEndpoint.java
index 83217cd31b..cc8b5d1c8c 100644
--- a/java/org/apache/tomcat/util/net/AprEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AprEndpoint.java
@@ -651,17 +651,8 @@ public class AprEndpoint extends AbstractEndpoint<Long,Long> implements SNICallB
// Close the SocketWrapper for each open connection - this should
// trigger a IOException when the app (or container) tries to write.
- // Use the blocking status write lock as a proxy for a lock on
- // writing to the socket. Don't want to close it while another
- // thread is writing as that could trigger a JVM crash.
for (SocketWrapperBase<Long> socketWrapper : connections.values()) {
- WriteLock wl = ((AprSocketWrapper) socketWrapper).getBlockingStatusWriteLock();
- wl.lock();
- try {
- socketWrapper.close();
- } finally {
- wl.unlock();
- }
+ socketWrapper.close();
}
for (Long socket : connections.keySet()) {
@@ -2382,6 +2373,17 @@ public class AprEndpoint extends AbstractEndpoint<Long,Long> implements SNICallB
}
+ @Override
+ public void close() {
+ Lock lock = getLock();
+ lock.lock();
+ try {
+ super.close();
+ } finally {
+ lock.unlock();
+ }
+ }
+
@Override
protected void doClose() {
if (log.isDebugEnabled()) {
@@ -2585,25 +2587,31 @@ public class AprEndpoint extends AbstractEndpoint<Long,Long> implements SNICallB
@Override
protected void populateRemoteAddr() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_REMOTE, socket);
remoteAddr = Address.getip(sa);
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noRemoteAddr", getSocket()), e);
+ } finally {
+ lock.unlock();
}
}
@Override
protected void populateRemoteHost() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_REMOTE, socket);
remoteHost = Address.getnameinfo(sa, 0);
@@ -2612,68 +2620,86 @@ public class AprEndpoint extends AbstractEndpoint<Long,Long> implements SNICallB
}
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noRemoteHost", getSocket()), e);
+ } finally {
+ lock.unlock();
}
}
@Override
protected void populateRemotePort() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_REMOTE, socket);
Sockaddr addr = Address.getInfo(sa);
remotePort = addr.port;
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noRemotePort", getSocket()), e);
+ } finally {
+ lock.unlock();
}
}
@Override
protected void populateLocalName() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_LOCAL, socket);
localName = Address.getnameinfo(sa, 0);
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noLocalName"), e);
+ } finally {
+ lock.unlock();
}
}
@Override
protected void populateLocalAddr() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_LOCAL, socket);
localAddr = Address.getip(sa);
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noLocalAddr"), e);
+ } finally {
+ lock.unlock();
}
}
@Override
protected void populateLocalPort() {
- if (isClosed()) {
- return;
- }
+ Lock lock = getLock();
+ lock.lock();
try {
+ if (isClosed()) {
+ return;
+ }
long socket = getSocket().longValue();
long sa = Address.get(Socket.APR_LOCAL, socket);
Sockaddr addr = Address.getInfo(sa);
localPort = addr.port;
} catch (Exception e) {
log.warn(sm.getString("endpoint.warn.noLocalPort"), e);
+ } finally {
+ lock.unlock();
}
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 3d466f5684..04336f0129 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -145,6 +145,9 @@
Fix JMX value for <code>keepAliveCount</code> on the endpoint. Also add
the value of <code>useVirtualThreads</code> in JMX. (remm)
</fix>
+ <fix>
+ Improve stability of APR/native connector. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org