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)
Example #2
0
    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_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)