From de3665f734c6db0a293c670bd17e0d7b325381b8 Mon Sep 17 00:00:00 2001 From: Devrandom Date: Sun, 24 Aug 2014 12:49:34 -0700 Subject: [PATCH] Orchid: fix infinite task creation loop when shutting down --- orchid/src/com/subgraph/orchid/ConnectionCache.java | 2 ++ .../com/subgraph/orchid/circuits/CircuitCreationTask.java | 5 +++++ .../com/subgraph/orchid/connections/ConnectionCacheImpl.java | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/orchid/src/com/subgraph/orchid/ConnectionCache.java b/orchid/src/com/subgraph/orchid/ConnectionCache.java index 5210970c..3c537607 100644 --- a/orchid/src/com/subgraph/orchid/ConnectionCache.java +++ b/orchid/src/com/subgraph/orchid/ConnectionCache.java @@ -18,4 +18,6 @@ public interface ConnectionCache { Connection getConnectionTo(Router router, boolean isDirectoryConnection) throws InterruptedException, ConnectionTimeoutException, ConnectionFailedException, ConnectionHandshakeException; void close(); + + boolean isClosed(); } diff --git a/orchid/src/com/subgraph/orchid/circuits/CircuitCreationTask.java b/orchid/src/com/subgraph/orchid/circuits/CircuitCreationTask.java index 71b428a0..e8ba0276 100644 --- a/orchid/src/com/subgraph/orchid/circuits/CircuitCreationTask.java +++ b/orchid/src/com/subgraph/orchid/circuits/CircuitCreationTask.java @@ -142,6 +142,11 @@ public class CircuitCreationTask implements Runnable { } private void buildCircuitIfNeeded() { + if (connectionCache.isClosed()) { + logger.warning("Not building circuits, because connection cache is closed"); + return; + } + final List pendingExitStreams = circuitManager.getPendingExitStreams(); final List predictedPorts = predictor.getPredictedPortTargets(); final List exitTargets = new ArrayList(); diff --git a/orchid/src/com/subgraph/orchid/connections/ConnectionCacheImpl.java b/orchid/src/com/subgraph/orchid/connections/ConnectionCacheImpl.java index bc3aa752..89b1e7dc 100644 --- a/orchid/src/com/subgraph/orchid/connections/ConnectionCacheImpl.java +++ b/orchid/src/com/subgraph/orchid/connections/ConnectionCacheImpl.java @@ -101,6 +101,11 @@ public class ConnectionCacheImpl implements ConnectionCache, DashboardRenderable scheduledExecutor.shutdownNow(); } + @Override + public boolean isClosed() { + return isClosed; + } + public Connection getConnectionTo(Router router, boolean isDirectoryConnection) throws InterruptedException, ConnectionTimeoutException, ConnectionFailedException, ConnectionHandshakeException { if(isClosed) { throw new IllegalStateException("ConnectionCache has been closed");