better-auth-elasticsearch 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -9
- package/dist/elasticsearch-adapter.d.ts +11 -0
- package/dist/elasticsearch-adapter.d.ts.map +1 -1
- package/dist/elasticsearch-adapter.js +265 -113
- package/dist/elasticsearch-adapter.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/migrate.d.ts +11 -0
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +4 -0
- package/dist/migrate.js.map +1 -1
- package/dist/unique-reservations.d.ts +123 -0
- package/dist/unique-reservations.d.ts.map +1 -0
- package/dist/unique-reservations.js +662 -0
- package/dist/unique-reservations.js.map +1 -0
- package/package.json +2 -2
- package/src/elasticsearch-adapter.ts +338 -124
- package/src/index.ts +1 -0
- package/src/migrate.ts +11 -0
- package/src/unique-reservations.ts +912 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unique-reservations.js","sourceRoot":"","sources":["../src/unique-reservations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-auth-elasticsearch",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Elasticsearch database adapter for Better Auth",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"better-auth",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.es8.json --noEmit",
|
|
61
61
|
"test": "vitest run",
|
|
62
62
|
"test:watch": "vitest",
|
|
63
|
-
"test:integration": "BETTER_AUTH_FORCE_ELASTIC_TESTS=true vitest run test/elasticsearch-adapter.test.mjs test/mappings.test.mjs test/migrate.test.mjs test/purge.test.mjs",
|
|
63
|
+
"test:integration": "BETTER_AUTH_FORCE_ELASTIC_TESTS=true vitest run test/elasticsearch-adapter.test.mjs test/mappings.test.mjs test/migrate.test.mjs test/purge.test.mjs test/unique-reservations.test.mjs",
|
|
64
64
|
"lint": "biome check .",
|
|
65
65
|
"lint:fix": "biome check . --write",
|
|
66
66
|
"format": "biome format . --write",
|
|
@@ -25,6 +25,11 @@ import {
|
|
|
25
25
|
migrateAliasedIndex,
|
|
26
26
|
} from "./index-layout.js";
|
|
27
27
|
import { MIGRATOR, type MigratedModel, type Migrator } from "./migrate.js";
|
|
28
|
+
import {
|
|
29
|
+
type DuplicateValues,
|
|
30
|
+
createReservations,
|
|
31
|
+
duplicateError,
|
|
32
|
+
} from "./unique-reservations.js";
|
|
28
33
|
import { whereToQuery } from "./where-to-query.js";
|
|
29
34
|
|
|
30
35
|
type Primitive = string | number | boolean | Date | null;
|
|
@@ -67,6 +72,17 @@ export interface ElasticsearchAdapterConfig {
|
|
|
67
72
|
numberOfShards?: number;
|
|
68
73
|
/** Replicas of each index the adapter creates (default 0). */
|
|
69
74
|
numberOfReplicas?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Unique fields left unenforced, as `"model.field"` in better-auth schema
|
|
77
|
+
* names, or `"model.fieldA+fieldB"` for a unique index over several fields,
|
|
78
|
+
* in index order (default `["session.token"]`: the token is random, and
|
|
79
|
+
* reserving it would slow every sign-in). A list given here replaces the
|
|
80
|
+
* default, so include `"session.token"` to keep skipping it. Every other
|
|
81
|
+
* field the schema declares unique, and every unique index, gets a
|
|
82
|
+
* reservation per value, which costs an extra request per write that sets
|
|
83
|
+
* or frees one.
|
|
84
|
+
*/
|
|
85
|
+
skipUniqueFor?: string[];
|
|
70
86
|
}
|
|
71
87
|
|
|
72
88
|
/**
|
|
@@ -157,6 +173,15 @@ export const elasticsearchAdapter = (
|
|
|
157
173
|
const whileMigrating = <T>(index: string, operation: () => Promise<T>) =>
|
|
158
174
|
waitOutWriteBlock(writeBlockTimeoutMs, index, operation);
|
|
159
175
|
|
|
176
|
+
const reservations = createReservations({
|
|
177
|
+
client,
|
|
178
|
+
schema,
|
|
179
|
+
getDefaultModelName,
|
|
180
|
+
skipUniqueFor: config.skipUniqueFor ?? ["session.token"],
|
|
181
|
+
settings: indexSettings,
|
|
182
|
+
withRetry,
|
|
183
|
+
});
|
|
184
|
+
|
|
160
185
|
// Elasticsearch index and alias names must be lowercase.
|
|
161
186
|
const indexForModel = (model: string) =>
|
|
162
187
|
(prefix ? `${prefix}_${model}` : model).toLowerCase();
|
|
@@ -214,7 +239,18 @@ export const elasticsearchAdapter = (
|
|
|
214
239
|
entry.fromDeleted = true;
|
|
215
240
|
}
|
|
216
241
|
}
|
|
217
|
-
|
|
242
|
+
// Every run, so rows written before their model had reservations, or
|
|
243
|
+
// while a field was in `skipUniqueFor`, get them.
|
|
244
|
+
const duplicates: DuplicateValues[] = [];
|
|
245
|
+
for (const [model, table] of Object.entries(schema)) {
|
|
246
|
+
duplicates.push(
|
|
247
|
+
...(await reservations.backfill(
|
|
248
|
+
model,
|
|
249
|
+
indexForModel(table.modelName),
|
|
250
|
+
)),
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
return { migrated, duplicates };
|
|
218
254
|
};
|
|
219
255
|
|
|
220
256
|
/**
|
|
@@ -315,6 +351,140 @@ export const elasticsearchAdapter = (
|
|
|
315
351
|
};
|
|
316
352
|
};
|
|
317
353
|
|
|
354
|
+
/**
|
|
355
|
+
* Writes every row matching `query` with `writePage`, a page of rows at
|
|
356
|
+
* a time, and returns how many it wrote. `writePage` sends one bulk
|
|
357
|
+
* request whose writes are conditional on each row being unchanged
|
|
358
|
+
* since the search, and returns its items in the order of the rows.
|
|
359
|
+
*
|
|
360
|
+
* Not a by-query write: that skips rows that change under it, and since
|
|
361
|
+
* updated rows usually still match, a rerun cannot tell the skipped
|
|
362
|
+
* rows from the ones it already updated. Instead only the rows that lost
|
|
363
|
+
* that race are searched for again, so every row is written and counted
|
|
364
|
+
* once. A row whose write Elasticsearch rejected under load, or refused
|
|
365
|
+
* while migrate() moves the index, was not written and goes again the
|
|
366
|
+
* same way.
|
|
367
|
+
*/
|
|
368
|
+
const writeMatchingRows = async ({
|
|
369
|
+
model,
|
|
370
|
+
index,
|
|
371
|
+
query,
|
|
372
|
+
operation,
|
|
373
|
+
source,
|
|
374
|
+
writePage,
|
|
375
|
+
}: {
|
|
376
|
+
model: string;
|
|
377
|
+
index: string;
|
|
378
|
+
query: object;
|
|
379
|
+
operation: "updateMany" | "deleteMany";
|
|
380
|
+
/** The stored fields `writePage` needs, or false for none. */
|
|
381
|
+
source: string[] | false;
|
|
382
|
+
writePage: (
|
|
383
|
+
hits: estypes.SearchHit<SourceDoc>[],
|
|
384
|
+
) => Promise<(estypes.BulkResponseItem | undefined)[]>;
|
|
385
|
+
}) => {
|
|
386
|
+
const [writing, written] =
|
|
387
|
+
operation === "updateMany"
|
|
388
|
+
? ["updating", "updated"]
|
|
389
|
+
: ["deleting", "deleted"];
|
|
390
|
+
let count = 0;
|
|
391
|
+
let retryIds: string[] | undefined;
|
|
392
|
+
// Passes that waited out a write block do not count towards
|
|
393
|
+
// MAX_MANY_PASSES; the write block timeout bounds them instead.
|
|
394
|
+
const pauseWhileBlocked = writeBlockWaiter(writeBlockTimeoutMs, index);
|
|
395
|
+
let pass = 0;
|
|
396
|
+
while (pass < MAX_MANY_PASSES) {
|
|
397
|
+
const passQuery = retryIds
|
|
398
|
+
? { bool: { filter: [query, { ids: { values: retryIds } }] } }
|
|
399
|
+
: query;
|
|
400
|
+
const unwrittenIds: string[] = [];
|
|
401
|
+
let rejected = false;
|
|
402
|
+
let blockedBy: unknown;
|
|
403
|
+
|
|
404
|
+
// Paging by id needs no point in time: ids are unique and never
|
|
405
|
+
// change, so no row is read twice, and a row that changes on a
|
|
406
|
+
// later page is read as changed.
|
|
407
|
+
let searchAfter: estypes.SortResults | undefined;
|
|
408
|
+
while (true) {
|
|
409
|
+
const page = await withRetry(() =>
|
|
410
|
+
client.search<SourceDoc>({
|
|
411
|
+
index,
|
|
412
|
+
query: passQuery,
|
|
413
|
+
size: UPDATE_MANY_PAGE_SIZE,
|
|
414
|
+
sort: [{ id: "asc" }],
|
|
415
|
+
search_after: searchAfter,
|
|
416
|
+
_source: source,
|
|
417
|
+
seq_no_primary_term: true,
|
|
418
|
+
track_total_hits: false,
|
|
419
|
+
}),
|
|
420
|
+
);
|
|
421
|
+
const hits = page.hits.hits;
|
|
422
|
+
if (hits.length === 0) break;
|
|
423
|
+
searchAfter = hits[hits.length - 1]?.sort;
|
|
424
|
+
|
|
425
|
+
// Not retried, like the other conditional writes. Each row is
|
|
426
|
+
// written to the index it was read from, as in `findVersioned`.
|
|
427
|
+
for (const outcome of await writePage(hits)) {
|
|
428
|
+
if (isWriteBlocked(outcome) && outcome?._id) {
|
|
429
|
+
unwrittenIds.push(outcome._id);
|
|
430
|
+
blockedBy = outcome.error;
|
|
431
|
+
} else if (
|
|
432
|
+
(outcome?.status === 409 || outcome?.status === 429) &&
|
|
433
|
+
outcome._id
|
|
434
|
+
) {
|
|
435
|
+
unwrittenIds.push(outcome._id);
|
|
436
|
+
rejected ||= outcome.status === 429;
|
|
437
|
+
} else if (outcome?.status === 404) {
|
|
438
|
+
// Another request deleted the row.
|
|
439
|
+
} else if (!outcome || outcome.error) {
|
|
440
|
+
throw new Error(
|
|
441
|
+
`${operation} on "${model}" failed after ${writing} ${count} rows: ${outcome?.error?.reason ?? outcome?.error?.type ?? "unexpected bulk response"}`,
|
|
442
|
+
);
|
|
443
|
+
} else {
|
|
444
|
+
count++;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (hits.length < UPDATE_MANY_PAGE_SIZE) break;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (unwrittenIds.length === 0) return count;
|
|
451
|
+
retryIds = unwrittenIds;
|
|
452
|
+
// Make the writes that won searchable, so the next pass sees
|
|
453
|
+
// whether those rows still match and what to condition on. Even
|
|
454
|
+
// with "immediate" refresh a winner may not have refreshed yet.
|
|
455
|
+
await withRetry(() => client.indices.refresh({ index }));
|
|
456
|
+
if (blockedBy) {
|
|
457
|
+
await pauseWhileBlocked(
|
|
458
|
+
blockedBy,
|
|
459
|
+
`${operation} on "${model}" had ${written} ${count} rows.`,
|
|
460
|
+
);
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
// Give an overloaded cluster a growing, jittered while to drain.
|
|
464
|
+
if (rejected) await wait((0.5 + Math.random()) * 50 * 2 ** pass);
|
|
465
|
+
pass++;
|
|
466
|
+
}
|
|
467
|
+
throw new Error(
|
|
468
|
+
`${operation} on "${model}" ${written} ${count} rows, but the remaining matching rows could not be written in ${MAX_MANY_PASSES} passes: other requests kept changing them or Elasticsearch kept rejecting the writes`,
|
|
469
|
+
);
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
/** The conditional bulk action that writes `hit` where it was read. */
|
|
473
|
+
const ifUnchanged = (hit: estypes.SearchHit<SourceDoc>) => ({
|
|
474
|
+
_index: hit._index,
|
|
475
|
+
_id: hit._id,
|
|
476
|
+
if_seq_no: hit._seq_no,
|
|
477
|
+
if_primary_term: hit._primary_term,
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
/** The ids of the rows whose bulk item says they were written. */
|
|
481
|
+
const writtenIds = (outcomes: (estypes.BulkResponseItem | undefined)[]) =>
|
|
482
|
+
outcomes.flatMap((outcome) =>
|
|
483
|
+
outcome?._id && !outcome.error && outcome.status < 300
|
|
484
|
+
? [outcome._id]
|
|
485
|
+
: [],
|
|
486
|
+
);
|
|
487
|
+
|
|
318
488
|
return {
|
|
319
489
|
options: { [MIGRATOR]: migrator },
|
|
320
490
|
createSchema,
|
|
@@ -344,6 +514,9 @@ export const elasticsearchAdapter = (
|
|
|
344
514
|
...row.ifUnchanged,
|
|
345
515
|
refresh,
|
|
346
516
|
});
|
|
517
|
+
await reservations.release(model, index, [
|
|
518
|
+
{ id: row.id, source: row.source },
|
|
519
|
+
]);
|
|
347
520
|
return normalizeHit({
|
|
348
521
|
_id: row.id,
|
|
349
522
|
_source: row.source,
|
|
@@ -378,6 +551,14 @@ export const elasticsearchAdapter = (
|
|
|
378
551
|
increment: Record<string, number>;
|
|
379
552
|
set?: Record<string, unknown>;
|
|
380
553
|
}) => {
|
|
554
|
+
// Claiming a value needs the row's current one, which the scripted
|
|
555
|
+
// update never reads back before it writes.
|
|
556
|
+
const unique = set && reservations.constrainedFieldIn(model, set);
|
|
557
|
+
if (unique) {
|
|
558
|
+
throw new Error(
|
|
559
|
+
`incrementOne cannot set "${unique}" on "${model}", as it is a unique field; use update instead.`,
|
|
560
|
+
);
|
|
561
|
+
}
|
|
381
562
|
const index = await ensureAlias(model);
|
|
382
563
|
const query = queryFor(model, where);
|
|
383
564
|
const params = { increment, set: set ?? {} };
|
|
@@ -440,17 +621,49 @@ export const elasticsearchAdapter = (
|
|
|
440
621
|
id,
|
|
441
622
|
};
|
|
442
623
|
|
|
624
|
+
const write = () =>
|
|
625
|
+
withRetry(() =>
|
|
626
|
+
client.index({
|
|
627
|
+
index,
|
|
628
|
+
id,
|
|
629
|
+
op_type: "create",
|
|
630
|
+
refresh,
|
|
631
|
+
document: source,
|
|
632
|
+
}),
|
|
633
|
+
);
|
|
634
|
+
const values = reservations.valuesOf(model, source);
|
|
635
|
+
const claims =
|
|
636
|
+
values.length > 0 ? reservations.claims(model, index) : undefined;
|
|
637
|
+
|
|
443
638
|
try {
|
|
444
|
-
await whileMigrating(
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
639
|
+
await whileMigrating<unknown>(
|
|
640
|
+
index,
|
|
641
|
+
claims
|
|
642
|
+
? async () => {
|
|
643
|
+
// Claimed again on a rerun, which re-stamps the claims.
|
|
644
|
+
await claims.claim([{ id, claim: values }]);
|
|
645
|
+
try {
|
|
646
|
+
await write();
|
|
647
|
+
} catch (error) {
|
|
648
|
+
await claims.failed(id, error);
|
|
649
|
+
throw error;
|
|
650
|
+
}
|
|
651
|
+
// A row written long after its claim may have lost a
|
|
652
|
+
// value to another write taking it for an orphan.
|
|
653
|
+
const lost = await claims.lost();
|
|
654
|
+
if (lost !== undefined) {
|
|
655
|
+
await whileMigrating(index, () =>
|
|
656
|
+
withRetry(() =>
|
|
657
|
+
client.delete({ index, id, refresh }),
|
|
658
|
+
).catch((error) => {
|
|
659
|
+
if (!isNotFound(error)) throw error;
|
|
660
|
+
}),
|
|
661
|
+
);
|
|
662
|
+
await claims.unwritten([id]);
|
|
663
|
+
throw duplicateError(model, lost);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
: write,
|
|
454
667
|
);
|
|
455
668
|
} catch (error) {
|
|
456
669
|
if (isVersionConflict(error)) {
|
|
@@ -562,6 +775,10 @@ export const elasticsearchAdapter = (
|
|
|
562
775
|
const index = await ensureAlias(model);
|
|
563
776
|
const query = queryFor(model, where);
|
|
564
777
|
|
|
778
|
+
// Created once, so a rerun after a write block knows which of its
|
|
779
|
+
// claims an earlier run created.
|
|
780
|
+
const claims = reservations.claims(model, index);
|
|
781
|
+
|
|
565
782
|
// Conditional on the row read, so a blocked write reads again.
|
|
566
783
|
return whileMigrating(index, async () => {
|
|
567
784
|
const row = await findVersioned(index, query);
|
|
@@ -573,14 +790,28 @@ export const elasticsearchAdapter = (
|
|
|
573
790
|
id: (row.source.id as string | undefined) ?? row.id,
|
|
574
791
|
};
|
|
575
792
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
refresh,
|
|
582
|
-
}),
|
|
793
|
+
const change = reservations.changeOf(
|
|
794
|
+
model,
|
|
795
|
+
row.id,
|
|
796
|
+
row.source,
|
|
797
|
+
update as SourceDoc,
|
|
583
798
|
);
|
|
799
|
+
if (change) await claims.claim([change]);
|
|
800
|
+
|
|
801
|
+
try {
|
|
802
|
+
await withRetry(() =>
|
|
803
|
+
client.index({
|
|
804
|
+
id: row.id,
|
|
805
|
+
document: mergedDocument,
|
|
806
|
+
...row.ifUnchanged,
|
|
807
|
+
refresh,
|
|
808
|
+
}),
|
|
809
|
+
);
|
|
810
|
+
} catch (error) {
|
|
811
|
+
if (change) await claims.failed(row.id, error);
|
|
812
|
+
throw error;
|
|
813
|
+
}
|
|
814
|
+
if (change) await claims.written([row.id]);
|
|
584
815
|
|
|
585
816
|
return mergedDocument as T;
|
|
586
817
|
});
|
|
@@ -602,114 +833,62 @@ export const elasticsearchAdapter = (
|
|
|
602
833
|
source: SET_FIELDS_SCRIPT,
|
|
603
834
|
params: { fields: update },
|
|
604
835
|
};
|
|
836
|
+
const writeRows = async (hits: estypes.SearchHit<SourceDoc>[]) => {
|
|
837
|
+
const result = await client.bulk({
|
|
838
|
+
index,
|
|
839
|
+
refresh,
|
|
840
|
+
operations: hits.flatMap((hit) => [
|
|
841
|
+
{ update: ifUnchanged(hit) },
|
|
842
|
+
{ script },
|
|
843
|
+
]),
|
|
844
|
+
});
|
|
845
|
+
return result.items.map((item) => item.update);
|
|
846
|
+
};
|
|
605
847
|
|
|
606
|
-
//
|
|
607
|
-
//
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
writeBlockTimeoutMs,
|
|
620
|
-
index,
|
|
621
|
-
);
|
|
622
|
-
let pass = 0;
|
|
623
|
-
while (pass < MAX_MANY_PASSES) {
|
|
624
|
-
const passQuery = retryIds
|
|
625
|
-
? { bool: { filter: [query, { ids: { values: retryIds } }] } }
|
|
626
|
-
: query;
|
|
627
|
-
const unwrittenIds: string[] = [];
|
|
628
|
-
let rejected = false;
|
|
629
|
-
let blockedBy: unknown;
|
|
630
|
-
|
|
631
|
-
// Paging by id needs no point in time: ids are unique and never
|
|
632
|
-
// change, so no row is read twice, and a row that changes on a
|
|
633
|
-
// later page is read as changed.
|
|
634
|
-
let searchAfter: estypes.SortResults | undefined;
|
|
635
|
-
while (true) {
|
|
636
|
-
const page = await withRetry(() =>
|
|
637
|
-
client.search({
|
|
638
|
-
index,
|
|
639
|
-
query: passQuery,
|
|
640
|
-
size: UPDATE_MANY_PAGE_SIZE,
|
|
641
|
-
sort: [{ id: "asc" }],
|
|
642
|
-
search_after: searchAfter,
|
|
643
|
-
_source: false,
|
|
644
|
-
seq_no_primary_term: true,
|
|
645
|
-
track_total_hits: false,
|
|
646
|
-
}),
|
|
647
|
-
);
|
|
648
|
-
const hits = page.hits.hits;
|
|
649
|
-
if (hits.length === 0) break;
|
|
650
|
-
searchAfter = hits[hits.length - 1]?.sort;
|
|
848
|
+
// Every field of a unique index the update touches, since the new
|
|
849
|
+
// combination includes the fields it leaves alone.
|
|
850
|
+
const unique = reservations.fieldsOf(model, update);
|
|
851
|
+
if (unique.length === 0) {
|
|
852
|
+
return writeMatchingRows({
|
|
853
|
+
model,
|
|
854
|
+
index,
|
|
855
|
+
query,
|
|
856
|
+
operation: "updateMany",
|
|
857
|
+
source: false,
|
|
858
|
+
writePage: writeRows,
|
|
859
|
+
});
|
|
860
|
+
}
|
|
651
861
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
{ script },
|
|
667
|
-
]),
|
|
862
|
+
// Each page's rows claim their new values in one request before
|
|
863
|
+
// they are written, and release their old ones in one after.
|
|
864
|
+
return writeMatchingRows({
|
|
865
|
+
model,
|
|
866
|
+
index,
|
|
867
|
+
query,
|
|
868
|
+
operation: "updateMany",
|
|
869
|
+
source: unique,
|
|
870
|
+
writePage: async (hits) => {
|
|
871
|
+
const changes = hits.flatMap((hit) => {
|
|
872
|
+
const change = hit._id
|
|
873
|
+
? reservations.changeOf(model, hit._id, hit._source, update)
|
|
874
|
+
: undefined;
|
|
875
|
+
return change ? [change] : [];
|
|
668
876
|
});
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
} else if (outcome?.status === 404) {
|
|
681
|
-
// Another request deleted the row.
|
|
682
|
-
} else if (!outcome || outcome.error) {
|
|
683
|
-
throw new Error(
|
|
684
|
-
`updateMany on "${model}" failed after updating ${updated} rows: ${outcome?.error?.reason ?? outcome?.error?.type ?? "unexpected bulk response"}`,
|
|
685
|
-
);
|
|
686
|
-
} else {
|
|
687
|
-
updated++;
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
if (hits.length < UPDATE_MANY_PAGE_SIZE) break;
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
if (unwrittenIds.length === 0) return updated;
|
|
694
|
-
retryIds = unwrittenIds;
|
|
695
|
-
// Make the writes that won searchable, so the next pass sees
|
|
696
|
-
// whether those rows still match and what to condition on. Even
|
|
697
|
-
// with "immediate" refresh a winner may not have refreshed yet.
|
|
698
|
-
await withRetry(() => client.indices.refresh({ index }));
|
|
699
|
-
if (blockedBy) {
|
|
700
|
-
await pauseWhileBlocked(
|
|
701
|
-
blockedBy,
|
|
702
|
-
`updateMany on "${model}" had updated ${updated} rows.`,
|
|
877
|
+
const claims = reservations.claims(model, index);
|
|
878
|
+
await claims.claim(changes);
|
|
879
|
+
const outcomes = await writeRows(hits);
|
|
880
|
+
const written = new Set(writtenIds(outcomes));
|
|
881
|
+
await claims.written(written);
|
|
882
|
+
// Bulk items are not retried, so a row reported unwritten was
|
|
883
|
+
// not written; a later pass claims its values again.
|
|
884
|
+
await claims.unwritten(
|
|
885
|
+
changes
|
|
886
|
+
.map((change) => change.id)
|
|
887
|
+
.filter((id) => !written.has(id)),
|
|
703
888
|
);
|
|
704
|
-
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
if (rejected) await wait((0.5 + Math.random()) * 50 * 2 ** pass);
|
|
708
|
-
pass++;
|
|
709
|
-
}
|
|
710
|
-
throw new Error(
|
|
711
|
-
`updateMany on "${model}" updated ${updated} rows, but the remaining matching rows could not be written in ${MAX_MANY_PASSES} passes: other requests kept changing them or Elasticsearch kept rejecting the writes`,
|
|
712
|
-
);
|
|
889
|
+
return outcomes;
|
|
890
|
+
},
|
|
891
|
+
});
|
|
713
892
|
},
|
|
714
893
|
delete: async ({
|
|
715
894
|
model,
|
|
@@ -723,14 +902,14 @@ export const elasticsearchAdapter = (
|
|
|
723
902
|
const index = await ensureAlias(model);
|
|
724
903
|
const query = queryFor(model, where);
|
|
725
904
|
|
|
726
|
-
await whileMigrating(index, async () => {
|
|
905
|
+
const deleted = await whileMigrating(index, async () => {
|
|
727
906
|
const searchResult = await withRetry(() =>
|
|
728
907
|
client.search<SourceDoc>({ index, query, size: 1 }),
|
|
729
908
|
);
|
|
730
909
|
|
|
731
910
|
const hit = searchResult.hits.hits[0];
|
|
732
911
|
const hitId = hit?._id;
|
|
733
|
-
if (!hit || !hitId) return;
|
|
912
|
+
if (!hit || !hitId) return undefined;
|
|
734
913
|
|
|
735
914
|
await withRetry(() =>
|
|
736
915
|
client.delete({
|
|
@@ -739,7 +918,9 @@ export const elasticsearchAdapter = (
|
|
|
739
918
|
refresh,
|
|
740
919
|
}),
|
|
741
920
|
);
|
|
921
|
+
return { id: hitId, source: hit._source };
|
|
742
922
|
});
|
|
923
|
+
if (deleted) await reservations.release(model, index, [deleted]);
|
|
743
924
|
},
|
|
744
925
|
deleteMany: async ({
|
|
745
926
|
model,
|
|
@@ -751,6 +932,39 @@ export const elasticsearchAdapter = (
|
|
|
751
932
|
const index = await ensureAlias(model);
|
|
752
933
|
const query = queryFor(model, where);
|
|
753
934
|
|
|
935
|
+
// Releasing a row's values needs them, which a by-query delete does
|
|
936
|
+
// not return, so these rows are deleted a page at a time.
|
|
937
|
+
const unique = reservations.fieldsOf(model);
|
|
938
|
+
if (unique.length > 0) {
|
|
939
|
+
return writeMatchingRows({
|
|
940
|
+
model,
|
|
941
|
+
index,
|
|
942
|
+
query,
|
|
943
|
+
operation: "deleteMany",
|
|
944
|
+
source: unique,
|
|
945
|
+
writePage: async (hits) => {
|
|
946
|
+
// Refreshed like the by-query delete, which cannot wait.
|
|
947
|
+
const result = await client.bulk({
|
|
948
|
+
index,
|
|
949
|
+
refresh: true,
|
|
950
|
+
operations: hits.map((hit) => ({ delete: ifUnchanged(hit) })),
|
|
951
|
+
});
|
|
952
|
+
const outcomes = result.items.map((item) => item.delete);
|
|
953
|
+
const written = new Set(writtenIds(outcomes));
|
|
954
|
+
await reservations.release(
|
|
955
|
+
model,
|
|
956
|
+
index,
|
|
957
|
+
hits.flatMap((hit) =>
|
|
958
|
+
hit._id && written.has(hit._id)
|
|
959
|
+
? [{ id: hit._id, source: hit._source }]
|
|
960
|
+
: [],
|
|
961
|
+
),
|
|
962
|
+
);
|
|
963
|
+
return outcomes;
|
|
964
|
+
},
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
|
|
754
968
|
// A row that changes mid-pass is skipped as a version conflict, so
|
|
755
969
|
// rerun until a pass meets none. Rows already deleted no longer
|
|
756
970
|
// match, so a rerun never counts a row twice. A pass refused by a
|
package/src/index.ts
CHANGED