use of io.grpc.Status.Code in project grpc-java by grpc.
the class AbstractClientStream2Test method cancel_doNotAcceptOk.
@Test
public void cancel_doNotAcceptOk() {
for (Code code : Code.values()) {
ClientStreamListener listener = new NoopClientStreamListener();
AbstractClientStream2 stream = new BaseAbstractClientStream(allocator, statsTraceCtx);
stream.start(listener);
if (code != Code.OK) {
stream.cancel(Status.fromCodeValue(code.value()));
} else {
try {
stream.cancel(Status.fromCodeValue(code.value()));
fail();
} catch (IllegalArgumentException e) {
// ignore
}
}
}
}
use of io.grpc.Status.Code in project etcd-java by IBM.
the class EtcdClient method retryAuthRequest.
protected static boolean retryAuthRequest(Throwable error) {
Status status = Status.fromThrowable(error);
Code statusCode = status != null ? status.getCode() : null;
return statusCode == Code.UNAVAILABLE && GrpcClient.isConnectException(error);
}
use of io.grpc.Status.Code in project grpc-java by grpc.
the class AbstractClientStreamTest method cancel_doNotAcceptOk.
@Test
public void cancel_doNotAcceptOk() {
for (Code code : Code.values()) {
ClientStreamListener listener = new NoopClientStreamListener();
AbstractClientStream stream = new BaseAbstractClientStream(allocator, statsTraceCtx, transportTracer);
stream.start(listener);
if (code != Code.OK) {
stream.cancel(Status.fromCodeValue(code.value()));
} else {
try {
stream.cancel(Status.fromCodeValue(code.value()));
fail();
} catch (IllegalArgumentException e) {
// ignore
}
}
}
}
use of io.grpc.Status.Code in project grpc-java by grpc.
the class ClientXdsClient method parseRetryPolicy.
// Return null if we ignore the given policy.
@Nullable
private static StructOrError<RetryPolicy> parseRetryPolicy(io.envoyproxy.envoy.config.route.v3.RetryPolicy retryPolicyProto) {
int maxAttempts = 2;
if (retryPolicyProto.hasNumRetries()) {
maxAttempts = retryPolicyProto.getNumRetries().getValue() + 1;
}
Duration initialBackoff = Durations.fromMillis(25);
Duration maxBackoff = Durations.fromMillis(250);
if (retryPolicyProto.hasRetryBackOff()) {
RetryBackOff retryBackOff = retryPolicyProto.getRetryBackOff();
if (!retryBackOff.hasBaseInterval()) {
return StructOrError.fromError("No base_interval specified in retry_backoff");
}
Duration originalInitialBackoff = initialBackoff = retryBackOff.getBaseInterval();
if (Durations.compare(initialBackoff, Durations.ZERO) <= 0) {
return StructOrError.fromError("base_interval in retry_backoff must be positive");
}
if (Durations.compare(initialBackoff, Durations.fromMillis(1)) < 0) {
initialBackoff = Durations.fromMillis(1);
}
if (retryBackOff.hasMaxInterval()) {
maxBackoff = retryPolicyProto.getRetryBackOff().getMaxInterval();
if (Durations.compare(maxBackoff, originalInitialBackoff) < 0) {
return StructOrError.fromError("max_interval in retry_backoff cannot be less than base_interval");
}
if (Durations.compare(maxBackoff, Durations.fromMillis(1)) < 0) {
maxBackoff = Durations.fromMillis(1);
}
} else {
maxBackoff = Durations.fromNanos(Durations.toNanos(initialBackoff) * 10);
}
}
Iterable<String> retryOns = Splitter.on(',').omitEmptyStrings().trimResults().split(retryPolicyProto.getRetryOn());
ImmutableList.Builder<Code> retryableStatusCodesBuilder = ImmutableList.builder();
for (String retryOn : retryOns) {
Code code;
try {
code = Code.valueOf(retryOn.toUpperCase(Locale.US).replace('-', '_'));
} catch (IllegalArgumentException e) {
// unsupported value, such as "5xx"
continue;
}
if (!SUPPORTED_RETRYABLE_CODES.contains(code)) {
// unsupported value
continue;
}
retryableStatusCodesBuilder.add(code);
}
List<Code> retryableStatusCodes = retryableStatusCodesBuilder.build();
return StructOrError.fromStruct(RetryPolicy.create(maxAttempts, retryableStatusCodes, initialBackoff, maxBackoff, /* perAttemptRecvTimeout= */
null));
}
use of io.grpc.Status.Code in project grpc-java by grpc.
the class XdsNameResolver method generateServiceConfigWithMethodConfig.
@VisibleForTesting
static Map<String, ?> generateServiceConfigWithMethodConfig(@Nullable Long timeoutNano, @Nullable RetryPolicy retryPolicy) {
if (timeoutNano == null && (retryPolicy == null || retryPolicy.retryableStatusCodes().isEmpty())) {
return Collections.emptyMap();
}
ImmutableMap.Builder<String, Object> methodConfig = ImmutableMap.builder();
methodConfig.put("name", Collections.singletonList(Collections.emptyMap()));
if (retryPolicy != null && !retryPolicy.retryableStatusCodes().isEmpty()) {
ImmutableMap.Builder<String, Object> rawRetryPolicy = ImmutableMap.builder();
rawRetryPolicy.put("maxAttempts", (double) retryPolicy.maxAttempts());
rawRetryPolicy.put("initialBackoff", Durations.toString(retryPolicy.initialBackoff()));
rawRetryPolicy.put("maxBackoff", Durations.toString(retryPolicy.maxBackoff()));
rawRetryPolicy.put("backoffMultiplier", 2D);
List<String> codes = new ArrayList<>(retryPolicy.retryableStatusCodes().size());
for (Code code : retryPolicy.retryableStatusCodes()) {
codes.add(code.name());
}
rawRetryPolicy.put("retryableStatusCodes", Collections.unmodifiableList(codes));
if (retryPolicy.perAttemptRecvTimeout() != null) {
rawRetryPolicy.put("perAttemptRecvTimeout", Durations.toString(retryPolicy.perAttemptRecvTimeout()));
}
methodConfig.put("retryPolicy", rawRetryPolicy.build());
}
if (timeoutNano != null) {
String timeout = timeoutNano / 1_000_000_000.0 + "s";
methodConfig.put("timeout", timeout);
}
return Collections.singletonMap("methodConfig", Collections.singletonList(methodConfig.build()));
}
Aggregations