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 test_wait_queue_timeout(self):
     wait_queue_timeout = 2  # Seconds
     pool = self.get_pool_with_wait_queue_timeout(wait_queue_timeout)
     pool.get_socket()
     start = time.time()
     self.assertRaises(ConnectionFailure, pool.get_socket)
     duration = time.time() - start
     self.assertTrue(
         abs(wait_queue_timeout - duration) < 1,
         "Waited %.2f seconds for a socket, expected %f" %
         (duration, wait_queue_timeout))
 def test_wait_queue_timeout(self):
     wait_queue_timeout = 2  # Seconds
     pool = self.get_pool_with_wait_queue_timeout(wait_queue_timeout)
     pool.get_socket()
     start = time.time()
     self.assertRaises(ConnectionFailure, pool.get_socket)
     duration = time.time() - start
     self.assertTrue(
         abs(wait_queue_timeout - duration) < 1,
         "Waited %.2f seconds for a socket, expected %f" % (
             duration, wait_queue_timeout))
 def test_over_max_times_out(self):
     conn_timeout = 2
     pool = self.get_pool(conn_timeout, conn_timeout + 5, conn_timeout)
     s1 = pool.get_socket()
     self.assertTrue(None is not s1)
     s2 = pool.get_socket()
     self.assertTrue(None is not s2)
     self.assertNotEqual(s1, s2)
     start = time.time()
     self.assertRaises(socket.timeout, pool.get_socket)
     end = time.time()
     self.assertTrue(end - start > conn_timeout)
     self.assertTrue(end - start < conn_timeout + 5)
    def test_wait_queue_multiple(self):
        pool = self.get_pool_with_wait_queue_multiple(3)

        # Reach max_size sockets.
        pool.get_socket()
        pool.get_socket()

        # Reach max_size * wait_queue_multiple waiters.
        threads = []
        for _ in xrange(6):
            t = SocketGetter(self, pool)
            t.start()
            threads.append(t)

        self.sleep(1)
        for t in threads:
            self.assertEqual(t.state, 'get_socket')

        self.assertRaises(ExceededMaxWaiters, pool.get_socket)
    def test_wait_queue_multiple(self):
        pool = self.get_pool_with_wait_queue_multiple(3)

        # Reach max_size sockets.
        pool.get_socket()
        pool.get_socket()

        # Reach max_size * wait_queue_multiple waiters.
        threads = []
        for _ in xrange(6):
            t = SocketGetter(self, pool)
            t.start()
            threads.append(t)

        self.sleep(1)
        for t in threads:
            self.assertEqual(t.state, 'get_socket')

        self.assertRaises(ExceededMaxWaiters, pool.get_socket)
    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.return_socket(sock_info)
        return response, pool
    def __socket(self, mongo):
        """Get a SocketInfo from the pool.
        """
        pool = mongo['pool']
        if self.__auto_start_request:
            # No effect if a request already started
            self.start_request()

        sock_info = pool.get_socket()

        if self.__auth_credentials:
            self.__check_auth(sock_info)
        return sock_info
    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.return_socket(sock_info)
        return response, pool
Esempio n. 10
0
    def __socket(self, mongo):
        """Get a SocketInfo from the pool.
        """
        pool = mongo['pool']
        if self.__auto_start_request:
            # No effect if a request already started
            self.start_request()

        sock_info = pool.get_socket()

        if self.__auth_credentials:
            self.__check_auth(sock_info)
        return sock_info
 def test_wait_queue_multiple_unset(self):
     pool = self.get_pool_with_wait_queue_multiple(None)
     socks = []
     for _ in xrange(2):
         sock = pool.get_socket()
         socks.append(sock)
     threads = []
     for _ in xrange(30):
         t = SocketGetter(self, pool)
         t.start()
         threads.append(t)
     self.sleep(1)
     for t in threads:
         self.assertEqual(t.state, 'get_socket')
 def test_wait_queue_multiple_unset(self):
     pool = self.get_pool_with_wait_queue_multiple(None)
     socks = []
     for _ in xrange(2):
         sock = pool.get_socket()
         socks.append(sock)
     threads = []
     for _ in xrange(30):
         t = SocketGetter(self, pool)
         t.start()
         threads.append(t)
     self.sleep(1)
     for t in threads:
         self.assertEqual(t.state, 'get_socket')
    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)