def test_over_max_no_timeout_blocks(self): class Thread(threading.Thread): def __init__(self, pool): super(Thread, self).__init__() self.state = 'init' self.pool = pool self.sock = None def run(self): self.state = 'get_socket' self.sock = self.pool.get_socket() self.state = 'sock' pool = self.get_pool(None, 2, None) s1 = pool.get_socket() self.assertTrue(None is not s1) s2 = pool.get_socket() self.assertTrue(None is not s2) self.assertNotEqual(s1, s2) t = Thread(pool) t.start() while t.state != 'get_socket': time.sleep(0.1) self.assertEqual(t.state, 'get_socket') time.sleep(5) self.assertEqual(t.state, 'get_socket') pool.maybe_return_socket(s1) while t.state != 'sock': time.sleep(0.1) self.assertEqual(t.state, 'sock') self.assertEqual(t.sock, s1)
def __is_master(self, host): """Directly call ismaster. """ pool = self.pool_class(host, self.__max_pool_size, self.__net_timeout, self.__conn_timeout, self.__use_ssl) sock_info = pool.get_socket() response = self.__simple_command( sock_info, 'admin', {'ismaster': 1} ) pool.maybe_return_socket(sock_info) return response, pool
def __is_master(self, host): """Directly call ismaster. """ pool = self.pool_class(host, self.__max_pool_size, self.__net_timeout, self.__conn_timeout, self.__use_ssl) sock_info = pool.get_socket() try: response = self.__simple_command( sock_info, 'admin', {'ismaster': 1} ) pool.maybe_return_socket(sock_info) return response, pool except (ConnectionFailure, socket.error): pool.discard_socket(sock_info) raise
def test_blocking(self): # Verify get_socket() with no wait_queue_timeout blocks forever. pool = self.get_pool_with_wait_queue_timeout(None) # Reach max_size. s1 = pool.get_socket() t = SocketGetter(self, pool) t.start() while t.state != 'get_socket': self.sleep(0.1) self.sleep(1) self.assertEqual(t.state, 'get_socket') pool.maybe_return_socket(s1) while t.state != 'sock': self.sleep(0.1) self.assertEqual(t.state, 'sock') self.assertEqual(t.sock, s1)
def test_wait_queue_multiple(self): class Thread(threading.Thread): def __init__(self, pool): super(Thread, self).__init__() self.state = 'init' self.pool = pool self.sock = None def run(self): self.state = 'get_socket' self.sock = self.pool.get_socket() self.state = 'sock' pool = self.get_pool(None, None, None, 3) socks = [] for _ in xrange(2): sock = pool.get_socket() self.assertTrue(sock is not None) socks.append(sock) threads = [] for _ in xrange(6): t = Thread(pool) t.start() threads.append(t) time.sleep(1) for t in threads: self.assertEqual(t.state, 'get_socket') self.assertRaises(ExceededMaxWaiters, pool.get_socket) while threads: for sock in socks: pool.maybe_return_socket(sock) socks = [] for t in list(threads): if t.sock is not None: socks.append(t.sock) t.join() threads.remove(t)