Skip to content

Commit c8dc9fa

Browse files
authored
Timeouts overhaul (#81)
* timeouts overhaul * keyspace impl & tests * more tests & tweaks * fix timeout/sort bgus * refined WithTimeout types * createCollection custom timeout impl * more docs and stuff
1 parent 50361dd commit c8dc9fa

File tree

92 files changed

+1538
-569
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+1538
-569
lines changed

src/administration/astra-admin.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
// noinspection ExceptionCaughtLocallyJS
1515

1616
import {
17-
AdminSpawnOptions,
18-
AstraAdminBlockingOptions,
1917
AstraDatabaseConfig,
2018
CreateAstraDatabaseOptions,
2119
ListAstraDatabasesOptions,
@@ -31,9 +29,11 @@ import { parseAdminSpawnOpts } from '@/src/client/parsers/spawn-admin';
3129
import { InternalRootClientOpts } from '@/src/client/types/internal';
3230
import { buildAstraEndpoint } from '@/src/lib/utils';
3331
import { Logger } from '@/src/lib/logging/logger';
34-
import { DbSpawnOptions } from '@/src/client';
32+
import { AdminSpawnOptions, DbSpawnOptions } from '@/src/client';
3533
import { $CustomInspect } from '@/src/lib/constants';
3634
import { SomeDoc } from '@/src/documents';
35+
import { Timeouts } from '@/src/lib/api/timeouts';
36+
import { DropAstraDatabaseOptions } from '@/src/administration/types/admin/drop-database';
3737

3838
/**
3939
* An administrative class for managing Astra databases, including creating, listing, and deleting databases.
@@ -84,6 +84,7 @@ export class AstraAdmin {
8484
logging: Logger.advanceConfig(rootOpts.adminOptions.logging, adminOpts?.logging),
8585
additionalHeaders: { ...rootOpts.adminOptions.additionalHeaders, ...adminOpts?.additionalHeaders },
8686
astraEnv: adminOpts?.astraEnv ?? rootOpts.adminOptions.astraEnv,
87+
timeoutDefaults: Timeouts.merge(rootOpts.adminOptions.timeoutDefaults, adminOpts?.timeoutDefaults),
8788
},
8889
dbOptions: {
8990
...rootOpts.dbOptions,
@@ -101,6 +102,7 @@ export class AstraAdmin {
101102
userAgent: rootOpts.userAgent,
102103
tokenProvider: this.#defaultOpts.adminOptions.adminToken,
103104
additionalHeaders: this.#defaultOpts.adminOptions.additionalHeaders,
105+
timeoutDefaults: Timeouts.merge(rootOpts.adminOptions.timeoutDefaults, this.#defaultOpts.adminOptions.timeoutDefaults),
104106
});
105107

106108
Object.defineProperty(this, $CustomInspect, {
@@ -283,11 +285,13 @@ export class AstraAdmin {
283285
*
284286
* @returns A promise that resolves to the complete database information.
285287
*/
286-
public async dbInfo(id: string, options?: WithTimeout): Promise<AstraDbAdminInfo> {
288+
public async dbInfo(id: string, options?: WithTimeout<'databaseAdminTimeoutMs'>): Promise<AstraDbAdminInfo> {
289+
const tm = this.#httpClient.tm.single('databaseAdminTimeoutMs', options);
290+
287291
const resp = await this.#httpClient.request({
288292
method: HttpMethods.Get,
289293
path: `/databases/${id}`,
290-
}, options);
294+
}, tm);
291295

292296
return buildAstraDatabaseAdminInfo(resp.data!, this.#environment);
293297
}
@@ -337,11 +341,13 @@ export class AstraAdmin {
337341
params['starting_after'] = String(options.skip);
338342
}
339343

344+
const tm = this.#httpClient.tm.single('databaseAdminTimeoutMs', options);
345+
340346
const resp = await this.#httpClient.request({
341347
method: HttpMethods.Get,
342348
path: `/databases`,
343349
params: params,
344-
}, options);
350+
}, tm);
345351

