@lossless.org/client 1.22.2 → 1.23.1

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.
Files changed (32) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/nosqldb/classes.bootstraprecord.js +4 -4
  3. package/dist_ts/nosqldb/classes.connection.d.ts +3 -0
  4. package/dist_ts/nosqldb/classes.connection.js +3 -2
  5. package/dist_ts/nosqldb/classes.db.d.ts +31 -0
  6. package/dist_ts/nosqldb/classes.db.js +41 -1
  7. package/dist_ts/nosqldb/classes.doc.js +5 -5
  8. package/dist_ts/nosqldb/classes.exactpersistence.d.ts +3 -2
  9. package/dist_ts/nosqldb/classes.exactpersistence.js +8 -7
  10. package/dist_ts/nosqldb/classes.session.d.ts +7 -6
  11. package/dist_ts/nosqldb/classes.session.js +88 -36
  12. package/dist_ts/nosqldb/classes.writelog.d.ts +129 -0
  13. package/dist_ts/nosqldb/classes.writelog.js +497 -0
  14. package/dist_ts/nosqldb/classes.writeobserver.d.ts +13 -0
  15. package/dist_ts/nosqldb/classes.writeobserver.js +47 -25
  16. package/dist_ts/nosqldb/classes.writerevisions.d.ts +40 -4
  17. package/dist_ts/nosqldb/classes.writerevisions.js +174 -37
  18. package/dist_ts/nosqldb/engineidentity.d.ts +6 -0
  19. package/dist_ts/nosqldb/engineidentity.js +14 -1
  20. package/package.json +2 -2
  21. package/readme.md +11 -10
  22. package/ts/00_commitinfo_data.ts +1 -1
  23. package/ts/nosqldb/classes.bootstraprecord.ts +3 -3
  24. package/ts/nosqldb/classes.connection.ts +5 -1
  25. package/ts/nosqldb/classes.db.ts +64 -0
  26. package/ts/nosqldb/classes.doc.ts +4 -4
  27. package/ts/nosqldb/classes.exactpersistence.ts +8 -7
  28. package/ts/nosqldb/classes.session.ts +107 -38
  29. package/ts/nosqldb/classes.writelog.ts +701 -0
  30. package/ts/nosqldb/classes.writeobserver.ts +62 -28
  31. package/ts/nosqldb/classes.writerevisions.ts +225 -41
  32. package/ts/nosqldb/engineidentity.ts +16 -0
@@ -3,23 +3,31 @@ import { SmartdataPersistenceError } from './classes.persistence.js';
3
3
  import { logger } from './logging.js';
4
4
  const maximumObservedFields = 64;
5
5
  const observersByDb = new WeakMap();
6
+ /**
7
+ * @internal Validates the top-level field names a report carries: 1 to 64
8
+ * distinct names, no `.` and no leading `$`. `subjectArg` names what requires
9
+ * them in the refusal.
10
+ */
11
+ export const normalizeObservedFields = (fieldsArg, subjectArg) => {
12
+ if (!Array.isArray(fieldsArg)
13
+ || fieldsArg.length === 0
14
+ || fieldsArg.length > maximumObservedFields
15
+ || fieldsArg.some((fieldArg) => typeof fieldArg !== 'string'
16
+ || fieldArg.length === 0
17
+ || fieldArg.includes('.')
18
+ || fieldArg.startsWith('$'))
19
+ || new Set(fieldsArg).size !== fieldsArg.length) {
20
+ throw new SmartdataPersistenceError('invalid_argument', `${subjectArg} requires 1 to ${maximumObservedFields} distinct top-level field names.`);
21
+ }
22
+ return Object.freeze([...fieldsArg]);
23
+ };
6
24
  const normalizeObserverOptions = (optionsArg) => {
7
25
  const { fields, listener } = assertDataOptions(optionsArg, ['fields', 'listener']);
8
26
  if (typeof listener !== 'function') {
9
27
  throw new SmartdataPersistenceError('invalid_argument', 'A SmartData write observer requires a listener function.');
10
28
  }
11
- if (!Array.isArray(fields)
12
- || fields.length === 0
13
- || fields.length > maximumObservedFields
14
- || fields.some((fieldArg) => typeof fieldArg !== 'string'
15
- || fieldArg.length === 0
16
- || fieldArg.includes('.')
17
- || fieldArg.startsWith('$'))
18
- || new Set(fields).size !== fields.length) {
19
- throw new SmartdataPersistenceError('invalid_argument', `A SmartData write observer requires 1 to ${maximumObservedFields} distinct top-level field names.`);
20
- }
21
29
  return {
22
- fields: Object.freeze([...fields]),
30
+ fields: normalizeObservedFields(fields, 'A SmartData write observer'),
23
31
  listener: listener,
24
32
  };
25
33
  };
