From bc85543ef2309f1a3d1eb8280f61623ede69f352 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 15 Jun 2015 14:35:15 +0000
Subject: [PATCH] Fix removal of subsession aliases from tunnel manager on I2CP
 connection shutdown Sort tweaks for shared clients in summary bar

---
 .../java/src/net/i2p/router/web/SummaryHelper.java   |  6 ++++--
 .../i2p/router/client/ClientConnectionRunner.java    | 12 ++++++++++--
 .../src/net/i2p/router/client/ClientManager.java     |  4 ++--
 .../router/client/ClientMessageEventListener.java    |  2 --
 4 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index f0ef33f9ee..1cd207e454 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -491,9 +491,11 @@ public class SummaryHelper extends HelperBase {
         public int compare(Destination lhs, Destination rhs) {
             String lname = getName(lhs);
             String rname = getName(rhs);
-            if (lname.equals(xsc))
+            boolean lshared = lname.startsWith("shared clients") || lname.startsWith(xsc);
+            boolean rshared = rname.startsWith("shared clients") || rname.startsWith(xsc);
+            if (lshared && !rshared)
                 return -1;
-            if (rname.equals(xsc))
+            if (rshared && !lshared)
                 return 1;
             return Collator.getInstance().compare(lname, rname);
         }
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index b58f06462d..bc92e33be3 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -202,6 +202,8 @@ class ClientConnectionRunner {
             LeaseSet ls = sp.currentLeaseSet;
             if (ls != null)
                 _context.netDb().unpublish(ls);
+            if (!sp.isPrimary)
+                _context.tunnelManager().removeAlias(sp.dest);
         }
         synchronized (_alreadyProcessed) {
             _alreadyProcessed.clear();
@@ -414,15 +416,21 @@ class ClientConnectionRunner {
                 if (ls != null)
                     _context.netDb().unpublish(ls);
                 isPrimary = sp.isPrimary;
+                if (!isPrimary)
+                    _context.tunnelManager().removeAlias(sp.dest);
+                break;
             }
         }
-        if (isPrimary) {
+        if (isPrimary && !_sessions.isEmpty()) {
             // kill all the others also
             for (SessionParams sp : _sessions.values()) {
-                _manager.unregisterSession(id, sp.dest);
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Destroying remaining client subsession " + sp.sessionId);
+                _manager.unregisterSession(sp.sessionId, sp.dest);
                 LeaseSet ls = sp.currentLeaseSet;
                 if (ls != null)
                     _context.netDb().unpublish(ls);
+                _context.tunnelManager().removeAlias(sp.dest);
             }
         }
     }
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index ea35681f9e..6665409a03 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -220,14 +220,14 @@ class ClientManager {
      *  Remove all sessions for this runner.
      */
     public void unregisterConnection(ClientConnectionRunner runner) {
-        if (_log.shouldLog(Log.WARN))
-            _log.warn("Unregistering (dropping) a client connection");
         synchronized (_pendingRunners) {
             _pendingRunners.remove(runner);
         }
 
         List<SessionId> ids = runner.getSessionIds();
         List<Destination> dests = runner.getDestinations();
+        if (_log.shouldLog(Log.WARN))
+            _log.warn("Unregistering (dropping) a client connection with ids: " + ids);
         synchronized (_runners) {
             for (SessionId id : ids) {
                 _runnerSessionIds.remove(id);
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 628d8b0a5d..7bfd342b14 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -426,8 +426,6 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         if (left <= 0) {
             _runner.stopRunning();
         } else {
-            if (cfg != null)
-                _context.tunnelManager().removeAlias(cfg.getDestination());
             if (_log.shouldLog(Log.INFO))
                 _log.info("Still " + left + " sessions left");
         }
-- 
GitLab