Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
  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
Ejemplo n.º 4
0
    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