@@ -98,6 +106,31 @@ const collectSelectorAnchors = (selectorArg, fieldsArg, identityDocumentIdFieldA
98
106
  }
99
107
  }
100
108
  };
109
+ /**
110
+ * @internal The report of one acknowledged write with the values of `fieldsArg`,
111
+ * copied now and frozen.
112
+ */
113
+ export const reportOfSmartdataWrite = (writeArg, fieldsArg) => {
114
+ const anchors = {};
115
+ collectSelectorAnchors(writeArg.selector, new Set(fieldsArg), writeArg.identityDocumentIdField, anchors);
116
+ return Object.freeze({
117
+ collection: writeArg.collection,
118
+ kind: writeArg.kind,
119
+ documents: writeArg.documents === null
120
+ ? null
121
+ : Object.freeze(writeArg.documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, fieldsArg)))),
122
+ anchors: Object.freeze(anchors),
123
+ });
124
+ };
125
+ /** @internal The same report with only the values of `fieldsArg`, which the report's fields include. */
126
+ export const narrowSmartdataWriteReport = (reportArg, fieldsArg) => Object.freeze({
127
+ collection: reportArg.collection,
128
+ kind: reportArg.kind,
129
+ documents: reportArg.documents === null
130
+ ? null
131
+ : Object.freeze(reportArg.documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, fieldsArg)))),
132
+ anchors: Object.freeze(pickDocumentFields(reportArg.anchors, fieldsArg)),
133
+ });
101
134
  const describeError = (errorArg) => errorArg instanceof Error ? errorArg.message : String(errorArg);