346352
return resp.data!.map((d: SomeDoc) => buildAstraDatabaseAdminInfo(d, this.#environment));
347353
}
@@ -407,6 +413,8 @@ export class AstraAdmin {
407413
...config,
408414
};
409415

416+
const tm = this.#httpClient.tm.multipart('databaseAdminTimeoutMs', options);
417+
410418
const resp = await this.#httpClient.requestLongRunning({
411419
method: HttpMethods.Post,
412420
path: '/databases',
@@ -416,6 +424,7 @@ export class AstraAdmin {
416424
target: 'ACTIVE',
417425
legalStates: ['INITIALIZING', 'PENDING'],
418426
defaultPollInterval: 10000,
427+
timeoutManager: tm,
419428
options,
420429
});
421430

@@ -449,9 +458,11 @@ export class AstraAdmin {
449458
*
450459
* @remarks Use with caution. Wear a harness. Don't say I didn't warn you.
451460
*/
452-
public async dropDatabase(db: Db | string, options?: AstraAdminBlockingOptions): Promise<void> {
461+
public async dropDatabase(db: Db | string, options?: DropAstraDatabaseOptions): Promise<void> {
453462
const id = typeof db === 'string' ? db : db.id;
454463

464+
const tm = this.#httpClient.tm.multipart('databaseAdminTimeoutMs', options);
465+
455466
await this.#httpClient.requestLongRunning({
456467
method: HttpMethods.Post,
457468
path: `/databases/${id}/terminate`,
@@ -460,6 +471,7 @@ export class AstraAdmin {
460471
target: 'TERMINATED',
461472
legalStates: ['TERMINATING'],
462473
defaultPollInterval: 10000,
474+
timeoutManager: tm,
463475
options,
464476
});
465477
}

src/administration/astra-db-admin.ts

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,25 @@
1414
// noinspection ExceptionCaughtLocallyJS
1515

1616
import {
17-
AdminSpawnOptions,
18-
AstraAdminBlockingOptions,
1917
AstraCreateKeyspaceOptions,
18+
AstraDropKeyspaceOptions,
2019
} from '@/src/administration/types';
2120
import { DbAdmin } from '@/src/administration/db-admin';
22-
import { WithTimeout } from '@/src/lib/types';
21+
import type { WithTimeout } from '@/src/lib';
22+
import { StaticTokenProvider, TokenProvider } from '@/src/lib';
2323
import { buildAstraDatabaseAdminInfo, extractAstraEnvironment } from '@/src/administration/utils';
2424
import { FindEmbeddingProvidersResult } from '@/src/administration/types/db-admin/find-embedding-providers';
2525
import { DEFAULT_DEVOPS_API_ENDPOINTS, HttpMethods } from '@/src/lib/api/constants';
2626
import { DevOpsAPIHttpClient } from '@/src/lib/api/clients/devops-api-http-client';
2727
import { Db } from '@/src/db';
28-
import { StaticTokenProvider, TokenProvider } from '@/src/lib';
2928
import { isNullish } from '@/src/lib/utils';
3029
import { parseAdminSpawnOpts } from '@/src/client/parsers/spawn-admin';
3130
import { InternalRootClientOpts } from '@/src/client/types/internal';
3231
import { $CustomInspect } from '@/src/lib/constants';
3332
import { AstraDbAdminInfo } from '@/src/administration/types/admin/database-info';
3433
import { Logger } from '@/src/lib/logging/logger';
34+
import { TimeoutManager, Timeouts } from '@/src/lib/api/timeouts';
35+
import { AdminSpawnOptions } from '@/src/client';
3536

3637
/**
3738
* An administrative class for managing Astra databases, including creating, listing, and deleting keyspaces.
@@ -97,6 +98,7 @@ export class AstraDbAdmin extends DbAdmin {
9798
userAgent: rootOpts.userAgent,
9899
tokenProvider: adminToken,
99100
additionalHeaders: { ...rootOpts.adminOptions.additionalHeaders, ...adminOpts?.additionalHeaders },
101+
timeoutDefaults: Timeouts.merge(rootOpts.adminOptions.timeoutDefaults, adminOpts?.timeoutDefaults),
100102
});
101103

102104
this.#db = db;
@@ -152,8 +154,11 @@ export class AstraDbAdmin extends DbAdmin {
152154
*
153155
* @returns The available embedding providers.
154156
*/
155-
public override async findEmbeddingProviders(options?: WithTimeout): Promise<FindEmbeddingProvidersResult> {
156-
const resp = await this.#db.command({ findEmbeddingProviders: {} }, { keyspace: null, maxTimeMS: options?.maxTimeMS });
157+
public override async findEmbeddingProviders(options?: WithTimeout<'databaseAdminTimeoutMs'>): Promise<FindEmbeddingProvidersResult> {
158+
const resp = await this.#db._httpClient.executeCommand({ findEmbeddingProviders: {} }, {
159+
timeoutManager: this.#httpClient.tm.single('databaseAdminTimeoutMs', options),
160+
keyspace: null,
161+
});
157162
return resp.status as FindEmbeddingProvidersResult;
158163
}
159164

