Skip to content

Commit b36d1fb

Browse files
authored
Merge pull request #217 from weaviate/grpc/add-retry-middleware-for-unavailable
Use `nice-grpc-client-middleware-retry` for auto-retry of UNAVAILABLE grpc error
2 parents 39b876f + 90e1a9f commit b36d1fb

File tree

8 files changed

+249
-151
lines changed

8 files changed

+249
-151
lines changed

package-lock.json

Lines changed: 218 additions & 142 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"graphql-request": "^6.1.0",
5656
"long": "^5.2.3",
5757
"nice-grpc": "^2.1.9",
58-
"nice-grpc-client-middleware-deadline": "^2.0.12",
58+
"nice-grpc-client-middleware-retry": "^3.1.9",
5959
"uuid": "^9.0.1"
6060
},
6161
"devDependencies": {

src/connection/grpc.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { InternalConnectionParams } from './http.js';
66
import { ConsistencyLevel } from '../data/index.js';
77

88
import { ChannelCredentials, ChannelOptions, createChannel, createClientFactory, Metadata } from 'nice-grpc';
9-
import { deadlineMiddleware } from 'nice-grpc-client-middleware-deadline';
9+
import { retryMiddleware } from 'nice-grpc-client-middleware-retry';
1010

1111
import { HealthCheckResponse_ServingStatus, HealthDefinition } from '../proto/google/health/v1/health.js';
1212
import { WeaviateDefinition } from '../proto/v1/weaviate.js';
@@ -23,7 +23,7 @@ export interface GrpcConnectionParams extends InternalConnectionParams {
2323
grpcSecure: boolean;
2424
}
2525

26-
const clientFactory = createClientFactory().use(deadlineMiddleware);
26+
const clientFactory = createClientFactory().use(retryMiddleware);
2727

2828
const MAX_GRPC_MESSAGE_LENGTH = 104858000; // 10mb, needs to be synchronized with GRPC server
2929

src/grpc/base.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@ import { isAbortError } from 'abort-controller-x';
22
import { ConsistencyLevel } from '../data/index.js';
33

44
import { Metadata } from 'nice-grpc';
5+
import { RetryOptions } from 'nice-grpc-client-middleware-retry';
56
import { WeaviateRequestTimeoutError } from '../errors.js';
67
import { ConsistencyLevel as ConsistencyLevelGRPC } from '../proto/v1/base.js';
78
import { WeaviateClient } from '../proto/v1/weaviate.js';
89

910
export default class Base {
10-
protected connection: WeaviateClient;
11+
protected connection: WeaviateClient<RetryOptions>;
1112
protected collection: string;
1213
protected timeout: number;
1314
protected consistencyLevel?: ConsistencyLevelGRPC;
1415
protected tenant?: string;
1516
protected metadata?: Metadata;
1617

1718
protected constructor(
18-
connection: WeaviateClient,
19+
connection: WeaviateClient<RetryOptions>,
1920
collection: string,
2021
metadata: Metadata,
2122
timeout: number,

src/grpc/batcher.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ import { ConsistencyLevel } from '../data/index.js';
55
import { BatchObject, BatchObjectsReply, BatchObjectsRequest } from '../proto/v1/batch.js';
66
import { WeaviateClient } from '../proto/v1/weaviate.js';
77

8+
import { RetryOptions } from 'nice-grpc-client-middleware-retry';
89
import { WeaviateBatchError, WeaviateDeleteManyError } from '../errors.js';
910
import { Filters } from '../proto/v1/base.js';
1011
import { BatchDeleteReply, BatchDeleteRequest } from '../proto/v1/batch_delete.js';
1112
import Base from './base.js';
1213

14+
import { retryOptions } from './retry.js';
15+
1316
export interface Batch {
1417
withDelete: (args: BatchDeleteArgs) => Promise<BatchDeleteReply>;
1518
withObjects: (args: BatchObjectsArgs) => Promise<BatchObjectsReply>;
@@ -27,7 +30,7 @@ export interface BatchDeleteArgs {
2730

2831
export default class Batcher extends Base implements Batch {
2932
public static use(
30-
connection: WeaviateClient,
33+
connection: WeaviateClient<RetryOptions>,
3134
collection: string,
3235
metadata: Metadata,
3336
timeout: number,
@@ -70,6 +73,7 @@ export default class Batcher extends Base implements Batch {
7073
{
7174
metadata: this.metadata,
7275
signal,
76+
...retryOptions,
7377
}
7478
)
7579
.catch((err) => {

src/grpc/retry.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { ClientError, Status } from 'nice-grpc';
2+
import { RetryOptions } from 'nice-grpc-client-middleware-retry';
3+
4+
export const retryOptions: RetryOptions = {
5+
retry: true,
6+
retryMaxAttempts: 5,
7+
retryableStatuses: [Status.UNAVAILABLE],
8+
onRetryableError(error: ClientError, attempt: number, delayMs: number) {
9+
console.warn(error, `Attempt ${attempt} failed. Retrying in ${delayMs}ms.`);
10+
},
11+
};

src/grpc/searcher.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import {
2424
} from '../proto/v1/search_get.js';
2525
import { WeaviateClient } from '../proto/v1/weaviate.js';
2626

27+
import { RetryOptions } from 'nice-grpc-client-middleware-retry';
2728
import { WeaviateQueryError } from '../errors.js';
2829
import { GenerativeSearch } from '../proto/v1/generative.js';
2930
import Base from './base.js';
31+
import { retryOptions } from './retry.js';
3032

3133
export type SearchFetchArgs = {
3234
limit?: number;
@@ -113,7 +115,7 @@ export interface Search {
113115

114116
export default class Searcher extends Base implements Search {
115117
public static use(
116-
connection: WeaviateClient,
118+
connection: WeaviateClient<RetryOptions>,
117119
collection: string,
118120
metadata: Metadata,
119121
timeout: number,
@@ -151,6 +153,7 @@ export default class Searcher extends Base implements Search {
151153
{
152154
metadata: this.metadata,
153155
signal,
156+
...retryOptions,
154157
}
155158
)
156159
.catch((err) => {

src/grpc/tenantsManager.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { Metadata } from 'nice-grpc';
2+
import { RetryOptions } from 'nice-grpc-client-middleware-retry';
23
import { TenantsGetReply, TenantsGetRequest } from '../proto/v1/tenants.js';
34
import { WeaviateClient } from '../proto/v1/weaviate.js';
45
import Base from './base.js';
6+
import { retryOptions } from './retry.js';
57

68
export type TenantsGetArgs = {
79
names?: string[];
@@ -11,9 +13,9 @@ export interface Tenants {
1113
withGet: (args: TenantsGetArgs) => Promise<TenantsGetReply>;
1214
}
1315

14-
export default class TenantsManager extends Base implements TenantsManager {
16+
export default class TenantsManager extends Base implements Tenants {
1517
public static use(
16-
connection: WeaviateClient,
18+
connection: WeaviateClient<RetryOptions>,
1719
collection: string,
1820
metadata: Metadata,
1921
timeout: number
@@ -34,6 +36,7 @@ export default class TenantsManager extends Base implements TenantsManager {
3436
{
3537
metadata: this.metadata,
3638
signal,
39+
...retryOptions,
3740
}
3841
)
3942
);

0 commit comments

Comments
 (0)