102
135
  /**
103
136
  * @internal Captures one acknowledged write for the observers registered now,
@@ -111,24 +144,13 @@ export const captureSmartdataWrite = (dbArg, writeArg) => {
111
144
  if (!registered || registered.size === 0)
112
145
  return undefined;
113
146
  const observers = [...registered];
114
- const fields = [...new Set(observers.flatMap((observerArg) => observerArg.fields))];
115
- const documents = writeArg.documents?.map((documentArg) => pickDocumentFields(documentArg, fields)) ?? null;
116
- const anchors = {};
117
- collectSelectorAnchors(writeArg.selector, new Set(fields), writeArg.identityDocumentIdField, anchors);
147
+ const report = reportOfSmartdataWrite(writeArg, [...new Set(observers.flatMap((observerArg) => observerArg.fields))]);
118
148
  return () => {
119
149
  for (const observer of observers) {
120
150
  if (!observersByDb.get(dbArg)?.has(observer))
121
151
  continue;
122
- const report = Object.freeze({
123
- collection: writeArg.collection,
124
- kind: writeArg.kind,
125
- documents: documents === null
126
- ? null
127
- : Object.freeze(documents.map((documentArg) => Object.freeze(pickDocumentFields(documentArg, observer.fields)))),
128
- anchors: Object.freeze(pickDocumentFields(anchors, observer.fields)),
129
- });
130
152
  try {
131
- observer.listener(report);
153
+ observer.listener(narrowSmartdataWriteReport(report, observer.fields));
132
154
  }
133
155
  catch (errorArg) {
134
156
  logger.log('error', `A SmartData write observer threw on a write to "${writeArg.collection}": ${describeError(errorArg)}`);
@@ -136,4 +158,4 @@ export const captureSmartdataWrite = (dbArg, writeArg) => {
136
158
  }
137
159
  };
138
160
  };
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLndyaXRlb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlFdEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7QUFFdEUsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFVBQW1CLEVBQWtCLEVBQUU7SUFDdkUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNuRixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsRUFDcEQsMERBQTBELENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFDRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1dBQ25CLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztXQUNuQixNQUFNLENBQUMsTUFBTSxHQUFHLHFCQUFxQjtXQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDMUIsT0FBTyxRQUFRLEtBQUssUUFBUTtlQUN6QixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7ZUFDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7ZUFDdEIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztXQUMzQixJQUFJ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
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbm9zcWxkYi9jbGFzc2VzLndyaXRlb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXlFdEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQW9DLENBQUM7QUFFdEU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsU0FBa0IsRUFBRSxVQUFrQixFQUFxQixFQUFFO0lBQ25HLElBQ0UsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztXQUN0QixTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDdEIsU0FBUyxDQUFDLE1BQU0sR0FBRyxxQkFBcUI7V0FDeEMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzdCLE9BQU8sUUFBUSxLQUFLLFFBQVE7ZUFDekIsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ3JCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2VBQ3RCLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7V0FDM0IsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQy9DLENBQUM7UUFDRCxNQUFNLElBQUkseUJBQXlCLENBQUMsa0JBQWtCLEVBQ3BELEdBQUcsVUFBVSxrQkFBa0IscUJBQXFCLGtDQUFrQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFD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
@@ -6,6 +6,13 @@ import type { SmartdataOperationDeadline } from './classes.operationdeadline.js'
6
6
  * no writes at all. Every model write bumps a counter per collection and
7
7
  * partition in the same transaction, and a read set compares the counters it
8
8
  * read before its reads with the current ones.
9
+ *
10
+ * A counter is its base document, which a writer bumps alone, and up to
11
+ * `counterShards - 1` shard documents that overlapping transactions bump
12
+ * instead, so they do not conflict on the base. A list document beside the
13
+ * base holds how many slots are in use, and the transaction that first bumps
14
+ * a slot raises it, so a snapshot reads the bases and lists in one query and
15
+ * only the listed shards of the counters that have any.
9
16
  */
