def test_auto_start_request(self): for bad_horrible_value in (None, 5, 'hi!'): self.assertRaises( (TypeError, ConfigurationError), lambda: self._get_client(auto_start_request=bad_horrible_value) ) client = self._get_client(auto_start_request=True) self.assertTrue(client.auto_start_request) pools = pools_from_rs_client(client) self.assertInRequestAndSameSock(client, pools) primary_pool = get_pool(client) # Trigger the RSC to actually start a request on primary pool client.pymongo_test.test.find_one() self.assertTrue(primary_pool.in_request()) # avoid a silly race in tokumx time.sleep(1) # Trigger the RSC to actually start a request on secondary pool cursor = client.pymongo_test.test.find( read_preference=ReadPreference.SECONDARY) try: cursor.next() except StopIteration: # No results, no problem pass secondary = cursor._Cursor__connection_id rs_state = client._MongoReplicaSetClient__rs_state secondary_pool = rs_state.get(secondary).pool self.assertTrue(secondary_pool.in_request()) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) for pool in pools: self.assertFalse(pool.in_request()) client.start_request() self.assertInRequestAndSameSock(client, pools) client.close() client = self._get_client() pools = pools_from_rs_client(client) self.assertNotInRequestAndDifferentSock(client, pools) client.start_request() self.assertInRequestAndSameSock(client, pools) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) client.close()
def test_auto_start_request(self): for bad_horrible_value in (None, 5, 'hi!'): self.assertRaises((TypeError, ConfigurationError), lambda: self._get_client(auto_start_request= bad_horrible_value)) client = self._get_client(auto_start_request=True) self.assertTrue(client.auto_start_request) pools = pools_from_rs_client(client) self.assertInRequestAndSameSock(client, pools) primary_pool = get_pool(client) # Trigger the RSC to actually start a request on primary pool client.pymongo_test.test.find_one() self.assertTrue(primary_pool.in_request()) # avoid a silly race in tokumx time.sleep(1) # Trigger the RSC to actually start a request on secondary pool cursor = client.pymongo_test.test.find( read_preference=ReadPreference.SECONDARY) try: cursor.next() except StopIteration: # No results, no problem pass secondary = cursor._Cursor__connection_id rs_state = client._MongoReplicaSetClient__rs_state secondary_pool = rs_state.get(secondary).pool self.assertTrue(secondary_pool.in_request()) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) for pool in pools: self.assertFalse(pool.in_request()) client.start_request() self.assertInRequestAndSameSock(client, pools) client.close() client = self._get_client() pools = pools_from_rs_client(client) self.assertNotInRequestAndDifferentSock(client, pools) client.start_request() self.assertInRequestAndSameSock(client, pools) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) client.close()
def test_nested_request(self): client = self._get_client(auto_start_request=True) try: pools = pools_from_rs_client(client) self.assertTrue(client.in_request()) # Start and end request - we're still in "outer" original request client.start_request() self.assertInRequestAndSameSock(client, pools) client.end_request() self.assertInRequestAndSameSock(client, pools) # Double-nesting client.start_request() client.start_request() self.assertEqual( 3, client._MongoReplicaSetClient__request_counter.get()) for pool in pools: # MRSC only called start_request() once per pool, although its # own counter is 2. self.assertEqual(1, pool._request_counter.get()) client.end_request() client.end_request() self.assertInRequestAndSameSock(client, pools) self.assertEqual( 1, client._MongoReplicaSetClient__request_counter.get()) for pool in pools: self.assertEqual(1, pool._request_counter.get()) # Finally, end original request client.end_request() for pool in pools: self.assertFalse(pool.in_request()) self.assertNotInRequestAndDifferentSock(client, pools) finally: client.close()
def test_request_threads(self): client = self._get_client() try: pools = pools_from_rs_client(client) self.assertNotInRequestAndDifferentSock(client, pools) started_request, ended_request = threading.Event( ), threading.Event() checked_request = threading.Event() thread_done = [False] # Starting a request in one thread doesn't put the other thread in a # request def f(): self.assertNotInRequestAndDifferentSock(client, pools) client.start_request() self.assertInRequestAndSameSock(client, pools) started_request.set() checked_request.wait() checked_request.clear() self.assertInRequestAndSameSock(client, pools) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) ended_request.set() checked_request.wait() thread_done[0] = True t = threading.Thread(target=f) t.setDaemon(True) t.start() started_request.wait() self.assertNotInRequestAndDifferentSock(client, pools) checked_request.set() ended_request.wait() self.assertNotInRequestAndDifferentSock(client, pools) checked_request.set() t.join() self.assertNotInRequestAndDifferentSock(client, pools) self.assertTrue(thread_done[0], "Thread didn't complete") finally: client.close()
def test_request_threads(self): client = self._get_client() try: pools = pools_from_rs_client(client) self.assertNotInRequestAndDifferentSock(client, pools) started_request, ended_request = threading.Event(), threading.Event() checked_request = threading.Event() thread_done = [False] # Starting a request in one thread doesn't put the other thread in a # request def f(): self.assertNotInRequestAndDifferentSock(client, pools) client.start_request() self.assertInRequestAndSameSock(client, pools) started_request.set() checked_request.wait() checked_request.clear() self.assertInRequestAndSameSock(client, pools) client.end_request() self.assertNotInRequestAndDifferentSock(client, pools) ended_request.set() checked_request.wait() thread_done[0] = True t = threading.Thread(target=f) t.setDaemon(True) t.start() started_request.wait() self.assertNotInRequestAndDifferentSock(client, pools) checked_request.set() ended_request.wait() self.assertNotInRequestAndDifferentSock(client, pools) checked_request.set() t.join() self.assertNotInRequestAndDifferentSock(client, pools) self.assertTrue(thread_done[0], "Thread didn't complete") finally: client.close()
def kill_sockets(): for pool in pools_from_rs_client(c): for socket_info in pool.sockets: socket_info.sock.close()