From 4f0b58f84c7c128474212126516feb6e451531e1 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sun, 1 Dec 2024 20:31:27 +0100 Subject: [PATCH 1/2] Method for removing all active servers from configuration Some configuration changes require a restart of the server, and at least in some cases actually require constructing a completely new server object. Right now servers can only be removed by protocol name (which in turn is only available hidden in the source), which is a bit annoying, so add a method for simply clearing out the whole list. --- .../org/filesys/server/config/ServerConfiguration.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/filesys/server/config/ServerConfiguration.java b/src/main/java/org/filesys/server/config/ServerConfiguration.java index a9e6d19..a01119f 100644 --- a/src/main/java/org/filesys/server/config/ServerConfiguration.java +++ b/src/main/java/org/filesys/server/config/ServerConfiguration.java @@ -158,6 +158,13 @@ public final NetworkServer removeServer(String proto) { return m_serverList.removeServer(proto); } + /** + * Remove all active servers + */ + public final void removeAllServers() { + m_serverList.removeAll(); + } + /** * Return the number of active servers * From 6fc0e80794387f3f08e5f52360c4468b2d518d98 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sun, 1 Dec 2024 21:03:31 +0100 Subject: [PATCH 2/2] Avoid leaking servers via their configuration listener on removal --- .../java/org/filesys/server/NetworkServerList.java | 11 ++++++++++- .../filesys/server/config/ServerConfiguration.java | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/filesys/server/NetworkServerList.java b/src/main/java/org/filesys/server/NetworkServerList.java index 0763cdc..b2127ed 100644 --- a/src/main/java/org/filesys/server/NetworkServerList.java +++ b/src/main/java/org/filesys/server/NetworkServerList.java @@ -20,6 +20,7 @@ package org.filesys.server; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -27,7 +28,7 @@ * * @author gkspencer */ -public class NetworkServerList { +public class NetworkServerList implements Iterable { // List of network servers private List m_servers; @@ -39,6 +40,14 @@ public NetworkServerList() { m_servers = new ArrayList(); } + /** + * Iterator over the servers in the list + */ + @Override + public final Iterator iterator() { + return m_servers.iterator(); + } + /** * Return the number of servers in the list * diff --git a/src/main/java/org/filesys/server/config/ServerConfiguration.java b/src/main/java/org/filesys/server/config/ServerConfiguration.java index a01119f..badcffe 100644 --- a/src/main/java/org/filesys/server/config/ServerConfiguration.java +++ b/src/main/java/org/filesys/server/config/ServerConfiguration.java @@ -155,13 +155,22 @@ public final NetworkServer findServer(String proto) { * @return NetworkServer */ public final NetworkServer removeServer(String proto) { - return m_serverList.removeServer(proto); + final NetworkServer server = m_serverList.removeServer(proto); + if (server instanceof ConfigurationListener) { + removeListener((ConfigurationListener) server); + } + return server; } /** * Remove all active servers */ public final void removeAllServers() { + for (NetworkServer server : m_serverList) { + if (server instanceof ConfigurationListener) { + removeListener((ConfigurationListener) server); + } + } m_serverList.removeAll(); }