@@ -172,13 +177,9 @@ export class AstraDbAdmin extends DbAdmin {
172177
*
173178
* @returns A promise that resolves to the complete database information.
174179
*/
175-
public async info(options?: WithTimeout): Promise<AstraDbAdminInfo> {
176-
const resp = await this.#httpClient.request({
177-
method: HttpMethods.Get,
178-
path: `/databases/${this.#db.id}`,
179-
}, options);
180-
181-
return buildAstraDatabaseAdminInfo(resp.data!, this.#environment);
180+
public async info(options?: WithTimeout<'databaseAdminTimeoutMs'>): Promise<AstraDbAdminInfo> {
181+
const tm = this.#httpClient.tm.single('databaseAdminTimeoutMs', options);
182+
return this.#info(tm);
182183
}
183184

184185
/**
@@ -197,8 +198,9 @@ export class AstraDbAdmin extends DbAdmin {
197198
*
198199
* @returns A promise that resolves to list of all the keyspaces in the database.
199200
*/
200-
public override async listKeyspaces(options?: WithTimeout): Promise<string[]> {
201-
return this.info(options).then(i => i.keyspaces);
201+
public override async listKeyspaces(options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<string[]> {
202+
const tm = this.#httpClient.tm.single('keyspaceAdminTimeoutMs', options);
203+
return this.#info(tm).then(i => i.keyspaces);
202204
}
203205

204206
/**
@@ -236,6 +238,8 @@ export class AstraDbAdmin extends DbAdmin {
236238
this.#db.useKeyspace(keyspace);
237239
}
238240

241+
const tm = this.#httpClient.tm.multipart('keyspaceAdminTimeoutMs', options);
242+
239243
await this.#httpClient.requestLongRunning({
240244
method: HttpMethods.Post,
241245
path: `/databases/${this.#db.id}/keyspaces/${keyspace}`,
@@ -244,6 +248,7 @@ export class AstraDbAdmin extends DbAdmin {
244248
target: 'ACTIVE',
245249
legalStates: ['MAINTENANCE'],
246250
defaultPollInterval: 1000,
251+
timeoutManager: tm,
247252
options,
248253
});
249254
}
@@ -279,7 +284,9 @@ export class AstraDbAdmin extends DbAdmin {
279284
*
280285
* @returns A promise that resolves when the operation completes.
281286
*/
282-
public override async dropKeyspace(keyspace: string, options?: AstraAdminBlockingOptions): Promise<void> {
287+
public override async dropKeyspace(keyspace: string, options?: AstraDropKeyspaceOptions): Promise<void> {
288+
const tm = this.#httpClient.tm.multipart('keyspaceAdminTimeoutMs', options);
289+
283290
await this.#httpClient.requestLongRunning({
284291
method: HttpMethods.Delete,
285292
path: `/databases/${this.#db.id}/keyspaces/${keyspace}`,
@@ -288,6 +295,7 @@ export class AstraDbAdmin extends DbAdmin {
288295
target: 'ACTIVE',
289296
legalStates: ['MAINTENANCE'],
290297
defaultPollInterval: 1000,
298+
timeoutManager: tm,
291299
options,
292300
});
293301
}
@@ -313,7 +321,9 @@ export class AstraDbAdmin extends DbAdmin {
313321
*
314322
* @remarks Use with caution. Use a surge protector. Don't say I didn't warn you.
315323
*/
316-
public async drop(options?: AstraAdminBlockingOptions): Promise<void> {
324+
public async drop(options?: AstraDropKeyspaceOptions): Promise<void> {
325+
const tm = this.#httpClient.tm.multipart('databaseAdminTimeoutMs', options);
326+
317327
await this.#httpClient.requestLongRunning({
318328
method: HttpMethods.Post,
319329
path: `/databases/${this.#db.id}/terminate`,
@@ -322,11 +332,21 @@ export class AstraDbAdmin extends DbAdmin {
322332
target: 'TERMINATED',
323333
legalStates: ['TERMINATING'],
324334
defaultPollInterval: 10000,
335+
timeoutManager: tm,
325336
options,
326337
});
327338
}
328339

329340
public get _httpClient() {
330341
return this.#httpClient;
331342
}
343+
344+
async #info(tm: TimeoutManager): Promise<AstraDbAdminInfo> {
345+
const resp = await this.#httpClient.request({
346+
method: HttpMethods.Get,
347+
path: `/databases/${this.#db.id}`,
348+
}, tm);
349+
350+
return buildAstraDatabaseAdminInfo(resp.data!, this.#environment);
351+
}
332352
}

src/administration/data-api-db-admin.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
// limitations under the License.
1414
// noinspection ExceptionCaughtLocallyJS
1515

16-
import { AdminSpawnOptions, LocalCreateKeyspaceOptions } from '@/src/administration/types';
16+
import { LocalCreateKeyspaceOptions } from '@/src/administration/types';
1717
import { DbAdmin } from '@/src/administration/db-admin';
18-
import { WithTimeout } from '@/src/lib/types';
18+
import type { WithTimeout } from '@/src/lib';
1919
import { FindEmbeddingProvidersResult } from '@/src/administration/types/db-admin/find-embedding-providers';
2020
import { DataAPIHttpClient } from '@/src/lib/api/clients/data-api-http-client';
2121
import { Db } from '@/src/db';
2222
import { parseAdminSpawnOpts } from '@/src/client/parsers/spawn-admin';
2323
import { $CustomInspect } from '@/src/lib/constants';
24+
import { AdminSpawnOptions } from '@/src/client';
2425

2526
/**
2627
* An administrative class for managing non-Astra databases, including creating, listing, and deleting keyspaces.
@@ -112,8 +113,11 @@ export class DataAPIDbAdmin extends DbAdmin {
112113
*
113114
* @returns The available embedding providers.
114115
*/
115-
public override async findEmbeddingProviders(options?: WithTimeout): Promise<FindEmbeddingProvidersResult> {
116-
const resp = await this.#httpClient.executeCommand({ findEmbeddingProviders: {} }, { keyspace: null, maxTimeMS: options?.maxTimeMS });
116+
public override async findEmbeddingProviders(options?: WithTimeout<'databaseAdminTimeoutMs'>): Promise<FindEmbeddingProvidersResult> {
117+
const resp = await this.#httpClient.executeCommand({ findEmbeddingProviders: {} }, {
118+
timeoutManager: this.#httpClient.tm.single('databaseAdminTimeoutMs', options),
119+
keyspace: null,
120+
});
117121
return resp.status as FindEmbeddingProvidersResult;
118122
}
119123

