def test_sleep_before_retry(self): # Verifies bounds. Because it's using a pseudo-random number generator and # not a read random source, it's basically guaranteed to never return the # same value twice consecutively. a = net.calculate_sleep_before_retry(0, 0) b = net.calculate_sleep_before_retry(0, 0) self.assertTrue(a >= math.pow(1.5, -1), a) self.assertTrue(b >= math.pow(1.5, -1), b) self.assertTrue(a < 1.5 + math.pow(1.5, -1), a) self.assertTrue(b < 1.5 + math.pow(1.5, -1), b) self.assertNotEqual(a, b)
def call_unary(self, name, request): """Calls a method, waiting if the service is not available. Note that it stores the request of generator type into a list for future retries, so it is not memory-friendly for streaming requests of large size. Usage: proto_output = proxy.call_unary('MyMethod', proto_input) """ # If the request is a generator, store it to a list which can be reused in # retries. is_generator = False if isinstance(request, types.GeneratorType): request = list(request) is_generator = True for attempt in range(1, MAX_GRPC_ATTEMPTS+1): try: return self.call_no_retries(name, request if not is_generator else iter(request)) except grpc.RpcError as g: if g.code() is not grpc.StatusCode.UNAVAILABLE: raise logging.warning('%s: call_grpc - proxy is unavailable (attempt %d/%d)', self.name, attempt, MAX_GRPC_ATTEMPTS) # Save the error in case we need to return it grpc_error = g time.sleep(net.calculate_sleep_before_retry(attempt, MAX_GRPC_SLEEP)) # If we get here, it must be because we got (and saved) an error assert grpc_error is not None raise grpc_error
def call_unary(self, name, request): """Calls a method, waiting if the service is not available. Usage: proto_output = proxy.call_unary('MyMethod', proto_input) """ for attempt in range(1, MAX_GRPC_ATTEMPTS + 1): try: return self.call_no_retries(name, request) except grpc.RpcError as g: if g.code() is not grpc.StatusCode.UNAVAILABLE: raise logging.warning( '%s: call_grpc - proxy is unavailable (attempt %d/%d)', self.name, attempt, MAX_GRPC_ATTEMPTS) # Save the error in case we need to return it grpc_error = g time.sleep( net.calculate_sleep_before_retry(attempt, MAX_GRPC_SLEEP)) # If we get here, it must be because we got (and saved) an error assert grpc_error is not None raise grpc_error