@harperfast/harper-pro 5.0.16 → 5.0.17
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/core/DESIGN.md +32 -0
- package/core/bin/copyDb.ts +19 -0
- package/core/resources/replayLogs.ts +36 -3
- package/core/resources/replayLogsGuards.ts +42 -0
- package/core/resources/transactionBroadcast.ts +121 -66
- package/dist/core/bin/copyDb.js +16 -0
- package/dist/core/bin/copyDb.js.map +1 -1
- package/dist/core/resources/replayLogs.js +26 -2
- package/dist/core/resources/replayLogs.js.map +1 -1
- package/dist/core/resources/replayLogsGuards.js +43 -0
- package/dist/core/resources/replayLogsGuards.js.map +1 -0
- package/dist/core/resources/transactionBroadcast.js +129 -71
- package/dist/core/resources/transactionBroadcast.js.map +1 -1
- package/dist/replication/replicationConnection.js +111 -30
- package/dist/replication/replicationConnection.js.map +1 -1
- package/dist/replication/replicator.js +11 -2
- package/dist/replication/replicator.js.map +1 -1
- package/dist/replication/subscriptionManager.js +11 -1
- package/dist/replication/subscriptionManager.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/replication/replicationConnection.ts +110 -35
- package/replication/replicator.ts +11 -2
- package/replication/subscriptionManager.ts +11 -1
- package/studio/web/assets/{index-pr02wSIB.js → index-DhLu-DHX.js} +5 -5
- package/studio/web/assets/{index-pr02wSIB.js.map → index-DhLu-DHX.js.map} +1 -1
- package/studio/web/assets/{index.lazy-CorGZz3L.js → index.lazy-DBjOisCz.js} +2 -2
- package/studio/web/assets/{index.lazy-CorGZz3L.js.map → index.lazy-DBjOisCz.js.map} +1 -1
- package/studio/web/assets/{profile-SSvkzt9H.js → profile-DSL-499E.js} +2 -2
- package/studio/web/assets/{profile-SSvkzt9H.js.map → profile-DSL-499E.js.map} +1 -1
- package/studio/web/assets/{status-Xk93QrPQ.js → status-BRW5QtzY.js} +2 -2
- package/studio/web/assets/{status-Xk93QrPQ.js.map → status-BRW5QtzY.js.map} +1 -1
- package/studio/web/index.html +1 -1
package/core/DESIGN.md
CHANGED
|
@@ -31,3 +31,35 @@ The mitigations live in three places:
|
|
|
31
31
|
- `LMDBTransaction.abort` and `DatabaseTransaction.abort` walk all writes and run the same cleanup unconditionally (regardless of `skipped`), since nothing was committed. `DatabaseTransaction.commit` adds an explicit reject handler so a `Promise.all` failure on `completions` (e.g. a blob save errored) aborts the underlying transaction instead of leaking it _and_ the blob files.
|
|
32
32
|
|
|
33
33
|
When adding a new commit-handler early-return path: reset `write.skipped = false` at the top of the handler if you don't already, then set `write.skipped = true` immediately before the `return`. Decide first whether the audit log will reference the blob (via `auditRecordToStore`) — if it does, leave `skipped` unset. `cleanupOrphans` is the periodic safety net; don't rely on it for transactional correctness.
|
|
34
|
+
|
|
35
|
+
## Schema migration and `runIndexing` internals (`databases.ts`)
|
|
36
|
+
|
|
37
|
+
When `table()` is called with an attribute newly marked `indexed: true` (or with any change that requires re-building the secondary index), `runIndexing` is launched asynchronously and `Table.indexingOperation` is set to its promise. While running:
|
|
38
|
+
|
|
39
|
+
**In-flight state tracking (persisted to `attributesDbi`):**
|
|
40
|
+
|
|
41
|
+
- `attribute.indexingPID = process.pid` — set at migration start; cleared on clean completion. On restart with a different PID, `indexingPID !== process.pid` triggers a re-migration.
|
|
42
|
+
- `attribute.lastIndexedKey` — updated every 100 records as a resumable checkpoint. Cleared on clean completion; preserved on error so a retry starts from this key.
|
|
43
|
+
- `attribute.indexingFailed = true` — set if any record's `index.put` errors during the backfill. `table()` checks this flag: a fresh call in the same or a new process re-triggers the backfill from `lastIndexedKey`.
|
|
44
|
+
- `dbi.isIndexing = true` — in-memory flag on the index dbi. Prevents `searchByIndex` from serving partial results (returns 503 "not indexed yet" instead). Cleared only when backfill completes cleanly.
|
|
45
|
+
|
|
46
|
+
**`isIndexing` propagation across `resetDatabases()` calls:**
|
|
47
|
+
When `signalSchemaChange('schema-change')` fires at the start of `runIndexing`, `syncSchemaMetadata` calls `resetDatabases()` which re-opens all tables via `table()`. This creates a _new_ dbi object and assigns it to `Table.indices[attribute.name]`. The condition `if (attributeDescriptor?.indexingPID) dbi.isIndexing = true` (just before `indices[name] = dbi` in the migration-detection block) ensures any dbi created while a migration is in progress also has `isIndexing = true`. Without this, a concurrent `resetDatabases()` would replace the in-progress dbi with a fresh one where `isIndexing` is false, allowing queries to read partial index results.
|
|
48
|
+
|
|
49
|
+
**Error handling:**
|
|
50
|
+
|
|
51
|
+
- Per-record sync errors: caught by the inner try-catch. Set `hadIndexingErrors = true`.
|
|
52
|
+
- Per-record async rejections (`index.put` returning a rejected Promise): caught by the `when()` error handler. Set `hadIndexingErrors = true`.
|
|
53
|
+
- The final `await lastResolution` is wrapped in its own try-catch because if the very last put in the loop was rejected, an unguarded `await lastResolution` would throw past the `hadIndexingErrors` check to the outer catch, silently bypassing the error path.
|
|
54
|
+
- On any error: `indexingFailed = true` is persisted; `indexingPID`, `isIndexing`, and `lastIndexedKey` are kept. This leaves the index in 503 "incomplete" state rather than silently serving partial results.
|
|
55
|
+
|
|
56
|
+
**`Object.defineProperty(attribute, 'dbi', ...)` must use `configurable: true`:**
|
|
57
|
+
`attribute.dbi` is defined as a non-enumerable property (to prevent serialization to `attributesDbi`). It is defined with `configurable: true` so it can be re-assigned if the attribute participates in a retry cycle in the same process.
|
|
58
|
+
|
|
59
|
+
## Audit-store `'committed'` notification batching (`transactionBroadcast.ts`)
|
|
60
|
+
|
|
61
|
+
The cross-thread subscription path (default `crossThreads`) drives every `Table.subscribe()` consumer. When the database's audit store emits `'committed'`, we walk the audit log via a reusable iterator and dispatch matching records to subscribers. Three properties of this path are easy to break and worth knowing about before changing it:
|
|
62
|
+
|
|
63
|
+
- **`databaseSubscriptions.activeCount`** is the count of live `Subscription` instances on a database. It is incremented at the end of `addSubscription` (after the Subscription is created, so the `scope: 'full-database'` early-return path correctly skips counting) and decremented in `Subscription.end()`. `notifyFromTransactionData` short-circuits when this is zero — the reusable rocksdb iterator stays put and resumes from its position the next time a subscriber arrives. Without this short-circuit, an idle database with no subscribers still pays the audit-log iteration cost on every commit during replication backlog catch-up.
|
|
64
|
+
- **`notifyScheduled` + `setImmediate`** in the `'committed'` listener defers the iteration off the commit microtask. Multiple `'committed'` events that land in the same event-loop turn collapse into one notify pass. `notifyScheduled` stays set for the entire drain — including across yield-and-resume turns — so a re-entry from a new `'committed'` event cannot spawn a second concurrent notify on the same iterator.
|
|
65
|
+
- **Batched yielding** in `notifyFromTransactionData` (`NOTIFY_BATCH_SIZE`) is gated by `allowYield`. The `'committed'` path passes `allowYield = true`; the `listenToCommits` (same-thread `aftercommit`) path does not, because that path holds an inter-thread `'thread-local-writes'` lock that must not span event-loop turns. `subscribersWithTxns` is carried across yields via `subscriptions.pendingTxnSubscribers` so the `end_txn` signal fires exactly once when the iterator truly drains. When `activeCount` drops to zero mid-yield, the next continuation drops the carry-over to avoid invoking ended subscribers' listeners.
|
package/core/bin/copyDb.ts
CHANGED
|
@@ -385,6 +385,16 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase: string, targetPath
|
|
|
385
385
|
name: INTERNAL_DBIS_NAME,
|
|
386
386
|
});
|
|
387
387
|
|
|
388
|
+
const STRUCTURES_KEY = Symbol.for('structures');
|
|
389
|
+
const copyStructures = (sourceDbi, storeName: string) => {
|
|
390
|
+
const buffer = sourceDbi.getBinary?.(STRUCTURES_KEY);
|
|
391
|
+
if (buffer) {
|
|
392
|
+
targetRootStore.putSync([STRUCTURES_KEY, storeName], asBinary(buffer));
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
copyStructures(sourceDbisDb, INTERNAL_DBIS_NAME);
|
|
397
|
+
|
|
388
398
|
let written;
|
|
389
399
|
let outstandingWrites = 0;
|
|
390
400
|
const transaction = sourceDbisDb.useReadTransaction();
|
|
@@ -414,6 +424,8 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase: string, targetPath
|
|
|
414
424
|
existingEncoder.getStructures = tempEncoder.getStructures;
|
|
415
425
|
}
|
|
416
426
|
|
|
427
|
+
copyStructures(sourceDbi, key);
|
|
428
|
+
|
|
417
429
|
console.log('migrating', key, 'from', sourceDatabase, 'to RocksDB');
|
|
418
430
|
await copyDbiToRocks(sourceDbi, targetDbi, isPrimary, transaction);
|
|
419
431
|
}
|
|
@@ -457,6 +469,10 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase: string, targetPath
|
|
|
457
469
|
} of sourceDbi.getRange({ start, transaction, versions: true })) {
|
|
458
470
|
try {
|
|
459
471
|
start = key;
|
|
472
|
+
if (typeof key === 'symbol') {
|
|
473
|
+
skippedRecord++;
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
460
476
|
if (value == null) {
|
|
461
477
|
skippedRecord++;
|
|
462
478
|
continue;
|
|
@@ -497,6 +513,9 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase: string, targetPath
|
|
|
497
513
|
for (const { key, value } of sourceDbi.getRange({ start, transaction })) {
|
|
498
514
|
try {
|
|
499
515
|
start = key;
|
|
516
|
+
if (typeof key === 'symbol') {
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
500
519
|
written = targetDbi.put(key, value);
|
|
501
520
|
recordsCopied++;
|
|
502
521
|
if (transaction.openTimer) transaction.openTimer = 0;
|
|
@@ -6,6 +6,7 @@ import { DatabaseTransaction } from './DatabaseTransaction.ts';
|
|
|
6
6
|
import { RocksTransactionLogStore } from './RocksTransactionLogStore.ts';
|
|
7
7
|
import { isMainThread } from 'node:worker_threads';
|
|
8
8
|
import { RequestTarget } from './RequestTarget.ts';
|
|
9
|
+
import { classifyAuditEntryForReplay } from './replayLogsGuards.ts';
|
|
9
10
|
|
|
10
11
|
let warnedReplayHappening = false;
|
|
11
12
|
export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void> {
|
|
@@ -24,11 +25,26 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
24
25
|
let transaction: DatabaseTransaction;
|
|
25
26
|
let lastTimestamp = 0;
|
|
26
27
|
let writes = 0;
|
|
28
|
+
let skipped = 0;
|
|
27
29
|
const txnLog: RocksTransactionLogStore = rootStore.auditStore;
|
|
28
30
|
for (const auditRecord of txnLog.getRange({ startFromLastFlushed: true, readUncommitted: true })) {
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
+
const {
|
|
32
|
+
type,
|
|
33
|
+
tableId,
|
|
34
|
+
nodeId,
|
|
35
|
+
recordId,
|
|
36
|
+
version,
|
|
37
|
+
residencyId,
|
|
38
|
+
expiresAt,
|
|
39
|
+
originatingOperation,
|
|
40
|
+
username,
|
|
41
|
+
extendedType,
|
|
42
|
+
} = auditRecord;
|
|
31
43
|
try {
|
|
44
|
+
if (classifyAuditEntryForReplay(extendedType, tableId, true) === 'corrupt-header') {
|
|
45
|
+
skipped++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
32
48
|
const Table = tableById.get(tableId);
|
|
33
49
|
if (!Table) continue;
|
|
34
50
|
const context: Context = { nodeId, alreadyLogged: true, version, expiresAt, user: { name: username } };
|
|
@@ -42,7 +58,22 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
42
58
|
warnedReplayHappening = true;
|
|
43
59
|
console.warn('Harper was not properly shutdown, replaying transaction logs to synchronize database');
|
|
44
60
|
}
|
|
45
|
-
|
|
61
|
+
let record: any;
|
|
62
|
+
try {
|
|
63
|
+
record = auditRecord.getValue(primaryStore);
|
|
64
|
+
} catch {
|
|
65
|
+
// msgpack/structure decode failed for this entry's value. Skip rather than
|
|
66
|
+
// fall through to a guaranteed downstream crash, and intentionally drop the
|
|
67
|
+
// error: every corrupt entry would otherwise log a stack trace per iteration
|
|
68
|
+
// (millions of these were observed in prod). The total skip count is logged
|
|
69
|
+
// once at the end of replay.
|
|
70
|
+
skipped++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (classifyAuditEntryForReplay(extendedType, tableId, record !== undefined) === 'missing-record') {
|
|
74
|
+
skipped++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
46
77
|
if (lastTimestamp !== version) {
|
|
47
78
|
lastTimestamp = version;
|
|
48
79
|
try {
|
|
@@ -127,6 +158,8 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
127
158
|
logger.error('Error committing replay transaction', error);
|
|
128
159
|
}
|
|
129
160
|
if (writes > 0) logger.warn(`Replayed ${writes} records in ${rootStore.databaseName} database`);
|
|
161
|
+
if (skipped > 0)
|
|
162
|
+
logger.warn(`Skipped ${skipped} unrecoverable audit entries in ${rootStore.databaseName} database during replay`);
|
|
130
163
|
// we never actually release the lock because we only want to ever run one time
|
|
131
164
|
// rootStore.unlock('replayLogs');
|
|
132
165
|
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Pure helpers for replayLogs (no Harper module dependencies, so unit tests can load
|
|
2
|
+
// them without bootstrapping the full Resource / RocksDB / DatabaseTransaction graph).
|
|
3
|
+
//
|
|
4
|
+
// Background: a node that crashed unclean re-runs replayLogs against the unflushed audit
|
|
5
|
+
// log on next boot. If any audit entry is corrupt or missing its record body, the loop
|
|
6
|
+
// hits a TypeError inside Table.validate() ("Cannot read properties of undefined
|
|
7
|
+
// (reading 'cacheKey')") and the per-iteration catch swallows it — but the loop keeps
|
|
8
|
+
// running over potentially millions of entries, pinning CPU. These guards classify each
|
|
9
|
+
// entry up front so the loop can skip cleanly.
|
|
10
|
+
|
|
11
|
+
// Mirrors `HAS_RECORD` (16) | `HAS_PARTIAL_RECORD` (32) from auditStore.ts — the action
|
|
12
|
+
// bits the writer sets when an entry carries (or should carry) a record body. Redeclared
|
|
13
|
+
// here so this module stays free of the Harper module graph for unit testing; a lock
|
|
14
|
+
// test pins the value against auditStore so silent drift is caught.
|
|
15
|
+
export const RECORD_BEARING_FLAGS = 16 | 32;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Decide whether an audit entry pulled from the unflushed log is safe to replay.
|
|
19
|
+
* Returns `null` if the entry should be replayed, or a short reason string if it should
|
|
20
|
+
* be skipped (the loop logs the aggregate skip count once at the end).
|
|
21
|
+
*
|
|
22
|
+
* Operates on the raw integer `action` field rather than the decoded type string: when
|
|
23
|
+
* `readAuditEntry` catches a header decode error it returns `{}`, so both `action` and
|
|
24
|
+
* `tableId` are `undefined` — the same signal — and matching the record-bearing flags
|
|
25
|
+
* directly against the action mirrors how the writer set them in `auditStore.ts`.
|
|
26
|
+
*
|
|
27
|
+
* @param action `auditRecord.extendedType` — the variable-length action field with
|
|
28
|
+
* the event type in the low nibble and HAS_* flags above it
|
|
29
|
+
* @param tableId `auditRecord.tableId`
|
|
30
|
+
* @param hasRecord `true` if `auditRecord.getValue(...)` produced a non-undefined value
|
|
31
|
+
*/
|
|
32
|
+
export function classifyAuditEntryForReplay(
|
|
33
|
+
action: number | undefined,
|
|
34
|
+
tableId: number | undefined,
|
|
35
|
+
hasRecord: boolean
|
|
36
|
+
): 'corrupt-header' | 'missing-record' | null {
|
|
37
|
+
if (action === undefined || tableId === undefined) return 'corrupt-header';
|
|
38
|
+
// If the action advertises a record body but the decoded record is undefined, the
|
|
39
|
+
// downstream write path will crash inside validate() on the first attribute deref.
|
|
40
|
+
if ((action & RECORD_BEARING_FLAGS) !== 0 && !hasRecord) return 'missing-record';
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
@@ -40,8 +40,22 @@ export function addSubscription(table, key, listener?: (key) => any, startTime?:
|
|
|
40
40
|
auditLogIterator = auditStore.getRange({});
|
|
41
41
|
}
|
|
42
42
|
auditStore.hasSubscriptionCommitListener = true;
|
|
43
|
+
// Coalesce 'committed' bursts: instead of iterating the audit log synchronously inside the
|
|
44
|
+
// commit microtask (which pegs the event loop during replication backlog catch-up), defer
|
|
45
|
+
// to setImmediate. Multiple commits within the same turn collapse into one notify pass.
|
|
46
|
+
// notifyScheduled stays true for the full drain — including yield-and-resume — so new
|
|
47
|
+
// 'committed' events that fire mid-drain don't spawn an overlapping notify pass.
|
|
43
48
|
auditStore.on('committed', () => {
|
|
44
|
-
|
|
49
|
+
if (!databaseSubscriptions.activeCount) {
|
|
50
|
+
// No per-key listeners; skip the expensive audit-log iteration entirely. But still
|
|
51
|
+
// rotate the nextTransaction promise so any whenNextTransaction() waiter (used by
|
|
52
|
+
// outbound replication on databases with no local subscribers) wakes up.
|
|
53
|
+
if (auditStore.nextTransaction) nextTransaction(auditStore);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (databaseSubscriptions.notifyScheduled) return;
|
|
57
|
+
databaseSubscriptions.notifyScheduled = true;
|
|
58
|
+
setImmediate(() => notifyFromTransactionData(databaseSubscriptions, auditLogIterator, true));
|
|
45
59
|
});
|
|
46
60
|
}
|
|
47
61
|
}
|
|
@@ -72,6 +86,7 @@ export function addSubscription(table, key, listener?: (key) => any, startTime?:
|
|
|
72
86
|
subscriptions.key = key;
|
|
73
87
|
}
|
|
74
88
|
subscription.subscriptions = subscriptions;
|
|
89
|
+
databaseSubscriptions.activeCount = (databaseSubscriptions.activeCount || 0) + 1;
|
|
75
90
|
return subscription;
|
|
76
91
|
}
|
|
77
92
|
|
|
@@ -94,20 +109,20 @@ class Subscription extends IterableEventQueue {
|
|
|
94
109
|
end() {
|
|
95
110
|
// cleanup
|
|
96
111
|
if (!this.subscriptions) return;
|
|
112
|
+
const tableSubscriptions = this.subscriptions.tables;
|
|
113
|
+
const envSubscriptions = tableSubscriptions?.envs;
|
|
97
114
|
this.subscriptions.splice(this.subscriptions.indexOf(this), 1);
|
|
98
115
|
if (this.subscriptions.length === 0) {
|
|
99
|
-
const tableSubscriptions = this.subscriptions.tables;
|
|
100
116
|
if (tableSubscriptions) {
|
|
101
117
|
// TODO: Handle cleanup of wildcard
|
|
102
118
|
const key = this.subscriptions.key;
|
|
103
119
|
tableSubscriptions.delete(key);
|
|
104
120
|
if (tableSubscriptions.size === 0) {
|
|
105
|
-
|
|
106
|
-
const dbi = tableSubscriptions.dbi;
|
|
107
|
-
delete envSubscriptions[dbi];
|
|
121
|
+
delete envSubscriptions[tableSubscriptions.tableId];
|
|
108
122
|
}
|
|
109
123
|
}
|
|
110
124
|
}
|
|
125
|
+
if (envSubscriptions?.activeCount > 0) envSubscriptions.activeCount--;
|
|
111
126
|
this.subscriptions = null;
|
|
112
127
|
}
|
|
113
128
|
toJSON() {
|
|
@@ -115,12 +130,25 @@ class Subscription extends IterableEventQueue {
|
|
|
115
130
|
}
|
|
116
131
|
}
|
|
117
132
|
const ACTIONS_OF_INTEREST = ['put', 'patch', 'delete', 'message', 'invalidate'];
|
|
118
|
-
|
|
133
|
+
// Maximum audit records processed per synchronous turn before yielding back to the event loop.
|
|
134
|
+
// Sized to keep per-batch wall time within a few ms on commodity hardware while keeping the
|
|
135
|
+
// scheduling overhead amortized; tune if profiling shows different shapes.
|
|
136
|
+
const NOTIFY_BATCH_SIZE = 256;
|
|
137
|
+
function notifyFromTransactionData(subscriptions, auditLogIterable, allowYield = false) {
|
|
119
138
|
if (!subscriptions) return; // if no subscriptions to this env path, don't need to read anything
|
|
139
|
+
// If no real subscribers are attached, skip the iteration. The reusable iterator preserves its
|
|
140
|
+
// position and will pick up from where we left it once a subscriber is added.
|
|
141
|
+
if (!subscriptions.activeCount) {
|
|
142
|
+
subscriptions.pendingTxnSubscribers = null; // discard any carry-over from a yielded run
|
|
143
|
+
if (allowYield) subscriptions.notifyScheduled = false;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
120
146
|
const auditStore = subscriptions.auditStore;
|
|
121
147
|
auditStore.resetReadTxn?.();
|
|
122
|
-
nextTransaction(
|
|
123
|
-
|
|
148
|
+
nextTransaction(auditStore);
|
|
149
|
+
// subscribersWithTxns is carried across batches so the end_txn signal fires only once the
|
|
150
|
+
// iterator truly drains, not at each yield point.
|
|
151
|
+
let subscribersWithTxns = subscriptions.pendingTxnSubscribers;
|
|
124
152
|
if (!auditLogIterable) {
|
|
125
153
|
// rocksdb will pass this in, but with lmdb, we have to re-create the iterable
|
|
126
154
|
auditLogIterable = auditStore.getRange({
|
|
@@ -128,70 +156,97 @@ function notifyFromTransactionData(subscriptions, auditLogIterable) {
|
|
|
128
156
|
exclusiveStart: true,
|
|
129
157
|
});
|
|
130
158
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
const iterator = auditLogIterable[Symbol.iterator]?.() ?? auditLogIterable;
|
|
160
|
+
let processed = 0;
|
|
161
|
+
let yielded = false;
|
|
162
|
+
try {
|
|
163
|
+
while (true) {
|
|
164
|
+
const result = iterator.next();
|
|
165
|
+
if (result.done) break;
|
|
166
|
+
const auditRecord = result.value;
|
|
167
|
+
const timestamp: number = auditRecord.localTime ?? auditRecord.version;
|
|
168
|
+
subscriptions.lastTxnTime = timestamp;
|
|
169
|
+
if (ACTIONS_OF_INTEREST.includes(auditRecord.type)) {
|
|
170
|
+
const tableSubscriptions = subscriptions[auditRecord.tableId];
|
|
171
|
+
if (tableSubscriptions) {
|
|
172
|
+
const recordId = auditRecord.recordId;
|
|
173
|
+
// TODO: How to handle invalidation
|
|
174
|
+
let matchingKey = keyArrayToString(recordId);
|
|
175
|
+
let ancestorLevel = 0;
|
|
176
|
+
do {
|
|
177
|
+
// we iterate through the key hierarchy, notifying all subscribers for each key,
|
|
178
|
+
// so for an id like resource/foo/bar, we notify subscribers for resource/foo/bar, resource/foo/, resource/foo, resource/, and resource
|
|
179
|
+
// this allows for efficient subscriptions to children ids/topics
|
|
180
|
+
const keySubscriptions = tableSubscriptions.get(matchingKey);
|
|
181
|
+
if (keySubscriptions) {
|
|
182
|
+
for (const subscription of keySubscriptions) {
|
|
183
|
+
if (
|
|
184
|
+
ancestorLevel > 0 && // only ancestors if the subscription is for ancestors (and apply onlyChildren filtering as necessary)
|
|
185
|
+
!(subscription.includeDescendants && !(subscription.onlyChildren && ancestorLevel > 1))
|
|
186
|
+
)
|
|
187
|
+
continue;
|
|
188
|
+
if (subscription.startTime >= timestamp) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
let beginTxn;
|
|
193
|
+
if (subscription.supportsTransactions && subscription.txnInProgress !== auditRecord.version) {
|
|
194
|
+
// if the subscriber supports transactions, we mark this as the beginning of a new transaction
|
|
195
|
+
// tracking the subscription so that we can delimit the transaction on next transaction
|
|
196
|
+
// (with a beginTxn flag, which may be on an endTxn event)
|
|
197
|
+
beginTxn = true;
|
|
198
|
+
if (!subscription.txnInProgress) {
|
|
199
|
+
// if first txn for subscriber of this cycle, add to the transactional subscribers that we are tracking
|
|
200
|
+
if (!subscribersWithTxns) subscribersWithTxns = [subscription];
|
|
201
|
+
else subscribersWithTxns.push(subscription);
|
|
202
|
+
}
|
|
203
|
+
// the version defines the extent of a transaction, all audit records with the same version
|
|
204
|
+
// are part of the same transaction, and when the version changes, we know it is a new
|
|
205
|
+
// transaction
|
|
206
|
+
subscription.txnInProgress = auditRecord.version;
|
|
207
|
+
}
|
|
208
|
+
subscription.listener(recordId, auditRecord, timestamp, beginTxn);
|
|
209
|
+
} catch (error) {
|
|
210
|
+
warn(error);
|
|
211
|
+
}
|
|
167
212
|
}
|
|
168
|
-
// the version defines the extent of a transaction, all audit records with the same version
|
|
169
|
-
// are part of the same transaction, and when the version changes, we know it is a new
|
|
170
|
-
// transaction
|
|
171
|
-
subscription.txnInProgress = auditRecord.version;
|
|
172
213
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
214
|
+
if (matchingKey == null) break;
|
|
215
|
+
const lastSlash = matchingKey.lastIndexOf?.('/', matchingKey.length - 2);
|
|
216
|
+
if (lastSlash !== matchingKey.length - 1) {
|
|
217
|
+
ancestorLevel++; // don't increase the ancestor level for this going from resource/ to resource
|
|
218
|
+
}
|
|
219
|
+
if (lastSlash > -1) {
|
|
220
|
+
matchingKey = matchingKey.slice(0, lastSlash + 1);
|
|
221
|
+
} else matchingKey = null;
|
|
222
|
+
} while (true);
|
|
177
223
|
}
|
|
178
224
|
}
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
225
|
+
if (allowYield && ++processed >= NOTIFY_BATCH_SIZE) {
|
|
226
|
+
// Yield the event loop. Save in-progress txn state so the next batch can resume.
|
|
227
|
+
// Reusable iterables (rocksdb) can be passed back in directly; LMDB-style iterables
|
|
228
|
+
// are recreated from the advanced lastTxnTime. The same-thread aftercommit path does not
|
|
229
|
+
// set allowYield because it holds an inter-thread lock that must not span event-loop turns.
|
|
230
|
+
subscriptions.pendingTxnSubscribers = subscribersWithTxns;
|
|
231
|
+
yielded = true;
|
|
232
|
+
setImmediate(() =>
|
|
233
|
+
notifyFromTransactionData(subscriptions, auditStore.reusableIterable ? auditLogIterable : null, true)
|
|
234
|
+
);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
subscriptions.pendingTxnSubscribers = null;
|
|
239
|
+
if (subscribersWithTxns) {
|
|
240
|
+
// any subscribers with open transactions need to have an event to indicate that their transaction has been ended
|
|
241
|
+
for (const subscription of subscribersWithTxns) {
|
|
242
|
+
subscription.txnInProgress = null; // clean up
|
|
243
|
+
subscription.listener(null, { type: 'end_txn' }, subscriptions.lastTxnTime, true);
|
|
183
244
|
}
|
|
184
|
-
if (lastSlash > -1) {
|
|
185
|
-
matchingKey = matchingKey.slice(0, lastSlash + 1);
|
|
186
|
-
} else matchingKey = null;
|
|
187
|
-
} while (true);
|
|
188
|
-
}
|
|
189
|
-
if (subscribersWithTxns) {
|
|
190
|
-
// any subscribers with open transactions need to have an event to indicate that their transaction has been ended
|
|
191
|
-
for (const subscription of subscribersWithTxns) {
|
|
192
|
-
subscription.txnInProgress = null; // clean up
|
|
193
|
-
subscription.listener(null, { type: 'end_txn' }, subscriptions.lastTxnTime, true);
|
|
194
245
|
}
|
|
246
|
+
} finally {
|
|
247
|
+
// If we yielded, the continuation owns notifyScheduled; otherwise (drain or any throw) we
|
|
248
|
+
// must clear it here so a stuck flag doesn't permanently silence future commits.
|
|
249
|
+
if (allowYield && !yielded) subscriptions.notifyScheduled = false;
|
|
195
250
|
}
|
|
196
251
|
}
|
|
197
252
|
/**
|
package/dist/core/bin/copyDb.js
CHANGED
|
@@ -397,6 +397,14 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase, targetPath) {
|
|
|
397
397
|
disableWAL: false,
|
|
398
398
|
name: terms_js_1.INTERNAL_DBIS_NAME,
|
|
399
399
|
});
|
|
400
|
+
const STRUCTURES_KEY = Symbol.for('structures');
|
|
401
|
+
const copyStructures = (sourceDbi, storeName) => {
|
|
402
|
+
const buffer = sourceDbi.getBinary?.(STRUCTURES_KEY);
|
|
403
|
+
if (buffer) {
|
|
404
|
+
targetRootStore.putSync([STRUCTURES_KEY, storeName], (0, lmdb_1.asBinary)(buffer));
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
copyStructures(sourceDbisDb, terms_js_1.INTERNAL_DBIS_NAME);
|
|
400
408
|
let written;
|
|
401
409
|
let outstandingWrites = 0;
|
|
402
410
|
const transaction = sourceDbisDb.useReadTransaction();
|
|
@@ -425,6 +433,7 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase, targetPath) {
|
|
|
425
433
|
existingEncoder.saveStructures = tempEncoder.saveStructures;
|
|
426
434
|
existingEncoder.getStructures = tempEncoder.getStructures;
|
|
427
435
|
}
|
|
436
|
+
copyStructures(sourceDbi, key);
|
|
428
437
|
console.log('migrating', key, 'from', sourceDatabase, 'to RocksDB');
|
|
429
438
|
await copyDbiToRocks(sourceDbi, targetDbi, isPrimary, transaction);
|
|
430
439
|
}
|
|
@@ -456,6 +465,10 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase, targetPath) {
|
|
|
456
465
|
for (const { key, value, version, expiresAt: entryExpiresAt, nodeId: entryNodeId, residencyId: entryResidencyId, metadataFlags: entryMetadataFlags, } of sourceDbi.getRange({ start, transaction, versions: true })) {
|
|
457
466
|
try {
|
|
458
467
|
start = key;
|
|
468
|
+
if (typeof key === 'symbol') {
|
|
469
|
+
skippedRecord++;
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
459
472
|
if (value == null) {
|
|
460
473
|
skippedRecord++;
|
|
461
474
|
continue;
|
|
@@ -483,6 +496,9 @@ async function copyDbToRocks(sourceRootStore, sourceDatabase, targetPath) {
|
|
|
483
496
|
for (const { key, value } of sourceDbi.getRange({ start, transaction })) {
|
|
484
497
|
try {
|
|
485
498
|
start = key;
|
|
499
|
+
if (typeof key === 'symbol') {
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
486
502
|
written = targetDbi.put(key, value);
|
|
487
503
|
recordsCopied++;
|
|
488
504
|
if (transaction.openTimer)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copyDb.js","sourceRoot":"","sources":["../../../core/bin/copyDb.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"copyDb.js","sourceRoot":"","sources":["../../../core/bin/copyDb.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ const logger = __importStar(require("../utility/logging/harper_logger.js"));
|
|
|
39
39
|
const DatabaseTransaction_ts_1 = require("./DatabaseTransaction.js");
|
|
40
40
|
const node_worker_threads_1 = require("node:worker_threads");
|
|
41
41
|
const RequestTarget_ts_1 = require("./RequestTarget.js");
|
|
42
|
+
const replayLogsGuards_ts_1 = require("./replayLogsGuards.js");
|
|
42
43
|
let warnedReplayHappening = false;
|
|
43
44
|
function replayLogs(rootStore, tables) {
|
|
44
45
|
if (!node_worker_threads_1.isMainThread)
|
|
@@ -58,10 +59,15 @@ function replayLogs(rootStore, tables) {
|
|
|
58
59
|
let transaction;
|
|
59
60
|
let lastTimestamp = 0;
|
|
60
61
|
let writes = 0;
|
|
62
|
+
let skipped = 0;
|
|
61
63
|
const txnLog = rootStore.auditStore;
|
|
62
64
|
for (const auditRecord of txnLog.getRange({ startFromLastFlushed: true, readUncommitted: true })) {
|
|
63
|
-
const { type, tableId, nodeId, recordId, version, residencyId, expiresAt, originatingOperation, username } = auditRecord;
|
|
65
|
+
const { type, tableId, nodeId, recordId, version, residencyId, expiresAt, originatingOperation, username, extendedType, } = auditRecord;
|
|
64
66
|
try {
|
|
67
|
+
if ((0, replayLogsGuards_ts_1.classifyAuditEntryForReplay)(extendedType, tableId, true) === 'corrupt-header') {
|
|
68
|
+
skipped++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
65
71
|
const Table = tableById.get(tableId);
|
|
66
72
|
if (!Table)
|
|
67
73
|
continue;
|
|
@@ -76,7 +82,23 @@ function replayLogs(rootStore, tables) {
|
|
|
76
82
|
warnedReplayHappening = true;
|
|
77
83
|
console.warn('Harper was not properly shutdown, replaying transaction logs to synchronize database');
|
|
78
84
|
}
|
|
79
|
-
|
|
85
|
+
let record;
|
|
86
|
+
try {
|
|
87
|
+
record = auditRecord.getValue(primaryStore);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// msgpack/structure decode failed for this entry's value. Skip rather than
|
|
91
|
+
// fall through to a guaranteed downstream crash, and intentionally drop the
|
|
92
|
+
// error: every corrupt entry would otherwise log a stack trace per iteration
|
|
93
|
+
// (millions of these were observed in prod). The total skip count is logged
|
|
94
|
+
// once at the end of replay.
|
|
95
|
+
skipped++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if ((0, replayLogsGuards_ts_1.classifyAuditEntryForReplay)(extendedType, tableId, record !== undefined) === 'missing-record') {
|
|
99
|
+
skipped++;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
80
102
|
if (lastTimestamp !== version) {
|
|
81
103
|
lastTimestamp = version;
|
|
82
104
|
try {
|
|
@@ -160,6 +182,8 @@ function replayLogs(rootStore, tables) {
|
|
|
160
182
|
}
|
|
161
183
|
if (writes > 0)
|
|
162
184
|
logger.warn(`Replayed ${writes} records in ${rootStore.databaseName} database`);
|
|
185
|
+
if (skipped > 0)
|
|
186
|
+
logger.warn(`Skipped ${skipped} unrecoverable audit entries in ${rootStore.databaseName} database during replay`);
|
|
163
187
|
// we never actually release the lock because we only want to ever run one time
|
|
164
188
|
// rootStore.unlock('replayLogs');
|
|
165
189
|
});
|