@@ -133,8 +137,11 @@ export class DataAPIDbAdmin extends DbAdmin {
133137
*
134138
* @returns A promise that resolves to list of all the keyspaces in the database.
135139
*/
136-
public override async listKeyspaces(options?: WithTimeout): Promise<string[]> {
137-
const resp = await this.#httpClient.executeCommand({ findKeyspaces: {} }, { maxTimeMS: options?.maxTimeMS, keyspace: null });
140+
public override async listKeyspaces(options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<string[]> {
141+
const resp = await this.#httpClient.executeCommand({ findKeyspaces: {} }, {
142+
timeoutManager: this.#httpClient.tm.single('keyspaceAdminTimeoutMs', options),
143+
keyspace: null,
144+
});
138145
return resp.status!.keyspaces;
139146
}
140147

@@ -178,7 +185,10 @@ export class DataAPIDbAdmin extends DbAdmin {
178185
replicationFactor: 1,
179186
};
180187

181-
await this.#httpClient.executeCommand({ createKeyspace: { name: keyspace, options: { replication } } }, { maxTimeMS: options?.maxTimeMS, keyspace: null });
188+
await this.#httpClient.executeCommand({ createKeyspace: { name: keyspace, options: { replication } } }, {
189+
timeoutManager: this.#httpClient.tm.single('keyspaceAdminTimeoutMs', options),
190+
keyspace: null,
191+
});
182192
}
183193

