Updated Branches: refs/heads/master 6bdfe524c -> ef2276cad
make ping result handling resistant against concurrent modification, especially when the XmppPinger is removing himself upon notification Project: http://git-wip-us.apache.org/repos/asf/mina-vysper/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-vysper/commit/4e99c84a Tree: http://git-wip-us.apache.org/repos/asf/mina-vysper/tree/4e99c84a Diff: http://git-wip-us.apache.org/repos/asf/mina-vysper/diff/4e99c84a Branch: refs/heads/master Commit: 4e99c84a6672eb041fd47105c23557774b071a96 Parents: 6bdfe52 Author: Bernd Fondermann <[email protected]> Authored: Tue Jul 2 16:46:36 2013 +0200 Committer: Bernd Fondermann <[email protected]> Committed: Tue Jul 2 16:46:36 2013 +0200 ---------------------------------------------------------------------- .../xep0199_xmppping/XmppPingIQHandler.java | 18 ++++++++++++++---- .../extension/xep0199_xmppping/XmppPinger.java | 6 ++++++ 2 files changed, 20 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/4e99c84a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandler.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandler.java index 64b60eb..655bace 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandler.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPingIQHandler.java @@ -31,6 +31,8 @@ import org.apache.vysper.xmpp.stanza.IQStanza; import org.apache.vysper.xmpp.stanza.IQStanzaType; import org.apache.vysper.xmpp.stanza.Stanza; import org.apache.vysper.xmpp.stanza.StanzaBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Implementation of <a href="http://xmpp.org/extensions/xep-0199.html">XEP-0199 XMPP Ping</a>. @@ -50,7 +52,9 @@ import org.apache.vysper.xmpp.stanza.StanzaBuilder; @SpecCompliant(spec = "xep-0199", status = SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = SpecCompliant.ComplianceCoverage.PARTIAL) public class XmppPingIQHandler extends DefaultIQHandler { - private List<XmppPinger> pingers = new ArrayList<XmppPinger>(); + private static final Logger LOG = LoggerFactory.getLogger(XmppPingIQHandler.class); + + private final List<XmppPinger> pingers = new ArrayList<XmppPinger>(); public XmppPingIQHandler() { } @@ -101,10 +105,16 @@ public class XmppPingIQHandler extends DefaultIQHandler { @Override protected Stanza handleResult(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) { - for(XmppPinger pinger : pingers) { - pinger.pong(stanza.getID()); + List<XmppPinger> pingersCopy = new ArrayList<XmppPinger>(pingers); + for (XmppPinger pinger : pingersCopy) { + try { + pinger.pong(stanza.getID()); + } catch (Throwable e) { + LOG.warn("ponging the pinger produced problem: " + e.getMessage()); + LOG.debug("ponging the pinger produced problem. ", e); + } } - + return null; } http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/4e99c84a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPinger.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPinger.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPinger.java index 11c7d81..8757b98 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPinger.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/XmppPinger.java @@ -28,6 +28,8 @@ import org.apache.vysper.xmpp.protocol.NamespaceURIs; import org.apache.vysper.xmpp.stanza.Stanza; import org.apache.vysper.xmpp.stanza.StanzaBuilder; import org.apache.vysper.xmpp.writer.StanzaWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -35,6 +37,8 @@ import org.apache.vysper.xmpp.writer.StanzaWriter; */ public class XmppPinger { + private static final Logger LOG = LoggerFactory.getLogger(XmppPinger.class); + private String id = "xmppping-" + UUID.randomUUID().toString(); private XmppPingIQHandler handler; @@ -58,8 +62,10 @@ public class XmppPinger { try { if(pingQueue.poll(timeoutMillis, TimeUnit.MILLISECONDS) != null) { + LOG.debug("pong received from " + to + " for ping id = " + id); listener.pong(); } else { + LOG.debug("no pong received for " + timeoutMillis + "msec from " + to + " for ping id = " + id); listener.timeout(); } } catch (InterruptedException e) {
