summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2011-05-25 15:42:24 -0700
committertermie <github@anarkystic.com>2011-05-25 15:42:24 -0700
commitb193b97054f11664a72cd53547f355d1c9044f88 (patch)
tree6efc70c69fcba431e0ac5bd78d2f2baa83f64cc5
parent11d3672ad655c39265e5d2477a30db3a12adc65c (diff)
connection pool tests and make the pool LIFO
-rw-r--r--nova/rpc.py8
-rw-r--r--nova/tests/test_rpc.py42
2 files changed, 49 insertions, 1 deletions
diff --git a/nova/rpc.py b/nova/rpc.py
index 82869fc46..3cc0dadd4 100644
--- a/nova/rpc.py
+++ b/nova/rpc.py
@@ -99,10 +99,16 @@ class Connection(carrot_connection.BrokerConnection):
class Pool(pools.Pool):
"""Class that implements a Pool of Connections"""
+ # TODO(comstud): Timeout connections not used in a while
def create(self):
return Connection.instance(new=True)
-ConnectionPool = Pool(max_size=FLAGS.rpc_conn_pool_size)
+# Create a ConnectionPool to use for RPC calls. We'll order the
+# pool as a stack (LIFO), so that we can potentially loop through and
+# timeout old unused connections at some point
+ConnectionPool = Pool(
+ max_size=FLAGS.rpc_conn_pool_size,
+ order_as_stack=True)
class Consumer(messaging.Consumer):
diff --git a/nova/tests/test_rpc.py b/nova/tests/test_rpc.py
index acab3e758..f64209596 100644
--- a/nova/tests/test_rpc.py
+++ b/nova/tests/test_rpc.py
@@ -120,6 +120,48 @@ class RpcTestCase(test.TestCase):
"value": value}})
self.assertEqual(value, result)
+ def test_connectionpool_single(self):
+ """Test that ConnectionPool recycles a single connection"""
+
+ conn1 = rpc.ConnectionPool.get()
+ rpc.ConnectionPool.put(conn1)
+ conn2 = rpc.ConnectionPool.get()
+ rpc.ConnectionPool.put(conn2)
+ self.assertEqual(conn1, conn2)
+
+ def test_connectionpool_double(self):
+ """Test that ConnectionPool returns 2 separate connections
+ when called consecutively and the pool returns connections LIFO
+ """
+
+ conn1 = rpc.ConnectionPool.get()
+ conn2 = rpc.ConnectionPool.get()
+
+ self.assertNotEqual(conn1, conn2)
+ rpc.ConnectionPool.put(conn1)
+ rpc.ConnectionPool.put(conn2)
+
+ conn3 = rpc.ConnectionPool.get()
+ conn4 = rpc.ConnectionPool.get()
+ self.assertEqual(conn2, conn3)
+ self.assertEqual(conn1, conn4)
+
+ def test_connectionpool_limit(self):
+ """Test connection pool limit and verify all connections
+ are unique
+ """
+
+ max_size = FLAGS.rpc_conn_pool_size
+ conns = []
+
+ for i in xrange(max_size):
+ conns.append(rpc.ConnectionPool.get())
+
+ self.assertFalse(rpc.ConnectionPool.free_items)
+ self.assertEqual(rpc.ConnectionPool.current_size,
+ rpc.ConnectionPool.max_size)
+ self.assertEqual(len(set(conns)), max_size)
+
class TestReceiver(object):
"""Simple Proxy class so the consumer has methods to call