@rocicorp/zero 1.11.0-canary.40 → 1.11.0-canary.41
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/out/zero/package.js +1 -1
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +1 -0
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +2 -1
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +6 -9
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +6 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +5 -5
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +20 -12
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +21 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +73 -38
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +13 -3
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +7 -4
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-streamer-service.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/change-streamer-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAcjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,mCAAmC,CAAC;AAM3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2CAA2C,CAAC;AAajF,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEvB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"change-streamer-service.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/change-streamer-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { DEFAULT_MAX_RETRY_DELAY_MS, RunningState, UnrecoverableError } from "..
|
|
|
8
8
|
import { min } from "../../types/lexi-version.js";
|
|
9
9
|
import { publishCriticalEvent } from "../../observability/events.js";
|
|
10
10
|
import { Subscription } from "../../types/subscription.js";
|
|
11
|
-
import { AutoResetSignal,
|
|
11
|
+
import { AutoResetSignal, checkReplicationConfig, markResetRequired } from "./schema/tables.js";
|
|
12
12
|
import { publishReplicationError, replicationStatusError } from "../replicator/replication-status.js";
|
|
13
13
|
import "./change-streamer.js";
|
|
14
14
|
import { BackfillStateTracker } from "./backfill-state-tracker.js";
|
|
@@ -36,13 +36,12 @@ import { getDefaultHighWaterMark } from "node:stream";
|
|
|
36
36
|
* Performs initialization and schema migrations to initialize a ChangeStreamerImpl.
|
|
37
37
|
*/
|
|
38
38
|
async function initializeStreamer(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDB, changeSource, replicationStatusPublisher, subscriptionState, backupConfig, purgeLock, autoReset, opts, setTimeoutFn = setTimeout) {
|
|
39
|
-
await
|
|
39
|
+
if (opts.pgChangeLogEnabled) await checkReplicationConfig(lc, changeDB, subscriptionState, shard, autoReset, opts.pgChangeLogBehindSlot);
|
|
40
40
|
const changeDBProvider = (applicationName, max) => postgres(defu({
|
|
41
41
|
max,
|
|
42
42
|
connection: { ["application_name"]: applicationName }
|
|
43
43
|
}, changeDB.options));
|
|
44
|
-
|
|
45
|
-
return new ChangeStreamerImpl(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, replicaVersion, changeSource, replicationStatusPublisher, backupConfig, purgeLock, autoReset, opts, setTimeoutFn);
|
|
44
|
+
return new ChangeStreamerImpl(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, subscriptionState, changeSource, replicationStatusPublisher, backupConfig, purgeLock, autoReset, opts, setTimeoutFn);
|
|
46
45
|
}
|
|
47
46
|
var REPLICATION_STATUS_ERROR_DELAY_THRESHOLD_MS = 5e3;
|
|
48
47
|
var DEFAULT_CHANGE_LOG_UNAVAILABLE_WARN_THRESHOLD_MS = 6e4;
|
|
@@ -193,6 +192,7 @@ var ChangeStreamerImpl = class {
|
|
|
193
192
|
#source;
|
|
194
193
|
#storer;
|
|
195
194
|
#pgChangeLogEnabled;
|
|
195
|
+
#pgChangeLogBehindSlot;
|
|
196
196
|
#forwarder;
|
|
197
197
|
#reservations;
|
|
198
198
|
#restoreAdmission;
|
|
@@ -239,21 +239,23 @@ var ChangeStreamerImpl = class {
|
|
|
239
239
|
#lastForwardedCommitWatermark;
|
|
240
240
|
#transactionForwardStartedAt;
|
|
241
241
|
#currentTransactionCompletion;
|
|
242
|
-
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider,
|
|
242
|
+
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, subscriptionState, source, replicationStatusPublisher, backupConfig, initialPurgeLock, autoReset, opts, setTimeoutFn = setTimeout) {
|
|
243
243
|
this.id = `change-streamer`;
|
|
244
244
|
this.#lc = lc.withContext("component", "change-streamer");
|
|
245
245
|
this.#backfills = new BackfillStateTracker(this.#lc);
|
|
246
246
|
this.#shard = shard;
|
|
247
247
|
this.#changeDBProvider = changeDBProvider;
|
|
248
|
+
const { replicaVersion } = subscriptionState;
|
|
248
249
|
this.#replicaVersion = replicaVersion;
|
|
249
250
|
this.#source = source;
|
|
250
251
|
this.#pgChangeLogEnabled = opts.pgChangeLogEnabled;
|
|
252
|
+
this.#pgChangeLogBehindSlot = opts.pgChangeLogBehindSlot;
|
|
251
253
|
if (!this.#pgChangeLogEnabled) {
|
|
252
254
|
assert(opts.sqliteChangeLogWriter && opts.sqliteChangeLogPurge && opts.sqliteCatchup && opts.sqliteChangeLogServe?.readPercent === 100 && opts.sqliteChangeLogServe.coldReadPercent === 100 && backupConfig?.litestreamVersion === "v5", "disabling the PG change log requires SQLite serving at 100 percent and a v5 backup");
|
|
253
255
|
assert(opts.sqliteChangeLogCompare === void 0, "SQLite change-log comparison requires the PG change log");
|
|
254
256
|
}
|
|
255
257
|
assert(!(this.#pgChangeLogEnabled && opts.pgChangeLogBehindSlot && !backupConfig?.replicaFile), "the PG change log is behind the replication slot, but there is no restored replica to re-initialize it from");
|
|
256
|
-
this.#storer = new Storer(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider,
|
|
258
|
+
this.#storer = new Storer(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, subscriptionState, (consumed) => this.#acker.trackPgChangeLog(consumed[2].watermark), (err) => this.stop(err), opts);
|
|
257
259
|
this.#forwarder = new Forwarder(lc, {
|
|
258
260
|
flowControlConsensusTimeoutProportion: opts.flowControlConsensusTimeoutProportion,
|
|
259
261
|
flowControlSlowSubscriberGracePeriodMs: opts.flowControlSlowSubscriberGracePeriodMs
|
|
@@ -337,17 +339,23 @@ var ChangeStreamerImpl = class {
|
|
|
337
339
|
const lagReportInit = await this.#source.startLagReporter();
|
|
338
340
|
this.#lagReportingDisabled.resolve(!lagReportInit);
|
|
339
341
|
if (lagReportInit) this.#latestLagReportCommitTimeMs = lagReportInit.firstCommitTimeMs;
|
|
340
|
-
|
|
341
|
-
purgeLock: this.#purgeLock,
|
|
342
|
-
requestRestart: (reason) => this.#backfills.requestRestart(reason)
|
|
343
|
-
});
|
|
344
|
-
this.#purgeLock = null;
|
|
342
|
+
let takeoverPending = this.#pgChangeLogEnabled;
|
|
345
343
|
const flushBytesThreshold = getDefaultHighWaterMark(false);
|
|
346
344
|
while (this.#state.shouldRun()) {
|
|
347
345
|
let err;
|
|
348
346
|
let watermark = null;
|
|
349
347
|
let unflushedBytes = 0;
|
|
350
348
|
try {
|
|
349
|
+
if (takeoverPending) {
|
|
350
|
+
await this.#storer.assumeOwnershipAtHead({
|
|
351
|
+
purgeLock: this.#purgeLock,
|
|
352
|
+
requestRestart: (reason) => this.#backfills.requestRestart(reason),
|
|
353
|
+
autoReset: this.#autoReset,
|
|
354
|
+
pgChangeLogBehindSlot: this.#pgChangeLogBehindSlot
|
|
355
|
+
});
|
|
356
|
+
takeoverPending = false;
|
|
357
|
+
this.#purgeLock = null;
|
|
358
|
+
}
|
|
351
359
|
const { lastWatermark, backfillRequests: logBackfillRequests } = await this.#initializer.initialize();
|
|
352
360
|
const backfillRequests = this.#backfills.startStream(this.#pgChangeLogEnabled ? logBackfillRequests : []);
|
|
353
361
|
this.#lastForwardedCommitWatermark = lastWatermark;
|
|
@@ -448,7 +456,7 @@ var ChangeStreamerImpl = class {
|
|
|
448
456
|
const { tag } = msg;
|
|
449
457
|
switch (tag) {
|
|
450
458
|
case "reset-required":
|
|
451
|
-
await markResetRequired(this.#changeDBProvider("change-streamer-reset", 1), this.#shard);
|
|
459
|
+
if (this.#pgChangeLogEnabled) await markResetRequired(this.#changeDBProvider("change-streamer-reset", 1), this.#shard);
|
|
452
460
|
await publishReplicationError(this.#lc, "Replicating", msg.message ?? "Resync required", msg.errorDetails);
|
|
453
461
|
if (this.#autoReset) {
|
|
454
462
|
this.#lc.warn?.("shutting down for auto-reset");
|