Build: #3214 was successful
Job: Workflow was successful
Code commits
Openfire (master)
-
daryl herzmann 8be466d16a8c17580645bb1517f2029694d35391
Merge pull request #3179 from guusdk/OF-3201_Robust-outgoing-session-registration
OF-3201: Fix orphaned routing table entry when outgoingServerSessionCreated fails -
daryl herzmann 65bf7d4647ce508091dff17da32ab68bdf012a37
Merge pull request #3154 from Fishbowler/fix-authcheckfilter
OF-3187: Make AuthCheckFilter's destroy a no-op -
daryl herzmann 35beffe613c3f983e853cca93bb55f3806d6b9e8
Merge pull request #3180 from guusdk/OF-3202_PacketsProcessor-isDone-robustness
OF-3202: PacketsProcessor.isDone() reporting completion based on explicit completion state -
Guus der Kinderen 2ad76247058f8aaec8c0c1448030c93538d52817
Update xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalOutgoingServerSession.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>- xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalOutgoingServerSession.java (version 2ad76247058f8aaec8c0c1448030c93538d52817)
-
daryl herzmann 3dc512e779f3f63fc54bc9e6aca220ed2a96f0c1
Merge pull request #3178 from guusdk/OF-3176_Async-connection-closure-follow-ups
OF-3176: Ensure session initializer stops on timeout -
daryl herzmann 27d041818586cd85e21e72a0ad8728f91b9e51d1
Merge pull request #3173 from guusdk/OF-3199_pubsub-single-node-load-with-parent
OF-3199: Resolve NPE when loading a child node via the single-node code path -
Guus der Kinderen a541bf3cf2a22cb577c7ef27b682d0c77cf30492
OF-3176: Ensure session initializer stops on timeout
When creating an outgoing server to server session, various exceptions can be thrown. Handling of all but the TimeoutException call `sessionInitializer.stop()`. The omission here means the Netty channel stays open after a timeout, leaking a connection. Since addOutgoingDomainPair and outgoingServerSessionCreated are never called for it, the session is invisible to routing and cleanup infrastructure.- xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalOutgoingServerSession.java (version a541bf3cf2a22cb577c7ef27b682d0c77cf30492)
-
Guus der Kinderen b2de58986b13785c116b448f4323e28499b9de76
OF-3202: PacketsProcessor.isDone() reporting completion based on explicit completion state
isDone() previously returned true whenever the packet queue was empty, which could incorrectly indicate that a processor was done during the initialisation window before the first packet was added, or while the queue was being drained but before the processor had removed itself from packetsProcessors. Fix by replacing the queue-emptiness check with an explicit volatile boolean flag that is set only after the queue has been fully drained and the processor has been removed from packetsProcessors.- xmppserver/src/main/java/org/jivesoftware/openfire/server/OutgoingSessionPromise.java (version b2de58986b13785c116b448f4323e28499b9de76)
-
Guus der Kinderen d5b5df7aeaaf4f89b8ab30ab184f6f42b91072d6
OF-3201: Fix orphaned routing table entry when outgoingServerSessionCreated fails
If outgoingServerSessionCreated() threw an exception after addOutgoingDomainPair() had already registered the route, the close listener responsible for removing the route would never be registered, leaving a permanent orphaned routing table entry. All subsequent stanzas to the affected remote domain would then be dropped with no possibility of recovery short of a server restart.
Fix by explicitly removing all routes added by addOutgoingDomainPair() if outgoingServerSessionCreated() throws, before re-throwing so that the outer catch block can close the session.- xmppserver/src/main/java/org/jivesoftware/openfire/session/LocalOutgoingServerSession.java (version d5b5df7aeaaf4f89b8ab30ab184f6f42b91072d6)
-
Guus der Kinderen 037965b35aa91c00d72f76834c2b0bb663e693e2
OF-3196: Resolve O(n²) node lookup causing multi-hour startup at scale
DefaultPubSubPersistenceProvider.loadNodes() called lookupNode() once per row when processing result sets for JIDs, groups, affiliations, and subscriptions. The original lookupNode() ignored the map's existing Node.UniqueIdentifier key and instead performed a full linear scan of all map values, making each call O(n).
With 600,000 nodes and one affiliation each, this produced approximately 180 billion string comparisons for affiliations alone, resulting in startup times exceeding two hours.
Fix by constructing the Node.UniqueIdentifier key directly and delegating to Map.get(), reducing each lookup from O(n) to O(1) and overall loading complexity from O(n²) to O(n). Thread the required serviceId parameter through all four affected callers: loadAssociatedJIDs, loadAssociatedGroups, loadAffiliations, and loadSubscriptions.- xmppserver/src/main/java/org/jivesoftware/openfire/pubsub/DefaultPubSubPersistenceProvider.java (version 037965b35aa91c00d72f76834c2b0bb663e693e2)
-
Guus der Kinderen 0ea28bc0bdca6f2d852dae91bca60583981319d2 m
OF-3199: Resolve NPE when loading a child node via the single-node code path
When loadNode(PubSubService, Node.UniqueIdentifier) loaded a node that had a parent, it attempted to resolve the parent-child relationship by looking up the parent ID in the local nodes map. That map only ever contained the one node being loaded, so nodes.get(parentId) always returned null, causing an NPE on the subsequent changeParent() call.
Fix by issuing a second LOAD_NODE query on the same open connection to hydrate the parent node into the map before calling changeParent(). Any grandparent mapping discovered while loading the parent is discarded via a fresh HashMap, as resolving the full ancestry chain is the responsibility of loadNodes(), not this single-node path.- xmppserver/src/main/java/org/jivesoftware/openfire/pubsub/DefaultPubSubPersistenceProvider.java (version 0ea28bc0bdca6f2d852dae91bca60583981319d2)
-
Dan Caseley b8cf466169ee943a7b8e1ee941a1312e11e9779d m
OF-3187: Make AuthCheckFilter's destroy a no-op
This is called when the AdminConsolePlugin restarts (by PluginServlet). It wipes all exclusions that have been registered, requiring plugins to re-register them. This change retains the static list of excludes. Plugins remain responsible for unregistering their excludes, which they should have been doing anyway, rather than relying on an eventual restart of the AdminConsole.- xmppserver/src/main/java/org/jivesoftware/admin/AuthCheckFilter.java (version b8cf466169ee943a7b8e1ee941a1312e11e9779d)
- xmppserver/src/main/java/org/jivesoftware/openfire/container/AdminConsolePlugin.java (version b8cf466169ee943a7b8e1ee941a1312e11e9779d)