184194
/**
@@ -202,8 +212,11 @@ export class DataAPIDbAdmin extends DbAdmin {
202212
*
203213
* @returns A promise that resolves when the operation completes.
204214
*/
205-
public override async dropKeyspace(keyspace: string, options?: WithTimeout): Promise<void> {
206-
await this.#httpClient.executeCommand({ dropKeyspace: { name: keyspace } }, { maxTimeMS: options?.maxTimeMS, keyspace: null });
215+
public override async dropKeyspace(keyspace: string, options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<void> {
216+
await this.#httpClient.executeCommand({ dropKeyspace: { name: keyspace } }, {
217+
timeoutManager: this.#httpClient.tm.single('keyspaceAdminTimeoutMs', options),
218+
keyspace: null,
219+
});
207220
}
208221

209222
public get _httpClient() {

src/administration/db-admin.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export abstract class DbAdmin {
6363
*
6464
* @returns The available embedding providers.
6565
*/
66-
abstract findEmbeddingProviders(options?: WithTimeout): Promise<FindEmbeddingProvidersResult>;
66+
abstract findEmbeddingProviders(options?: WithTimeout<'databaseAdminTimeoutMs'>): Promise<FindEmbeddingProvidersResult>;
6767
/**
6868
* Retrieves a list of all the keyspaces in the database.
6969
*
@@ -80,7 +80,7 @@ export abstract class DbAdmin {
8080
*
8181
* @returns A promise that resolves to list of all the keyspaces in the database.
8282
*/
83-
abstract listKeyspaces(): Promise<string[]>;
83+
abstract listKeyspaces(options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<string[]>;
8484
/**
8585
* Creates a new, additional, keyspace for this database.
8686
*
@@ -111,7 +111,7 @@ export abstract class DbAdmin {
111111
*
112112
* @returns A promise that resolves when the operation completes.
113113
*/
114-
abstract createKeyspace(keyspace: string, options?: WithTimeout): Promise<void>;
114+
abstract createKeyspace(keyspace: string, options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<void>;
115115
/**
116116
* Drops a keyspace from this database.
117117
*
@@ -143,5 +143,5 @@ export abstract class DbAdmin {
143143
*
144144
* @returns A promise that resolves when the operation completes.
145145
*/
146-
abstract dropKeyspace(keyspace: string, options?: WithTimeout): Promise<void>;
146+
abstract dropKeyspace(keyspace: string, options?: WithTimeout<'keyspaceAdminTimeoutMs'>): Promise<void>;
147147
}

0 commit comments

Comments
 (0)