From 888cf6c9e8bdcc7b2c3877b20bae47dc5c915929 Mon Sep 17 00:00:00 2001 From: Soham Bhambare Date: Thu, 2 Jul 2026 12:27:42 -0400 Subject: [PATCH 1/3] Update DeletePartnershipCommand.java --- .../java/org/openas2/app/partner/DeletePartnershipCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java b/Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java index 2f7f4b600..30265eb18 100644 --- a/Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java +++ b/Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java @@ -43,6 +43,7 @@ public CommandResult execute(PartnershipFactory partFx, Object[] params) throws if (!((XMLPartnershipFactory) partFx).deleteElement("/partnerships/partnership[@name='" + name + "']")) { return new CommandResult(CommandResult.TYPE_ERROR, "Partnership delete failed in XML document for partnership name: " + name); } + partFx.getSession().destroyPartnershipPoller(name); return new CommandResult(CommandResult.TYPE_OK); } } From 822337da7027611fefeec369f625dd93768d477e Mon Sep 17 00:00:00 2001 From: Soham Bhambare Date: Thu, 2 Jul 2026 12:32:20 -0400 Subject: [PATCH 2/3] Add destroyPartnershipPoller method to Session interface --- Server/src/main/java/org/openas2/Session.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/src/main/java/org/openas2/Session.java b/Server/src/main/java/org/openas2/Session.java index 4213a7190..7a0fc62dc 100644 --- a/Server/src/main/java/org/openas2/Session.java +++ b/Server/src/main/java/org/openas2/Session.java @@ -112,6 +112,7 @@ public interface Session { public void startPartnershipPollers() throws OpenAS2Exception; public void destroyPartnershipPollers(String configSourceFilter); + public void destroyPartnershipPoller(String partnershipName); String getBaseDirectory(); From ebcfe07b0e448dca1902266226345bd2c7912de3 Mon Sep 17 00:00:00 2001 From: Soham Bhambare Date: Thu, 2 Jul 2026 12:33:49 -0400 Subject: [PATCH 3/3] Implement destroyPartnershipPoller method Added method to destroy and untrack the poller for a deleted partnership, allowing immediate freeing of the outbox directory. --- .../main/java/org/openas2/BaseSession.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Server/src/main/java/org/openas2/BaseSession.java b/Server/src/main/java/org/openas2/BaseSession.java index b6ca390d2..32e58b875 100644 --- a/Server/src/main/java/org/openas2/BaseSession.java +++ b/Server/src/main/java/org/openas2/BaseSession.java @@ -185,6 +185,38 @@ public void destroyPartnershipPollers(String configSourceFilter) { } } + /** + * Synchronously stop and untrack the poller for a single named partnership, if one is + * currently registered. Used when a partnership is deleted outside of a full config + * reload (e.g. via the REST API) so that its outbox directory is freed up immediately + * rather than waiting for the next scheduled partnerships file refresh. + * + * @param partnershipName - name attribute value for the partnership whose poller should be destroyed + */ + public void destroyPartnershipPoller(String partnershipName) { + String pollerKeyToRemove = null; + for (Map.Entry> entry : polledDirectories.entrySet()) { + Map meta = entry.getValue(); + if (partnershipName.equals(meta.get("partnershipName"))) { + DirectoryPollingModule poller = (DirectoryPollingModule) meta.get("pollerInstance"); + try { + LOGGER.trace("Destroying poller for deleted partnership " + partnershipName + ":" + meta); + if (poller.isRunning()) { + poller.stop(); + } + } catch (Exception e) { + LOGGER.error("Failed to stop the partnership poller for partnership " + partnershipName + ": " + meta, e); + } + pollerKeyToRemove = entry.getKey(); + break; + } + } + if (pollerKeyToRemove != null) { + polledDirectories.remove(pollerKeyToRemove); + LOGGER.trace("Removed poller from cache map:" + pollerKeyToRemove); + } + } + public DirectoryPollingModule getPartnershipPoller(String partnershipName) { for (Map.Entry> entry : polledDirectories.entrySet()) { Map meta = entry.getValue();