This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new 4745922 Refactor to remove use of finalize() 4745922 is described below commit 4745922c8ddd81d537770c8519f7fa39e239dba3 Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Aug 23 12:40:11 2021 +0100 Refactor to remove use of finalize() --- .../tribes/transport/nio/ParallelNioSender.java | 74 ++++++++++++++-------- webapps/docs/changelog.xml | 8 +++ 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java b/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java index 3372b39..c90f4c7 100644 --- a/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java +++ b/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java @@ -17,6 +17,7 @@ package org.apache.catalina.tribes.transport.nio; import java.io.IOException; +import java.lang.ref.Cleaner; import java.net.UnknownHostException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -46,12 +47,16 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende private static final Log log = LogFactory.getLog(ParallelNioSender.class); protected static final StringManager sm = StringManager.getManager(ParallelNioSender.class); + + private static final Cleaner cleaner = Cleaner.create(); + + private final InternalState state; + protected final long selectTimeout = 5000; //default 5 seconds, same as send timeout - protected final Selector selector; - protected final HashMap<Member, NioSender> nioSenders = new HashMap<>(); public ParallelNioSender() throws IOException { - selector = Selector.open(); + state = new InternalState(Selector.open()); + cleaner.register(this, state); setConnected(true); } @@ -143,7 +148,7 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende SendResult result = new SendResult(); int selectedKeys; try { - selectedKeys = selector.select(selectTimeOut); + selectedKeys = state.selector.select(selectTimeOut); } catch (IOException ioe) { throw new ChannelException(sm.getString("parallelNioSender.send.failed"), ioe); } @@ -152,7 +157,7 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende return result; } - Iterator<SelectionKey> it = selector.selectedKeys().iterator(); + Iterator<SelectionKey> it = state.selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey sk = it.next(); it.remove(); @@ -287,17 +292,17 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende ChannelException cx = null; NioSender[] result = new NioSender[destination.length]; for ( int i=0; i<destination.length; i++ ) { - NioSender sender = nioSenders.get(destination[i]); + NioSender sender = state.nioSenders.get(destination[i]); try { if (sender == null) { sender = new NioSender(); AbstractSender.transferProperties(this, sender); - nioSenders.put(destination[i], sender); + state.nioSenders.put(destination[i], sender); } sender.reset(); sender.setDestination(destination[i]); - sender.setSelector(selector); + sender.setSelector(state.selector); sender.setUdpBased(isUdpBased()); result[i] = sender; }catch ( UnknownHostException x ) { @@ -323,7 +328,7 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende private synchronized void close() throws ChannelException { ChannelException x = null; - Iterator<Map.Entry<Member,NioSender>> iter = nioSenders.entrySet().iterator(); + Iterator<Map.Entry<Member,NioSender>> iter = state.nioSenders.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<Member,NioSender> entry = iter.next(); try { @@ -349,7 +354,7 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende @Override public void remove(Member member) { //disconnect senders - NioSender sender = nioSenders.remove(member); + NioSender sender = state.nioSenders.remove(member); if ( sender != null ) { sender.disconnect(); } @@ -367,22 +372,9 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende } @Override - protected void finalize() throws Throwable { - try {disconnect(); }catch ( Exception e){/*Ignore*/} - try { - selector.close(); - }catch (Exception e) { - if (log.isDebugEnabled()) { - log.debug("Failed to close selector", e); - } - } - super.finalize(); - } - - @Override public boolean keepalive() { boolean result = false; - for (Iterator<Entry<Member,NioSender>> i = nioSenders.entrySet().iterator(); i.hasNext();) { + for (Iterator<Entry<Member,NioSender>> i = state.nioSenders.entrySet().iterator(); i.hasNext();) { Map.Entry<Member, NioSender> entry = i.next(); NioSender sender = entry.getValue(); if ( sender.keepalive() ) { @@ -405,8 +397,40 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende } //clean up any cancelled keys if ( result ) { - try { selector.selectNow(); }catch (Exception e){/*Ignore*/} + try { state.selector.selectNow(); }catch (Exception e){/*Ignore*/} } return result; } + + + private static class InternalState implements Runnable { + + private final Selector selector; + private final HashMap<Member, NioSender> nioSenders = new HashMap<>(); + + private InternalState(Selector selector) { + this.selector = selector; + } + + @Override + public void run() { + Iterator<NioSender> iter = nioSenders.values().iterator(); + while (iter.hasNext()) { + NioSender nioSender = iter.next(); + try { + nioSender.disconnect(); + } catch (Exception e) { + // Ignore + } + iter.remove(); + } + try { + selector.close(); + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("Failed to close selector", e); + } + } + } + } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index ba8a5c4..3c644e6 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -185,6 +185,14 @@ </fix> </changelog> </subsection> + <subsection name="Tribes"> + <changelog> + <scode> + Refactor the <code>ParallelNioSender</code> to avoid the use of + <code>finalize()</code>. (markt) + </scode> + </changelog> + </subsection> <subsection name="Other"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org