Example #1
0
    def test_block(self):
        pool = ConnectionPool('mypool', 1, close_conn, MyConnection,
                              'local', 8888, db=3)
        conn_holder1 = pool.get()

        self.assertRaises(gevent.queue.Empty, pool.get, block=True, timeout=0.1)

        # Spawn a greenlet to release the conn.
        gevent.spawn(pool.put, conn_holder1)

        conn_holder3 = pool.get()
        self.assertEquals(conn_holder3, conn_holder1)
Example #2
0
    def test_failed_connection_creation(self):
        pool = ConnectionPool('mypool', 1, close_conn, MyBadConnection,
                              'local', 8888, db=3)

        self.assertEqual(1, pool.qsize())
        with self.assertRaises(Exception) as cm1:
            pool.get()
        self.assertEqual('Failed to create Connection', str(cm1.exception))
        # Make sure the connection is returned to the pool.
        self.assertEqual(1, pool.qsize())

        with self.assertRaises(Exception) as cm2:
            with pool.get_connection():
                pass
        self.assertEqual('Failed to create Connection', str(cm2.exception))
        self.assertEqual(1, pool.qsize())
Example #3
0
    def test_block(self):
        pool = ConnectionPool('mypool',
                              1,
                              close_conn,
                              MyConnection,
                              'local',
                              8888,
                              db=3)
        conn_holder1 = pool.get()

        self.assertRaises(gevent.queue.Empty,
                          pool.get,
                          block=True,
                          timeout=0.1)

        # Spawn a greenlet to release the conn.
        gevent.spawn(pool.put, conn_holder1)

        conn_holder3 = pool.get()
        self.assertEquals(conn_holder3, conn_holder1)
Example #4
0
    def test_failed_connection_creation(self):
        pool = ConnectionPool('mypool',
                              1,
                              close_conn,
                              MyBadConnection,
                              'local',
                              8888,
                              db=3)

        self.assertEqual(1, pool.qsize())
        with self.assertRaises(Exception) as cm1:
            pool.get()
        self.assertEqual('Failed to create Connection', str(cm1.exception))
        # Make sure the connection is returned to the pool.
        self.assertEqual(1, pool.qsize())

        with self.assertRaises(Exception) as cm2:
            with pool.get_connection():
                pass
        self.assertEqual('Failed to create Connection', str(cm2.exception))
        self.assertEqual(1, pool.qsize())
Example #5
0
    def test_get_put(self):
        pool = ConnectionPool('mypool', 2, close_conn, MyConnection,
                              'local', 8888, db=3)

        self.assertEqual(2, pool.qsize())
        self.assertEqual(0, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # Get one.
        start_ts = time.time()
        conn_holder1 = pool.get()
        end_ts = time.time()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIsNot(conn_holder1.conn, None)
        self.assertIsInstance(conn_holder1.conn, MyConnection)
        self.assertEqual('local', conn_holder1.conn.host)
        self.assertEqual(8888, conn_holder1.conn.port)
        self.assertEqual(3, conn_holder1.conn.db)
        self.assertTrue(start_ts <= conn_holder1.last_access_time <= end_ts)

        # Get another.
        conn_holder2 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        self.assertIsNot(conn_holder2.conn, None)
        self.assertIsInstance(conn_holder2.conn, MyConnection)
        self.assertEqual('local', conn_holder2.conn.host)
        self.assertEqual(8888, conn_holder2.conn.port)
        self.assertEqual(3, conn_holder2.conn.db)

        self.assertIsNot(conn_holder1, conn_holder2)
        self.assertIsNot(conn_holder1.conn, conn_holder2.conn)

        # Put both back.
        pool.put(conn_holder1)
        self.assertEqual(1, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        pool.put(conn_holder2)
        self.assertEqual(2, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # LIFO
        conn_holder3 = pool.get()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIs(conn_holder3, conn_holder2)
        self.assertIs(conn_holder3.conn, conn_holder2.conn)
        # remember its conn for later use.
        conn_3 = conn_holder3.conn

        conn_holder4 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        self.assertIs(conn_holder4, conn_holder1)
        self.assertIs(conn_holder4.conn, conn_holder1.conn)

        # Replace one.
        pool.put(conn_holder3, replace=True)
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)

        pool.put(conn_holder4)
        self.assertEqual(2, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # Get them again.
        conn_holder5 = pool.get()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIs(conn_holder5, conn_holder4)
        self.assertIs(conn_holder5.conn, conn_holder4.conn)

        # This is the replacement of conn_3.
        conn_holder6 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        # Connetion holder is the same.
        self.assertIs(conn_holder6, conn_holder3)
        # Connection held is different.
        self.assertIsNot(conn_holder6.conn, conn_3)
Example #6
0
    def test_get_put(self):
        pool = ConnectionPool('mypool',
                              2,
                              close_conn,
                              MyConnection,
                              'local',
                              8888,
                              db=3)

        self.assertEqual(2, pool.qsize())
        self.assertEqual(0, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # Get one.
        start_ts = time.time()
        conn_holder1 = pool.get()
        end_ts = time.time()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIsNot(conn_holder1.conn, None)
        self.assertIsInstance(conn_holder1.conn, MyConnection)
        self.assertEqual('local', conn_holder1.conn.host)
        self.assertEqual(8888, conn_holder1.conn.port)
        self.assertEqual(3, conn_holder1.conn.db)
        self.assertTrue(start_ts <= conn_holder1.last_access_time <= end_ts)

        # Get another.
        conn_holder2 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        self.assertIsNot(conn_holder2.conn, None)
        self.assertIsInstance(conn_holder2.conn, MyConnection)
        self.assertEqual('local', conn_holder2.conn.host)
        self.assertEqual(8888, conn_holder2.conn.port)
        self.assertEqual(3, conn_holder2.conn.db)

        self.assertIsNot(conn_holder1, conn_holder2)
        self.assertIsNot(conn_holder1.conn, conn_holder2.conn)

        # Put both back.
        pool.put(conn_holder1)
        self.assertEqual(1, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        pool.put(conn_holder2)
        self.assertEqual(2, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # LIFO
        conn_holder3 = pool.get()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIs(conn_holder3, conn_holder2)
        self.assertIs(conn_holder3.conn, conn_holder2.conn)
        # remember its conn for later use.
        conn_3 = conn_holder3.conn

        conn_holder4 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        self.assertIs(conn_holder4, conn_holder1)
        self.assertIs(conn_holder4.conn, conn_holder1.conn)

        # Replace one.
        pool.put(conn_holder3, replace=True)
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)

        pool.put(conn_holder4)
        self.assertEqual(2, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(0, pool.num_in_use)

        # Get them again.
        conn_holder5 = pool.get()
        self.assertEqual(1, pool.qsize())
        self.assertEqual(1, pool.num_connected)
        self.assertEqual(1, pool.num_in_use)
        self.assertIs(conn_holder5, conn_holder4)
        self.assertIs(conn_holder5.conn, conn_holder4.conn)

        # This is the replacement of conn_3.
        conn_holder6 = pool.get()
        self.assertEqual(0, pool.qsize())
        self.assertEqual(2, pool.num_connected)
        self.assertEqual(2, pool.num_in_use)
        # Connetion holder is the same.
        self.assertIs(conn_holder6, conn_holder3)
        # Connection held is different.
        self.assertIsNot(conn_holder6.conn, conn_3)