From 581230b9a232febaf1c94a0fbea5535b6aee0cc2 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Sat, 3 Jan 2009 00:41:53 +0000 Subject: [PATCH] Operate on a snapshot of the overflow queue values as a connection may fail while we're processing its overflow messages, which causes its overflow queue to be cleared which causes a ConcurrentModificationException. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5613 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../threerings/presents/server/net/ConnectionManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/com/threerings/presents/server/net/ConnectionManager.java b/src/java/com/threerings/presents/server/net/ConnectionManager.java index 9747facc8..5e0d51334 100644 --- a/src/java/com/threerings/presents/server/net/ConnectionManager.java +++ b/src/java/com/threerings/presents/server/net/ConnectionManager.java @@ -642,14 +642,14 @@ public class ConnectionManager extends LoopingThread { // first attempt to send any messages waiting on the overflow queues if (_oflowqs.size() > 0) { - Iterator oqiter = _oflowqs.values().iterator(); - while (oqiter.hasNext()) { - OverflowQueue oq = oqiter.next(); + // do this on a snapshot as a network failure writing oflow queue messages will result + // in the queue being removed from _oflowqs via the connectionFailed() code path + for (OverflowQueue oq : _oflowqs.values().toArray(new OverflowQueue[_oflowqs.size()])) { try { // try writing the messages in this overflow queue if (oq.writeOverflowMessages(iterStamp)) { // if they were all written, we can remove it - oqiter.remove(); + _oflowqs.remove(oq.conn); } } catch (IOException ioe) {