Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/io/qdrant/client/QdrantGrpcClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ private static ManagedChannel createChannel(
}

channelBuilder.userAgent(userAgent);
channelBuilder.intercept(new ResourceExhaustedInterceptor());

return channelBuilder.build();
}
Expand Down
49 changes: 49 additions & 0 deletions src/main/java/io/qdrant/client/ResourceExhaustedInterceptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.qdrant.client;

import io.grpc.*;

/** An Interceptor that handles Resource Exhausted errors */
public class ResourceExhaustedInterceptor implements ClientInterceptor {
/** Default constructor for {@link ResourceExhaustedInterceptor} */
public ResourceExhaustedInterceptor() {}

@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(
next.newCall(method, callOptions)) {

@Override
public void start(Listener<RespT> responseListener, Metadata headers) {
super.start(
new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(
responseListener) {
@Override
public void onClose(Status status, Metadata trailers) {
if (status.getCode() == Status.Code.RESOURCE_EXHAUSTED) {
String retryAfter =
trailers.get(
Metadata.Key.of("Retry-After", Metadata.ASCII_STRING_MARSHALLER));
if (retryAfter != null) {
try {
int retryAfterSeconds = Integer.parseInt(retryAfter);
status =
status.withCause(
new ResourceExhaustedResponse(
"Too many requests", retryAfterSeconds));
} catch (NumberFormatException e) {
throw new QdrantException(
"Retry-After header value is not a valid integer: " + retryAfter);
}
} else {
super.onClose(status, trailers);
}
}
super.onClose(status, trailers);
}
},
headers);
}
};
}
}
27 changes: 27 additions & 0 deletions src/main/java/io/qdrant/client/ResourceExhaustedResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.qdrant.client;

/** An exception indicating that rate limit is reached */
public class ResourceExhaustedResponse extends RuntimeException {
/** The number of seconds to wait before retrying */
private final int retryAfterSeconds;

/**
* Instantiates a new instance of {@link ResourceExhaustedResponse}
*
* @param message The message to display
* @param retryAfterSeconds The number of seconds to wait before retrying
*/
public ResourceExhaustedResponse(String message, int retryAfterSeconds) {
super(message);
this.retryAfterSeconds = retryAfterSeconds;
}

/**
* Gets the number of seconds to wait before retrying
*
* @return the number of seconds to wait before retrying
*/
public int getRetryAfterSeconds() {
return retryAfterSeconds;
}
}