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) {

Reply via email to