10
17
  export interface ISmartdataWriteRevisionsOptions {
11
18
  /**
@@ -30,13 +37,39 @@ export declare const isSmartdataWriteRevisionsActive: (dbArg: SmartdataDb) => bo
30
37
  export declare const partitionRevisionId: (collectionArg: string, partitionArg: string) => string;
31
38
  /** @internal The counter of a collection's writes that no partition can place. */
32
39
  export declare const sharedRevisionId: (collectionArg: string) => string;
40
+ /** @internal The document of a counter's slot: the base for slot 0, a shard otherwise. */
41
+ export declare const revisionSlotId: (idArg: string, slotArg: number) => string;
42
+ /** @internal The document that lists how many slots of a counter are in use; none means only the base. */
43
+ export declare const revisionSlotListId: (idArg: string) => string;
33
44
  /**
34
45
  * @internal The counter a stored value of the partition field belongs to:
35
46
  * its partition's for a string the counters can name, the shared one otherwise.
36
47
  */
37
48
  export declare const revisionIdOfValue: (collectionArg: string, valueArg: unknown) => string;
38
49
  export declare const writeRevisionBumpsOfKey: (keyArg: string, idsArg: ReadonlySet<string>) => number;
39
- export declare const beginSmartdataWriteRevisionCommit: (dbArg: SmartdataDb, idsArg: ReadonlySet<string>) => (() => void);
50
+ /**
51
+ * @internal The slots one attempt of a transaction bumps. A counter takes its
52
+ * slot at its first bump in the attempt and holds it until the attempt ends,
53
+ * so no other attempt of this instance commits to it in between.
54
+ */
55
+ export interface ISmartdataWriteRevisionAttempt {
56
+ /** The slot of each counter the attempt bumps. */
57
+ readonly slots: ReadonlyMap<string, number>;
58
+ /** Takes a slot of a counter the attempt has not bumped yet; once the attempt ended, none. */
59
+ bump(idArg: string): void;
60
+ /**
61
+ * Right before the commit: until the attempt ends, a snapshot of this
62
+ * instance that depends on its counters cannot tell its bumps from those of
63
+ * other processes.
64
+ */
65
+ commit(): void;
66
+ /**
67
+ * Ends the attempt: releases its slots and, after a commit, makes them the
68
+ * counters' preferred ones. Later calls do nothing.
69
+ */
70
+ finish(committedArg: boolean): void;
71
+ }
72
+ export declare const beginSmartdataWriteRevisionAttempt: (dbArg: SmartdataDb, attemptStartedAtArg: number) => ISmartdataWriteRevisionAttempt;
40
73
  /**
41
74
  * @internal The snapshot keys one read depends on. A read the field pins
42
75
  * depends on its partitions and the shared counter, which holds every
@@ -65,10 +98,13 @@ export declare const bumpSmartdataWriteRevisionEpoch: (dbArg: SmartdataDb, optio
65
98
  }) => Promise<void>;
66
99
  /**
67
100
  * @internal Bumps the counters a transaction's writes touched, inside that
68
- * transaction, right before its commit. Sorted, so concurrent transactions
69
- * take the counters in one order.
101
+ * transaction, right before its commit: each in the slot it took. A shard
102
+ * bump first makes sure the counter's list exists and holds the slot; once it
103
+ * does, neither update changes it, so later bumps of listed slots write only
104
+ * their own document. A slot whose value is no number stays as it is, which
105
+ * keeps its counter unknown, and the write still commits.
70
106
  */
71
- export declare const flushSmartdataWriteRevisions: (mongoDbArg: plugins.mongodb.Db, rawSessionArg: plugins.mongodb.ClientSession, idsArg: ReadonlySet<string>, signalArg: AbortSignal | undefined) => Promise<void>;
107
+ export declare const flushSmartdataWriteRevisions: (mongoDbArg: plugins.mongodb.Db, rawSessionArg: plugins.mongodb.ClientSession, slotsArg: ReadonlyMap<string, number>, signalArg: AbortSignal | undefined) => Promise<void>;
72
108
  /**
73
109
  * @internal The counters of the documents a write by selector is about to
74
110
  * change, read in its transaction before it runs. Snapshot isolation makes
@@ -5,6 +5,15 @@ import { SmartdataPersistenceError, isMongoDuplicateKeyError } from './classes.p
5
5
  export const writeRevisionsCollectionName = '__smartdata_write_revisions';
6
6
  /** The counter every write revision belongs to; a new generation restarts all counters. */
7
7
  const epochId = '$epoch';
8
+ /** Joins a counter's id and the slot of one of its shards, or ends the id of its list. No counter id contains it. */
9
+ const shardSeparator = '\u0000';
10
+ /**
11
+ * Slots per counter, the base included: as many transactions that overlap in
12
+ * time can bump one counter without conflicting on it.
13
+ */
14
+ const counterShards = 16;
15
+ /** Counters whose slots a database instance remembers, beyond those an open transaction holds. */
16
+ const maximumRememberedCounters = 4096;
8
17
  const maximumPartitionLength = 512;
9
18
  const maximumPinnedPartitions = 64;
10
19
  /** Beyond this many documents, a write by selector bumps the shared counter instead. */
@@ -31,13 +40,20 @@ export const writeRevisionsPartitionField = (dbArg) => partitionFields.get(dbArg
31
40
  /** @internal Write revisions are configured and the engine runs transactions. */
32
41
  export const isSmartdataWriteRevisionsActive = (dbArg) => partitionFields.has(dbArg) && dbArg.capabilities?.transactions === 'available';
33
42
  /** A string the counters can name, or `undefined`. */
34
- const partitionOf = (valueArg) => typeof valueArg === 'string' && valueArg.length <= maximumPartitionLength && valueArg.isWellFormed()
43
+ const partitionOf = (valueArg) => typeof valueArg === 'string'
44
+ && valueArg.length <= maximumPartitionLength
45
+ && valueArg.isWellFormed()
46
+ && !valueArg.includes(shardSeparator)
35
47
  ? valueArg
36
48
  : undefined;
37
49
  /** @internal The counter of one partition of a collection. */
38
50
  export const partitionRevisionId = (collectionArg, partitionArg) => `${collectionArg}$s${partitionArg}`;
39
51
  /** @internal The counter of a collection's writes that no partition can place. */
40
52
  export const sharedRevisionId = (collectionArg) => `${collectionArg}$*`;
53
+ /** @internal The document of a counter's slot: the base for slot 0, a shard otherwise. */
54
+ export const revisionSlotId = (idArg, slotArg) => slotArg === 0 ? idArg : `${idArg}${shardSeparator}${slotArg}`;
55
+ /** @internal The document that lists how many slots of a counter are in use; none means only the base. */
56
+ export const revisionSlotListId = (idArg) => `${idArg}${shardSeparator}`;
41
57
  /**
42
58
  * @internal The counter a stored value of the partition field belongs to:
43
59
  * its partition's for a string the counters can name, the shared one otherwise.
@@ -124,15 +140,89 @@ export const writeRevisionBumpsOfKey = (keyArg, idsArg) => {
124
140
  }
125
141
  return bumps;
126
142
  };
127
- export const beginSmartdataWriteRevisionCommit = (dbArg, idsArg) => {
128
- const commits = revisionCommitsOfDb(dbArg);
129
- const ids = new Set(idsArg);
130
- commits.pending.add(ids);
131
- for (const snapshot of commits.snapshots) {
132
- if (snapshot.keys.some((keyArg) => writeRevisionBumpsOfKey(keyArg, ids) > 0))
133
- snapshot.lost = true;
143
+ /** Per database instance, in least recently bumped order. */
144
+ const revisionSlotsOfDbs = new WeakMap();
145
+ /**
146
+ * The slot of a counter an attempt that started at `attemptStartedAtArg`
147
+ * bumps: from the preferred one on, the first that no attempt of this instance
148
+ * holds or ended since then, whose commit the attempt's snapshot might not
149
+ * see. Without one, the first that none holds, and the preferred one last.
150
+ * Transactions of other instances may still take the same slot; a conflict
151
+ * then fails the attempt, and its retry starts after the slot's end, so it
152
+ * moves on to another.
153
+ */
154
+ const chooseRevisionSlot = (counterArg, attemptStartedAtArg) => {
155
+ let unheld;
156
+ for (let offset = 0; offset < counterShards; offset++) {
157
+ const slot = (counterArg.preferred + offset) % counterShards;
158
+ const state = counterArg.slots[slot];
159
+ if (state.holders > 0)
160
+ continue;
161
+ if (state.endedAt < attemptStartedAtArg)
162
+ return slot;
163
+ unheld ??= slot;
134
164
  }
135
- return () => { commits.pending.delete(ids); };
165
+ return unheld ?? counterArg.preferred;
166
+ };
167
+ export const beginSmartdataWriteRevisionAttempt = (dbArg, attemptStartedAtArg) => {
168
+ const taken = [];
169
+ const slots = new Map();
170
+ let pending;
171
+ let finished = false;
172
+ return {
173
+ slots,
174
+ bump: (idArg) => {
175
+ if (finished || slots.has(idArg))
176
+ return;
177
+ let counters = revisionSlotsOfDbs.get(dbArg);
178
+ if (!counters) {
179
+ counters = new Map();
180
+ revisionSlotsOfDbs.set(dbArg, counters);
181
+ }
182
+ const counter = counters.get(idArg) ?? {
183
+ preferred: 0,
184
+ slots: Array.from({ length: counterShards }, () => ({ holders: 0, endedAt: -Infinity })),
185
+ };
186
+ counters.delete(idArg);
187
+ counters.set(idArg, counter);
188
+ const slot = chooseRevisionSlot(counter, attemptStartedAtArg);
189
+ counter.slots[slot].holders++;
190
+ taken.push([counter, slot]);
191
+ slots.set(idArg, slot);
192
+ for (const [id, remembered] of counters) {
193
+ if (counters.size <= maximumRememberedCounters)
194
+ break;
195
+ if (remembered.slots.every((slotArg) => slotArg.holders === 0))
196
+ counters.delete(id);
197
+ }
198
+ },
199
+ commit: () => {
200
+ if (finished || pending)
201
+ return;
202
+ const commits = revisionCommitsOfDb(dbArg);
203
+ const ids = new Set(slots.keys());
204
+ pending = ids;
205
+ commits.pending.add(ids);
206
+ for (const snapshot of commits.snapshots) {
207
+ if (snapshot.keys.some((keyArg) => writeRevisionBumpsOfKey(keyArg, ids) > 0))
208
+ snapshot.lost = true;
209
+ }
210
+ },
211
+ finish: (committedArg) => {
212
+ if (finished)
213
+ return;
214
+ finished = true;
215
+ if (pending)
216
+ revisionCommitsOfDb(dbArg).pending.delete(pending);
217
+ const endedAt = performance.now();
218
+ for (const [counter, slot] of taken) {
219
+ counter.slots[slot].holders--;
220
+ counter.slots[slot].endedAt = endedAt;
221
+ if (committedArg)
222
+ counter.preferred = slot;
223
+ }
224
+ },
225
+ };
136
226
  };
137
227
  /**
138
228
  * @internal The snapshot keys one read depends on. A read the field pins
@@ -162,8 +252,12 @@ const connectedDb = (dbArg) => {
162
252
  };
163
253
  /**
164
254
  * @internal The current value of each snapshot key, or `undefined` for a key
165
- * whose value cannot be known: a missing epoch means the counters restarted.
166
- * Bounded by its own deadline.
255
+ * whose value cannot be known: a missing epoch means the counters restarted,
256
+ * and a counter with a value or slot count no writer stores stays unknown. One
257
+ * query reads the epoch, the bases and their lists, a second the listed
258
+ * shards. Every part only grows, and a slot is listed by the transaction that
259
+ * first bumps it, so a write that commits between the two queries shows in
260
+ * this snapshot or in the next, never in neither. Bounded by its own deadline.
167
261
  */
168
262
  const readStoredWriteRevisionSnapshot = async (dbArg, keysArg) => {
169
263
  const collection = revisionsCollection(connectedDb(dbArg));
@@ -174,33 +268,56 @@ const readStoredWriteRevisionSnapshot = async (dbArg, keysArg) => {
174
268
  timeoutMode: 'cursorLifetime',
175
269
  signal,
176
270
  });
271
+ const readDocuments = async (idsArg) => new Map((await collection.find({ _id: { $in: idsArg } }, { projection: { n: 1, generation: 1, slots: 1 }, ...options() }).toArray()).map((documentArg) => [documentArg._id, documentArg]));
272
+ // `$sum` skips a value that is not a number, so such values are counted apart.
273
+ const sumOf = async (collectionArg) => {
274
+ const [sum] = await collection.aggregate([
275
+ { $match: { _id: { $gte: `${collectionArg}$`, $lt: `${collectionArg}%` } } },
276
+ { $group: { _id: null, n: { $sum: '$n' }, invalid: { $sum: { $cond: [{ $isNumber: '$n' }, 0, 1] } } } },
277
+ ], options()).toArray();
278
+ if (sum === undefined)
279
+ return '0';
280
+ return sum.invalid === 0 && typeof sum.n === 'number' && Number.isSafeInteger(sum.n)
281
+ ? String(sum.n)
282
+ : undefined;
283
+ };
177
284
  const counterIds = keysArg.flatMap((keyArg) => keyArg.startsWith('c') ? [keyArg.slice(1)] : []);
178
285
  const ranges = keysArg.flatMap((keyArg) => keyArg.startsWith('r') ? [keyArg.slice(1)] : []);
179
- const [counters, ...sums] = await Promise.all([
180
- collection.find({ _id: { $in: [epochId, ...counterIds] } }, { projection: { n: 1, generation: 1 }, ...options() }).toArray(),
181
- ...ranges.map((collectionArg) => collection.aggregate([
182
- { $match: { _id: { $gte: `${collectionArg}$`, $lt: `${collectionArg}%` } } },
183
- { $group: { _id: null, n: { $sum: '$n' } } },
184
- ], options()).toArray()),
286
+ const [bases, ...sums] = await Promise.all([
287
+ readDocuments([epochId, ...counterIds.flatMap((idArg) => [idArg, revisionSlotListId(idArg)])]),
288
+ ...ranges.map(sumOf),
185
289
  ]);
186
- const byId = new Map(counters.map((documentArg) => [documentArg._id, documentArg]));
290
+ /** The slots each counter's list holds, or `undefined` for a count no writer stores. */
291
+ const slotCounts = new Map(counterIds.map((idArg) => {
292
+ const list = bases.get(revisionSlotListId(idArg));
293
+ const count = list === undefined ? 1 : list.slots;
294
+ return [idArg, Number.isSafeInteger(count) && count >= 1 && count <= counterShards
295
+ ? count
296
+ : undefined];
297
+ }));
298
+ const shardIds = counterIds.flatMap((idArg) => Array.from({ length: (slotCounts.get(idArg) ?? 1) - 1 }, (_unusedArg, indexArg) => revisionSlotId(idArg, indexArg + 1)));
299
+ const shards = shardIds.length === 0 ? new Map() : await readDocuments(shardIds);
187
300
  const snapshot = new Map();
188
- const epoch = byId.get(epochId);
301
+ const epoch = bases.get(epochId);
189
302
  snapshot.set(epochKey, typeof epoch?.generation === 'string' && Number.isSafeInteger(epoch.n)
190
303
  ? `${epoch.generation}:${epoch.n}`
191
304
  : undefined);
192
305
  for (const id of counterIds) {
193
- const counter = byId.get(id);
194
- snapshot.set(counterKey(id), counter === undefined
195
- ? '0'
196
- : Number.isSafeInteger(counter.n) ? String(counter.n) : undefined);
197
- }
198
- for (const [index, collectionArg] of ranges.entries()) {
199
- const sum = sums[index].length === 0 ? 0 : sums[index][0].n;
200
- snapshot.set(rangeKey(collectionArg), typeof sum === 'number' && Number.isSafeInteger(sum)
201
- ? String(sum)
202
- : undefined);
306
+ const count = slotCounts.get(id);
307
+ let sum = count === undefined ? undefined : 0;
308
+ for (let slot = 0; sum !== undefined && slot < count; slot++) {
309
+ // A slot is missing until its first bump commits; a later one may commit first.
310
+ const document = slot === 0 ? bases.get(id) : shards.get(revisionSlotId(id, slot));
311
+ if (document === undefined)
312
+ continue;
313
+ sum = Number.isSafeInteger(document.n) && Number.isSafeInteger(sum + document.n)
314
+ ? sum + document.n
315
+ : undefined;
316
+ }
317
+ snapshot.set(counterKey(id), sum === undefined ? undefined : String(sum));
203
318
  }
319
+ for (const [index, collectionName] of ranges.entries())
320
+ snapshot.set(rangeKey(collectionName), sums[index]);
204
321
  return snapshot;
205
322
  };
206
323
  export const readWriteRevisionSnapshot = async (dbArg, keysArg) => {
@@ -254,15 +371,35 @@ export const bumpSmartdataWriteRevisionEpoch = async (dbArg, optionsArg) => {
254
371
  };
255
372
  /**
256
373
  * @internal Bumps the counters a transaction's writes touched, inside that
257
- * transaction, right before its commit. Sorted, so concurrent transactions
258
- * take the counters in one order.
374
+ * transaction, right before its commit: each in the slot it took. A shard
375
+ * bump first makes sure the counter's list exists and holds the slot; once it
376
+ * does, neither update changes it, so later bumps of listed slots write only
377
+ * their own document. A slot whose value is no number stays as it is, which
378
+ * keeps its counter unknown, and the write still commits.
259
379
  */
260
- export const flushSmartdataWriteRevisions = async (mongoDbArg, rawSessionArg, idsArg, signalArg) => {
261
- if (idsArg.size === 0)
380
+ export const flushSmartdataWriteRevisions = async (mongoDbArg, rawSessionArg, slotsArg, signalArg) => {
381
+ if (slotsArg.size === 0)
262
382
  return;
263
- await revisionsCollection(mongoDbArg).bulkWrite([...idsArg].sort().map((idArg) => ({
264
- updateOne: { filter: { _id: idArg }, update: { $inc: { n: 1 } }, upsert: true },
265
- })), {
383
+ const operations = [];
384
+ for (const [id, slot] of [...slotsArg].sort(([aArg], [bArg]) => aArg < bArg ? -1 : aArg > bArg ? 1 : 0)) {
385
+ if (slot > 0) {
386
+ const listId = revisionSlotListId(id);
387
+ operations.push({ updateOne: { filter: { _id: listId }, update: { $setOnInsert: { n: 0 } }, upsert: true } }, {
388
+ updateOne: {
389
+ filter: { _id: listId, $or: [{ slots: { $exists: false } }, { slots: { $lt: slot + 1 } }] },
390
+ update: { $set: { slots: slot + 1 } },
391
+ },
392
+ });
393
+ }
394
+ const slotId = revisionSlotId(id, slot);
395
+ operations.push({
396
+ updateOne: {
397
+ filter: { _id: slotId, $or: [{ n: { $type: 'int' } }, { n: { $type: 'long' } }, { n: { $type: 'double' } }] },
398
+ update: { $inc: { n: 1 } },
399
+ },
400
+ }, { updateOne: { filter: { _id: slotId }, update: { $setOnInsert: { n: 1 } }, upsert: true } });
401
+ }
402
+ await revisionsCollection(mongoDbArg).bulkWrite(operations, {
266
403
  ordered: true,
267
404
  session: rawSessionArg,
268
405
  ...(signalArg === undefined ? {} : { signal: signalArg }),
@@ -292,4 +429,4 @@ export const readPreviousRevisionIds = async (dbArg, collectionArg, rawSessionAr
292
429
  }
293
430
  return ids;
294
431
  };
295
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZXJldmlzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy53cml0ZXJldmlzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWtCL0YsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDO0FBUTFFLDJGQUEyRjtBQUMzRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFDbkMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDbkMsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUzRCw2RkFBNkY7QUFDN0YsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxLQUFrQixFQUFFLFVBQW1CLEVBQVEsRUFBRTtJQUNoRyxJQUFJLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTztJQUNyQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQ0UsT0FBTyxjQUFjLEtBQUssUUFBUTtXQUMvQixjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7V0FDM0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO1dBQzlCLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxD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
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53cml0ZXJldmlzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL25vc3FsZGIvY2xhc3Nlcy53cml0ZXJldmlzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQXlCL0YsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDO0FBVTFFLDJGQUEyRjtBQUMzRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIscUhBQXFIO0FBQ3JILE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQztBQUNoQzs7O0dBR0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsa0dBQWtHO0FBQ2xHLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUM7QUFDNUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFFaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFM0QsNkZBQTZGO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxVQUFtQixFQUFRLEVBQUU7SUFDaEcsSUFBSSxVQUFVLEtBQUssU0FBUztRQUFFLE9BQU87SUFDckMsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENB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
@@ -20,6 +20,12 @@ export interface ISmartdataEngineIdentity {
20
20
  export declare const unidentifiedSmartdataEngine: ISmartdataEngineIdentity;
21
21
  export declare const smartdataEngineBackend: (identityArg: ISmartdataEngineIdentity) => TSmartdataEngineBackend | undefined;
22
22
  export declare const smartdataCompositeGrouping: (identityArg: ISmartdataEngineIdentity) => TCompositeGrouping;
23
+ /**
24
+ * Whether the identified engine publishes a durable, commit-ordered journal of
25
+ * the transactions it committed. Only NoSQLDB does, from 10.9.0 on; MongoDB's
26
+ * change streams are a different contract and are not used for it.
27
+ */
28
+ export declare const smartdataCommitJournal: (identityArg: ISmartdataEngineIdentity) => boolean;
23
29
  export declare const composeSmartdataCapabilities: (backendArg: TSmartdataEngineBackend, compositeGroupingArg: TCompositeGrouping) => ICapabilities;
24
30
  /**
25
31
  * Asks the connected engine what it is with one `buildInfo` command. NoSQLDB