diff --git a/silverberg/client.py b/silverberg/client.py
index <HASH>..<HASH> 100644
--- a/silverberg/client.py
+++ b/silverberg/client.py
@@ -182,8 +182,11 @@ class CQLClient(object):
         prep_query = prepare(query, args)
 
         def _execute(client):
-            return client.execute_cql3_query(prep_query,
-                                             ttypes.Compression.NONE, consistency)
+            exec_d = client.execute_cql3_query(prep_query,
+                                               ttypes.Compression.NONE, consistency)
+            cancellable_d = defer.Deferred(lambda d: self.disconnect())
+            exec_d.chainDeferred(cancellable_d)
+            return cancellable_d
 
         def _proc_results(result):
             if result.type == ttypes.CqlResultType.ROWS:
diff --git a/silverberg/thrift_client.py b/silverberg/thrift_client.py
index <HASH>..<HASH> 100644
--- a/silverberg/thrift_client.py
+++ b/silverberg/thrift_client.py
@@ -109,7 +109,7 @@ class OnDemandThriftClient(object):
         return d
 
     def _notify_on_connect(self):
-        d = Deferred()
+        d = Deferred(lambda d: self.disconnect())
         self._waiting_on_connect.append(d)
         return d
Query can be cancelled

Cancelling a running query will try to disconnect TCP connection