diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java index 9219bf519db9f6439d8809a71810df923047ef28..3be3eb764b6d870f77bc4d7b9536a8a4e88df017 100644 --- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java +++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java @@ -221,6 +221,11 @@ class TransientSessionKeyManager extends SessionKeyManager { * */ public void tagsDelivered(PublicKey target, SessionKey key, Set sessionTags) { + if (_log.shouldLog(Log.DEBUG)) { + //_log.debug("Tags delivered to set " + set + " on session " + sess); + if (sessionTags.size() > 0) + _log.debug("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags); + } OutboundSession sess = getSession(target); if (sess == null) { createSession(target, key); @@ -229,11 +234,6 @@ class TransientSessionKeyManager extends SessionKeyManager { sess.setCurrentKey(key); TagSet set = new TagSet(sessionTags, key, _context.clock().now()); sess.addTags(set); - if (_log.shouldLog(Log.WARN)) { - //_log.debug("Tags delivered to set " + set + " on session " + sess); - if (sessionTags.size() > 0) - _log.warn("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags); - } } /** @@ -696,7 +696,7 @@ class TransientSessionKeyManager extends SessionKeyManager { public Set dropTags() { Set rv = null; synchronized (TagSet.this) { - rv = _sessionTags; + rv = new HashSet(_sessionTags); _sessionTags = Collections.EMPTY_SET; } return rv; @@ -707,12 +707,16 @@ class TransientSessionKeyManager extends SessionKeyManager { } public boolean contains(SessionTag tag) { - return _sessionTags.contains(tag); + synchronized (TagSet.this) { + return _sessionTags.contains(tag); + } } public void consume(SessionTag tag) { if (contains(tag)) { - _sessionTags.remove(tag); + synchronized (TagSet.this) { + _sessionTags.remove(tag); + } } } @@ -721,9 +725,11 @@ class TransientSessionKeyManager extends SessionKeyManager { return null; } - SessionTag first = (SessionTag) _sessionTags.iterator().next(); - _sessionTags.remove(first); - return first; + synchronized (TagSet.this) { + SessionTag first = (SessionTag) _sessionTags.iterator().next(); + _sessionTags.remove(first); + return first; + } } public Exception getCreatedBy() { return _createdBy; } diff --git a/history.txt b/history.txt index daa055c895f75075ec939c0ac26dae09d30a87dc..c762e1a1e536774e7ace2e320b30c4063ccf1cc1 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,8 @@ -$Id: history.txt,v 1.208 2005/07/05 17:08:56 jrandom Exp $ +$Id: history.txt,v 1.209 2005/07/11 18:06:23 jrandom Exp $ + +2005-07-12 jrandom + * Add some data duplication to avoid a recently injected concurrency problem + in the session tag manager (thanks redzara and romster). 2005-07-11 jrandom * Reduced the growth factor on the slow start and congestion avoidance for diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index dea8d7a2b726804ea86aa325bcde86dad1a0006c..626bef3aeab8ed442a5bfcb4c571b7884e8fe23b 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.199 $ $Date: 2005/07/05 17:08:59 $"; + public final static String ID = "$Revision: 1.200 $ $Date: 2005/07/11 18:06:24 $"; public final static String VERSION = "0.5.0.7"; - public final static long BUILD = 11; + public final static long BUILD = 12; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID);