From 9b00a6f02948eca406693a86628dd40dddefb59a Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Wed, 24 Oct 2012 20:13:00 +0100
Subject: [PATCH] Remove dead secrets from the connection recogniser.

---
 .../sf/briar/transport/KeyManagerImpl.java    | 32 +++++++++++--------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/components/net/sf/briar/transport/KeyManagerImpl.java b/components/net/sf/briar/transport/KeyManagerImpl.java
index 7aa38d5d51..03cfb58cdf 100644
--- a/components/net/sf/briar/transport/KeyManagerImpl.java
+++ b/components/net/sf/briar/transport/KeyManagerImpl.java
@@ -76,8 +76,8 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 		try {
 			// Store any secrets that have been created
 			if(!created.isEmpty()) db.addSecrets(created);
-			// Pass the current incoming secrets to the connection recogniser
-			// FIXME: This uses a separate database transaction for each secret
+			// Pass the current incoming secrets to the recogniser
+			// FIXME: This uses a separate database transaction per secret
 			for(TemporarySecret s : incomingOld.values())
 				recogniser.addSecret(s);
 			for(TemporarySecret s : incomingNew.values())
@@ -237,19 +237,25 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 		// Work out what phase of its lifecycle each secret is in
 		long now = System.currentTimeMillis();
 		Collection<TemporarySecret> dead = assignSecretsToMaps(now, secrets);
+		// Remove any dead secrets from the recogniser
+		for(TemporarySecret s : dead) {
+			ContactId c = s.getContactId();
+			TransportId t = s.getTransportId();
+			long period = s.getPeriod();
+			recogniser.removeSecret(c, t, period);
+		}
 		// Replace any dead secrets
 		Collection<TemporarySecret> created = replaceDeadSecrets(now, dead);
-		try {
-			// Store any secrets that have been created
-			if(!created.isEmpty()) db.addSecrets(created);
-			// Pass the current incoming secrets to the connection recogniser
-			// FIXME: This uses a separate database transaction for each secret
-			for(TemporarySecret s : incomingOld.values())
-				recogniser.addSecret(s);
-			for(TemporarySecret s : incomingNew.values())
-				recogniser.addSecret(s);
-		} catch(DbException e) {
-			if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
+		if(!created.isEmpty()) {
+			try {
+				// Store any secrets that have been created
+				db.addSecrets(created);
+				// Pass any secrets that have been created to the recogniser
+				// FIXME: This uses a separate database transaction per secret
+				for(TemporarySecret s : created) recogniser.addSecret(s);
+			} catch(DbException e) {
+				if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
+			}
 		}
 	}
 
-- 
GitLab