@rocicorp/zero 1.10.0-canary.2 → 1.10.0-canary.21
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/replicache/src/btree/read.d.ts +12 -1
- package/out/replicache/src/btree/read.d.ts.map +1 -1
- package/out/replicache/src/btree/read.js +24 -12
- package/out/replicache/src/btree/read.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +27 -4
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +11 -0
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +43 -3
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +12 -5
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +14 -2
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/replicache/src/transactions.d.ts.map +1 -1
- package/out/replicache/src/transactions.js +1 -1
- package/out/replicache/src/transactions.js.map +1 -1
- package/out/shared/src/error.d.ts +11 -0
- package/out/shared/src/error.d.ts.map +1 -1
- package/out/shared/src/error.js +35 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/hash.d.ts.map +1 -1
- package/out/shared/src/hash.js +105 -10
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/map.d.ts +7 -2
- package/out/shared/src/map.d.ts.map +1 -1
- package/out/shared/src/map.js.map +1 -1
- package/out/shared/src/promise-race.d.ts +14 -0
- package/out/shared/src/promise-race.d.ts.map +1 -1
- package/out/shared/src/promise-race.js +32 -1
- package/out/shared/src/promise-race.js.map +1 -1
- package/out/zero/package.js +2 -3
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +8 -1
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +5 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +16 -3
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +36 -7
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +121 -46
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/create.d.ts.map +1 -1
- package/out/zero-cache/src/db/create.js +4 -1
- package/out/zero-cache/src/db/create.js.map +1 -1
- package/out/zero-cache/src/db/index-predicate.d.ts +4 -0
- package/out/zero-cache/src/db/index-predicate.d.ts.map +1 -0
- package/out/zero-cache/src/db/index-predicate.js +46 -0
- package/out/zero-cache/src/db/index-predicate.js.map +1 -0
- package/out/zero-cache/src/db/lite-tables.d.ts +10 -2
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +8 -3
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -3
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/specs.d.ts +41 -0
- package/out/zero-cache/src/db/specs.d.ts.map +1 -1
- package/out/zero-cache/src/db/specs.js +30 -3
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.d.ts +5 -15
- package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js +39 -73
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +27 -15
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +4 -4
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +8 -4
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +1 -1
- package/out/zero-cache/src/server/worker-urls.d.ts +0 -1
- package/out/zero-cache/src/server/worker-urls.d.ts.map +1 -1
- package/out/zero-cache/src/server/worker-urls.js +1 -2
- package/out/zero-cache/src/server/worker-urls.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +12 -2
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +14 -3
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +10 -41
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +3 -2
- 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 +42 -16
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +34 -2
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +47 -19
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.js +20 -11
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +1 -0
- 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 +58 -80
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +20 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +43 -3
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +24 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +35 -5
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1513 -229
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +19 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +581 -0
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +15 -6
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +137 -20
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js +82 -13
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +128 -21
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +5 -5
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +2 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -0
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts +1 -4
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +11 -18
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +8 -3
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +4 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts +34 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.js +67 -0
- package/out/zero-cache/src/services/change-streamer/change-log-compare-digest.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -4
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +8 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +34 -13
- 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 +165 -36
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +4 -9
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +12 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +11 -5
- package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts +11 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.js +19 -0
- package/out/zero-cache/src/services/change-streamer/shard-sampling.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +11 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +38 -5
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts +25 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +95 -12
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts +83 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +417 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts +73 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js +157 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +8 -3
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +63 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +217 -49
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +8 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +10 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +29 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +154 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +1 -0
- package/out/zero-cache/src/services/http-service.d.ts +1 -0
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.js +7 -3
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +16 -7
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +15 -1
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +131 -0
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +70 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.js +101 -0
- package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -0
- package/out/zero-cache/src/services/litestream/metrics.d.ts +1 -0
- package/out/zero-cache/src/services/litestream/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/metrics.js +4 -1
- package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts +10 -0
- package/out/zero-cache/src/services/replicator/change-log-db.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js +15 -1
- package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +18 -21
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +2 -6
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +2 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +3 -2
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +8 -6
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +27 -2
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js +3 -2
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js +24 -5
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -2
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +25 -17
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +14 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +6 -2
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/downstream.d.ts +11 -0
- package/out/zero-cache/src/types/downstream.d.ts.map +1 -0
- package/out/zero-cache/src/types/pg.d.ts +15 -2
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +21 -8
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/poke-chunk.d.ts +18 -0
- package/out/zero-cache/src/types/poke-chunk.d.ts.map +1 -0
- package/out/zero-cache/src/types/poke-chunk.js +57 -0
- package/out/zero-cache/src/types/poke-chunk.js.map +1 -0
- package/out/zero-cache/src/types/processes.js +1 -4
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +4 -9
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +2 -11
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +4 -25
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +22 -4
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +112 -14
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts +1 -0
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +4 -2
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +46 -0
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +15 -0
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +44 -0
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js +19 -12
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-poke-handler.d.ts +7 -2
- package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js +52 -2
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +9 -6
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +98 -25
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.d.ts +1 -1
- package/out/zero-protocol/src/down.d.ts +1 -1
- package/out/zero-protocol/src/error.d.ts +4 -4
- package/out/zero-protocol/src/inspect-down.js +1 -1
- package/out/zero-protocol/src/mutate-server.d.ts +2 -2
- package/out/zero-protocol/src/poke.d.ts +89 -7
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +16 -8
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +12 -7
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/push.d.ts +1 -1
- package/out/zero-protocol/src/query-server.d.ts +2 -2
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +5 -3
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js +8 -3
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts +44 -0
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -0
- package/out/zql/src/ivm/deferred-input.js +88 -0
- package/out/zql/src/ivm/deferred-input.js.map +1 -0
- package/out/zql/src/ivm/memory-source.d.ts +10 -2
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +19 -16
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/stream.d.ts +0 -1
- package/out/zql/src/ivm/stream.d.ts.map +1 -1
- package/out/zql/src/ivm/stream.js +1 -7
- package/out/zql/src/ivm/stream.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +11 -2
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +6 -1
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +6 -0
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +73 -10
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +22 -0
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +2 -1
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js +1 -0
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +3 -2
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +2 -3
- package/out/zero-cache/src/server/backup-watermark-poller.js +0 -31
- package/out/zero-cache/src/server/backup-watermark-poller.js.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts +0 -57
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.d.ts.map +0 -1
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js +0 -137
- package/out/zero-cache/src/services/litestream/vfs-watermark-poller.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { assert, unreachable } from "../../../../shared/src/asserts.js";
|
|
2
2
|
import { promiseVoid } from "../../../../shared/src/resolved-promises.js";
|
|
3
3
|
import { must } from "../../../../shared/src/must.js";
|
|
4
|
+
import { promiseOrAbort } from "../../../../shared/src/promise-race.js";
|
|
4
5
|
import "../change-source/protocol/current/downstream.js";
|
|
5
6
|
import { getOrCreateCounter, getOrCreateLatencyHistogram } from "../../observability/metrics.js";
|
|
6
7
|
import { DEFAULT_MAX_RETRY_DELAY_MS, RunningState, UnrecoverableError } from "../running-state.js";
|
|
@@ -15,12 +16,16 @@ import { ChangeLogInitializer, replicaInitializationSource } from "./change-log-
|
|
|
15
16
|
import { Forwarder } from "./forwarder.js";
|
|
16
17
|
import { SnapshotReservations } from "./snapshot-reservations.js";
|
|
17
18
|
import { SQLiteChangeLogCatchup } from "./sqlite-change-log-catchup.js";
|
|
19
|
+
import { SQLiteChangeLogComparator } from "./sqlite-change-log-comparator.js";
|
|
18
20
|
import { SQLiteChangeLogPurgeScheduler } from "./sqlite-change-log-purge-scheduler.js";
|
|
21
|
+
import { SQLiteChangeLogReadRouter, inspectSQLiteChangeLog } from "./sqlite-change-log-read-router.js";
|
|
19
22
|
import { SQLiteChangeLogWriter } from "./sqlite-change-log-writer.js";
|
|
20
23
|
import { Storer } from "./storer.js";
|
|
21
24
|
import { Subscriber } from "./subscriber.js";
|
|
22
25
|
import { UpstreamAcker } from "./upstream-acker.js";
|
|
23
26
|
import { resolver } from "@rocicorp/resolver";
|
|
27
|
+
import { defu } from "defu";
|
|
28
|
+
import postgres from "postgres";
|
|
24
29
|
import { getDefaultHighWaterMark } from "node:stream";
|
|
25
30
|
//#region ../zero-cache/src/services/change-streamer/change-streamer-service.ts
|
|
26
31
|
/**
|
|
@@ -28,8 +33,12 @@ import { getDefaultHighWaterMark } from "node:stream";
|
|
|
28
33
|
*/
|
|
29
34
|
async function initializeStreamer(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDB, changeSource, replicationStatusPublisher, subscriptionState, backupConfig, purgeLock, autoReset, opts, setTimeoutFn = setTimeout) {
|
|
30
35
|
await ensureReplicationConfig(lc, changeDB, subscriptionState, shard, autoReset, purgeLock ?? void 0, setTimeoutFn);
|
|
36
|
+
const changeDBProvider = (applicationName, max) => postgres(defu({
|
|
37
|
+
max,
|
|
38
|
+
connection: { ["application_name"]: applicationName }
|
|
39
|
+
}, changeDB.options));
|
|
31
40
|
const { replicaVersion } = subscriptionState;
|
|
32
|
-
return new ChangeStreamerImpl(lc, shard, taskID, discoveryAddress, discoveryProtocol,
|
|
41
|
+
return new ChangeStreamerImpl(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, replicaVersion, changeSource, replicationStatusPublisher, backupConfig, purgeLock, autoReset, opts, setTimeoutFn);
|
|
33
42
|
}
|
|
34
43
|
var REPLICATION_STATUS_ERROR_DELAY_THRESHOLD_MS = 5e3;
|
|
35
44
|
var DEFAULT_CHANGE_LOG_UNAVAILABLE_WARN_THRESHOLD_MS = 6e4;
|
|
@@ -175,7 +184,7 @@ var ChangeStreamerImpl = class {
|
|
|
175
184
|
id;
|
|
176
185
|
#lc;
|
|
177
186
|
#shard;
|
|
178
|
-
#
|
|
187
|
+
#changeDBProvider;
|
|
179
188
|
#replicaVersion;
|
|
180
189
|
#source;
|
|
181
190
|
#storer;
|
|
@@ -185,14 +194,19 @@ var ChangeStreamerImpl = class {
|
|
|
185
194
|
#sqliteCatchupOptions;
|
|
186
195
|
#changeLogWriter;
|
|
187
196
|
#purgeScheduler;
|
|
197
|
+
#comparator;
|
|
188
198
|
#acker;
|
|
189
199
|
#initializer;
|
|
200
|
+
#readRouter;
|
|
190
201
|
#autoReset;
|
|
191
202
|
#state;
|
|
192
203
|
#serving = resolver();
|
|
193
204
|
#txCounter = getOrCreateCounter("replication", "transactions", "Count of replicated transactions");
|
|
194
205
|
#changeCounter = getOrCreateCounter("replication", "changes", "Count of replicated changes (DML or DDL statements)");
|
|
195
206
|
#transactionForwardDuration = getOrCreateLatencyHistogram("replication", "transaction_forward_duration", "Time from receiving a transaction's `begin` to forwarding its `commit`, i.e. the change-streamer half of forward-to-subscriber latency.");
|
|
207
|
+
#catchupRoutes = getOrCreateCounter("replication", "sqlite_change_log.catchup_routes", "Catchup subscriptions by selected source and low-cardinality reason.");
|
|
208
|
+
#reservationDemotions = getOrCreateCounter("replication", "sqlite_change_log.reservation_demotions", "Snapshot reservations demoted from SQLite to PG because the change log could not cover the backup being restored. With PG retired these followers have no fallback, so this is the rate at which one would instead have to wait for a later backup.");
|
|
209
|
+
#reservationConfirmDelays = getOrCreateCounter("replication", "sqlite_change_log.reservation_confirm_delays", "Snapshot reservations whose confirmation was deferred because the selected source's change-log minimum was later than the backup watermark. Counted once per reservation, by that source.");
|
|
196
210
|
#latestStatus;
|
|
197
211
|
#latestLagReportCommitTimeMs = 0;
|
|
198
212
|
#backupWatermark;
|
|
@@ -216,19 +230,34 @@ var ChangeStreamerImpl = class {
|
|
|
216
230
|
#lastForwardedCommitWatermark;
|
|
217
231
|
#transactionForwardStartedAt;
|
|
218
232
|
#currentTransactionCompletion;
|
|
219
|
-
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol,
|
|
233
|
+
constructor(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, replicaVersion, source, replicationStatusPublisher, backupConfig, initialPurgeLock, autoReset, opts, setTimeoutFn = setTimeout) {
|
|
220
234
|
this.id = `change-streamer`;
|
|
221
235
|
this.#lc = lc.withContext("component", "change-streamer");
|
|
222
236
|
this.#shard = shard;
|
|
223
|
-
this.#
|
|
237
|
+
this.#changeDBProvider = changeDBProvider;
|
|
224
238
|
this.#replicaVersion = replicaVersion;
|
|
225
239
|
this.#source = source;
|
|
226
|
-
this.#storer = new Storer(lc, shard, taskID, discoveryAddress, discoveryProtocol,
|
|
240
|
+
this.#storer = new Storer(lc, shard, taskID, discoveryAddress, discoveryProtocol, changeDBProvider, replicaVersion, (consumed) => this.#acker.trackPgChangeLog(consumed[2].watermark), (err) => this.stop(err), opts);
|
|
227
241
|
this.#forwarder = new Forwarder(lc, {
|
|
228
242
|
flowControlConsensusTimeoutProportion: opts.flowControlConsensusTimeoutProportion,
|
|
229
243
|
flowControlSlowSubscriberGracePeriodMs: opts.flowControlSlowSubscriberGracePeriodMs
|
|
230
244
|
});
|
|
231
|
-
|
|
245
|
+
const serveOptions = opts.sqliteChangeLogServe;
|
|
246
|
+
const writerOptions = opts.sqliteChangeLogWriter;
|
|
247
|
+
const catchupOptions = opts.sqliteCatchup;
|
|
248
|
+
this.#readRouter = serveOptions && writerOptions && catchupOptions ? new SQLiteChangeLogReadRouter({
|
|
249
|
+
shard,
|
|
250
|
+
readPercent: serveOptions.readPercent,
|
|
251
|
+
coldReadPercent: serveOptions.coldReadPercent,
|
|
252
|
+
retentionMs: serveOptions.retentionMs,
|
|
253
|
+
failureCooldownMs: serveOptions.failureCooldownMs,
|
|
254
|
+
now: serveOptions.now,
|
|
255
|
+
inspect: serveOptions.inspect ?? (() => inspectSQLiteChangeLog(lc, catchupOptions.changeLogFile, writerOptions.identity))
|
|
256
|
+
}) : void 0;
|
|
257
|
+
this.#reservations = backupConfig ? new SnapshotReservations(lc, backupConfig, (taskID) => {
|
|
258
|
+
this.#readRouter?.release(taskID);
|
|
259
|
+
this.#purgeScheduler?.resume(taskID);
|
|
260
|
+
}) : void 0;
|
|
232
261
|
this.#replicationStatusPublisher = replicationStatusPublisher;
|
|
233
262
|
this.#changeLogWriter = opts.sqliteChangeLogWriter ? new SQLiteChangeLogWriter(lc, {
|
|
234
263
|
...opts.sqliteChangeLogWriter,
|
|
@@ -236,8 +265,15 @@ var ChangeStreamerImpl = class {
|
|
|
236
265
|
this.#sqliteCatchup?.onChangeLogCommit(watermark);
|
|
237
266
|
this.#purgeScheduler?.onWriterIdle();
|
|
238
267
|
},
|
|
239
|
-
onDisabled: () =>
|
|
240
|
-
|
|
268
|
+
onDisabled: () => {
|
|
269
|
+
this.#readRouter?.trip(true);
|
|
270
|
+
this.#closeSQLiteCatchup();
|
|
271
|
+
this.#comparator?.stop();
|
|
272
|
+
},
|
|
273
|
+
onRebuilt: () => {
|
|
274
|
+
this.#closeSQLiteCatchup();
|
|
275
|
+
this.#comparator?.invalidate();
|
|
276
|
+
}
|
|
241
277
|
}) : void 0;
|
|
242
278
|
this.#purgeScheduler = opts.sqliteChangeLogPurge && this.#changeLogWriter ? new SQLiteChangeLogPurgeScheduler(lc, () => this.#changeLogWriter?.connection, () => this.#forwarder.getAcks(), opts.sqliteChangeLogPurge) : void 0;
|
|
243
279
|
this.#acker = new UpstreamAcker({
|
|
@@ -258,6 +294,10 @@ var ChangeStreamerImpl = class {
|
|
|
258
294
|
...opts.sqliteCatchup,
|
|
259
295
|
cleanupGuard: opts.sqliteCatchup.cleanupGuard ?? this.#purgeScheduler?.cleanupGuard
|
|
260
296
|
} : void 0;
|
|
297
|
+
this.#comparator = opts.sqliteChangeLogCompare && opts.sqliteChangeLogWriter && opts.sqliteCatchup ? new SQLiteChangeLogComparator(lc, shard, opts.sqliteCatchup.changeLogFile, opts.sqliteChangeLogWriter.identity, this.#storer, {
|
|
298
|
+
setTimeoutFn,
|
|
299
|
+
...opts.sqliteChangeLogCompare
|
|
300
|
+
}) : void 0;
|
|
261
301
|
this.#purgeLock = initialPurgeLock;
|
|
262
302
|
this.#autoReset = autoReset;
|
|
263
303
|
this.#state = new RunningState(this.id, void 0, setTimeoutFn);
|
|
@@ -327,12 +367,12 @@ var ChangeStreamerImpl = class {
|
|
|
327
367
|
} else {
|
|
328
368
|
const forwarded = this.#forwarder.forwardWithFlowControl(entry);
|
|
329
369
|
this.#recordForwardedTransactionBoundary(type, entry[0]);
|
|
330
|
-
await stream.changes.
|
|
370
|
+
await promiseOrAbort(forwarded, stream.changes.signal, this.#state.signal);
|
|
331
371
|
unflushedBytes = 0;
|
|
332
372
|
}
|
|
333
373
|
if (type === "commit" || type === "rollback") watermark = null;
|
|
334
374
|
const readyForMore = this.#storer.readyForMore();
|
|
335
|
-
if (readyForMore) await stream.changes.
|
|
375
|
+
if (readyForMore) await promiseOrAbort(readyForMore, stream.changes.signal, this.#state.signal);
|
|
336
376
|
}
|
|
337
377
|
} catch (e) {
|
|
338
378
|
err = e;
|
|
@@ -366,7 +406,7 @@ var ChangeStreamerImpl = class {
|
|
|
366
406
|
const { tag } = msg;
|
|
367
407
|
switch (tag) {
|
|
368
408
|
case "reset-required":
|
|
369
|
-
await markResetRequired(this.#
|
|
409
|
+
await markResetRequired(this.#changeDBProvider("change-streamer-reset", 1), this.#shard);
|
|
370
410
|
await publishReplicationError(this.#lc, "Replicating", msg.message ?? "Resync required", msg.errorDetails);
|
|
371
411
|
if (this.#autoReset) {
|
|
372
412
|
this.#lc.warn?.("shutting down for auto-reset");
|
|
@@ -381,24 +421,49 @@ var ChangeStreamerImpl = class {
|
|
|
381
421
|
if (mode === "serving") this.#serving.resolve();
|
|
382
422
|
let cleanupSubscriber = () => {};
|
|
383
423
|
const downstream = Subscription.create({ cleanup: () => cleanupSubscriber() });
|
|
384
|
-
const subscriber = new Subscriber(protocolVersion, id, watermark, downstream, () => this.#latestStatus, {});
|
|
424
|
+
const subscriber = new Subscriber(protocolVersion, id, mode, watermark, downstream, () => this.#latestStatus, {});
|
|
385
425
|
const lc = this.#lc.withContext("subscriber", subscriber.id);
|
|
386
|
-
|
|
426
|
+
const removeFromForwarder = () => {
|
|
387
427
|
lc.info?.(`removing subscriber ${subscriber.id}`);
|
|
388
428
|
this.#forwarder.remove(subscriber);
|
|
389
429
|
};
|
|
430
|
+
cleanupSubscriber = removeFromForwarder;
|
|
390
431
|
if (replicaVersion !== this.#replicaVersion) {
|
|
391
432
|
lc.warn?.(`rejecting subscriber at replica version ${replicaVersion}`);
|
|
392
433
|
subscriber.close(1, `current replica version is ${this.#replicaVersion} (requested ${replicaVersion})`);
|
|
393
434
|
} else {
|
|
394
435
|
lc.info?.(`adding subscriber ${subscriber.id}`);
|
|
395
|
-
const
|
|
396
|
-
|
|
397
|
-
cleanupSubscriber = () => sqliteCatchup.remove(subscriber);
|
|
398
|
-
await sqliteCatchup.catchup(subscriber, () => this.#captureRequiredHead());
|
|
399
|
-
} else {
|
|
436
|
+
const catchupFromPG = () => {
|
|
437
|
+
cleanupSubscriber = removeFromForwarder;
|
|
400
438
|
this.#forwarder.add(subscriber);
|
|
401
439
|
this.#storer.catchup(subscriber, mode);
|
|
440
|
+
};
|
|
441
|
+
const sqliteSelection = this.#selectSQLiteCatchup(lc, ctx);
|
|
442
|
+
if (!sqliteSelection) catchupFromPG();
|
|
443
|
+
else {
|
|
444
|
+
const { catchup, reason, coverage, logWarm } = sqliteSelection;
|
|
445
|
+
cleanupSubscriber = () => catchup.remove(subscriber);
|
|
446
|
+
const registration = await catchup.catchup(subscriber, () => this.#captureRequiredHead(), { logWarm });
|
|
447
|
+
switch (registration.kind) {
|
|
448
|
+
case "registered":
|
|
449
|
+
lc.debug?.(`serving ${ctx.id} from SQLite catchup`, ...coverage ? [{ sqliteChangeLogCoverage: coverage }] : []);
|
|
450
|
+
this.#recordCatchupRoute("sqlite", reason);
|
|
451
|
+
break;
|
|
452
|
+
case "uncovered":
|
|
453
|
+
lc.info?.(`serving ${ctx.id} from PG catchup: subscriber watermark ${ctx.watermark} is below the SQLite change-log minimum ` + registration.minWatermark);
|
|
454
|
+
this.#recordCatchupRoute("pg", "watermark-uncovered");
|
|
455
|
+
catchupFromPG();
|
|
456
|
+
break;
|
|
457
|
+
case "declined":
|
|
458
|
+
lc.error?.(`serving ${ctx.id} from PG catchup: SQLite catchup registration failed`, registration.error);
|
|
459
|
+
this.#recordCatchupRoute("pg", "registration-failed");
|
|
460
|
+
catchupFromPG();
|
|
461
|
+
break;
|
|
462
|
+
case "handled":
|
|
463
|
+
this.#recordCatchupRoute("sqlite", "registration-handled");
|
|
464
|
+
break;
|
|
465
|
+
default: unreachable(registration);
|
|
466
|
+
}
|
|
402
467
|
}
|
|
403
468
|
}
|
|
404
469
|
this.#reservations?.close(ctx.taskID);
|
|
@@ -409,6 +474,8 @@ var ChangeStreamerImpl = class {
|
|
|
409
474
|
const downstream = this.#reservations.open(taskID);
|
|
410
475
|
try {
|
|
411
476
|
await (this.#purgeScheduler?.pause(taskID) ?? promiseVoid);
|
|
477
|
+
if (!this.#reservations.isCurrent(taskID, downstream)) return downstream;
|
|
478
|
+
this.#readRouter?.pin(taskID);
|
|
412
479
|
await this.#confirmReservations();
|
|
413
480
|
return downstream;
|
|
414
481
|
} catch (e) {
|
|
@@ -425,10 +492,30 @@ var ChangeStreamerImpl = class {
|
|
|
425
492
|
this.#confirmReservations().catch((e) => this.#lc.warn?.(`error confirming snapshot reservation`, e));
|
|
426
493
|
}
|
|
427
494
|
async #confirmReservations() {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
495
|
+
const backupWatermark = this.#backupWatermark;
|
|
496
|
+
const reservations = this.#reservations;
|
|
497
|
+
if (backupWatermark === void 0 || !reservations?.confirmationsRequired()) return;
|
|
498
|
+
const pgState = await this.#getChangeLogState();
|
|
499
|
+
for (const taskID of reservations.unconfirmedTaskIDs()) {
|
|
500
|
+
let route = this.#readRouter?.peek(taskID);
|
|
501
|
+
if (this.#readRouter && route === void 0) continue;
|
|
502
|
+
if (route?.source === "sqlite") {
|
|
503
|
+
const coverage = must(route.coverage, "a pinned SQLite route must carry its covered range");
|
|
504
|
+
if (coverage.minWatermark > backupWatermark) {
|
|
505
|
+
this.#lc.info?.(`demoting ${taskID} to PG catchup: SQLite change-log minimum ${coverage.minWatermark} is later than backupWatermark ` + backupWatermark);
|
|
506
|
+
this.#reservationDemotions.add(1);
|
|
507
|
+
route = must(this.#readRouter).demote(taskID);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
const source = route?.source ?? "pg";
|
|
511
|
+
let minWatermark;
|
|
512
|
+
if (route?.source === "sqlite") minWatermark = must(route.coverage, "a pinned SQLite route must carry its covered range").minWatermark;
|
|
513
|
+
else ({minWatermark} = pgState);
|
|
514
|
+
if (minWatermark <= backupWatermark) reservations.confirmFor(taskID, pgState.replicaVersion, backupWatermark, source);
|
|
515
|
+
else {
|
|
516
|
+
if (reservations.noteConfirmationDelayed(taskID)) this.#reservationConfirmDelays.add(1);
|
|
517
|
+
this.#lc.error?.(`pg change-log minWatermark ${minWatermark} is later than backupWatermark ${backupWatermark}. Delaying confirmation of snapshot reservation until next backup.`);
|
|
518
|
+
}
|
|
432
519
|
}
|
|
433
520
|
}
|
|
434
521
|
#maybeSchedulePGPurge() {
|
|
@@ -517,6 +604,7 @@ var ChangeStreamerImpl = class {
|
|
|
517
604
|
this.#state.stop(this.#lc, err);
|
|
518
605
|
this.#stream?.changes.cancel();
|
|
519
606
|
this.#purgeScheduler?.stop();
|
|
607
|
+
this.#comparator?.stop();
|
|
520
608
|
this.#sqliteCatchup?.close();
|
|
521
609
|
this.#changeLogWriter?.close();
|
|
522
610
|
await Promise.allSettled([this.#storer.stop(), this.#source.stop()]);
|
|
@@ -574,19 +662,57 @@ var ChangeStreamerImpl = class {
|
|
|
574
662
|
assert(committed, "last forwarded commit watermark is not initialized");
|
|
575
663
|
return this.#currentTransactionCompletion?.promise.then((completion) => completion.watermark) ?? committed;
|
|
576
664
|
}
|
|
577
|
-
#selectSQLiteCatchup(ctx) {
|
|
665
|
+
#selectSQLiteCatchup(lc, ctx) {
|
|
578
666
|
const opts = this.#sqliteCatchupOptions;
|
|
579
|
-
if (this.#lastForwardedCommitWatermark === void 0 || !opts)
|
|
667
|
+
if (this.#lastForwardedCommitWatermark === void 0 || !opts) {
|
|
668
|
+
this.#recordCatchupRoute("pg", "not-ready");
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
580
671
|
if (ctx.mode !== "serving") {
|
|
581
|
-
|
|
672
|
+
lc.info?.(`not serving backup subscriber ${ctx.id} from SQLite catchup`);
|
|
673
|
+
this.#recordCatchupRoute("pg", "ineligible-mode");
|
|
582
674
|
return;
|
|
583
675
|
}
|
|
584
|
-
|
|
585
|
-
|
|
676
|
+
let route;
|
|
677
|
+
if (this.#readRouter) {
|
|
678
|
+
route = this.#readRouter.consume(ctx.taskID);
|
|
679
|
+
if (route.source === "pg") {
|
|
680
|
+
if (route.reason === "cold-log") lc.info?.(`serving ${ctx.id} from PG catchup: SQLite change log is still warming`, { sqliteChangeLogCoverage: route.coverage });
|
|
681
|
+
else if (route.reason === "log-unavailable") this.#declineSQLiteCatchup(lc, ctx, opts, `${opts.changeLogFile} is unavailable or incompatible`);
|
|
682
|
+
else lc.debug?.(`serving ${ctx.id} from PG catchup: SQLite route ${route.reason}`, ...route.coverage ? [{ sqliteChangeLogCoverage: route.coverage }] : []);
|
|
683
|
+
this.#recordCatchupRoute("pg", route.reason);
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
const coverage = route.coverage;
|
|
687
|
+
assert(coverage, "a SQLite route must carry its covered range");
|
|
688
|
+
if (ctx.watermark < coverage.minWatermark) {
|
|
689
|
+
lc.info?.(`serving ${ctx.id} from PG catchup: subscriber watermark ${ctx.watermark} is below the SQLite change-log minimum ` + coverage.minWatermark, { sqliteChangeLogCoverage: coverage });
|
|
690
|
+
this.#recordCatchupRoute("pg", "watermark-uncovered");
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
if (!this.#readRouter && !opts.shouldUse?.(ctx)) {
|
|
695
|
+
this.#recordCatchupRoute("pg", "selector");
|
|
586
696
|
return;
|
|
587
697
|
}
|
|
588
|
-
if (!opts.shouldUse
|
|
589
|
-
|
|
698
|
+
if (this.#readRouter && opts.shouldUse && !opts.shouldUse(ctx)) {
|
|
699
|
+
this.#recordCatchupRoute("pg", "selector");
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
const catchup = this.#sqliteCatchup ?? this.#openSQLiteCatchup(lc, opts, ctx);
|
|
703
|
+
if (catchup) return {
|
|
704
|
+
catchup,
|
|
705
|
+
reason: route?.reason ?? "selector",
|
|
706
|
+
coverage: route?.coverage,
|
|
707
|
+
logWarm: route === void 0 ? void 0 : route.reason !== "selected-cold"
|
|
708
|
+
};
|
|
709
|
+
else this.#recordCatchupRoute("pg", "log-unavailable");
|
|
710
|
+
}
|
|
711
|
+
#recordCatchupRoute(source, reason) {
|
|
712
|
+
this.#catchupRoutes.add(1, {
|
|
713
|
+
source,
|
|
714
|
+
reason
|
|
715
|
+
});
|
|
590
716
|
}
|
|
591
717
|
/**
|
|
592
718
|
* Opens the change log and, if it can serve, wraps it in the coordinator that
|
|
@@ -601,18 +727,18 @@ var ChangeStreamerImpl = class {
|
|
|
601
727
|
* here instead. Neither the failure nor the reader is retained, so a later
|
|
602
728
|
* subscription retries from scratch.
|
|
603
729
|
*/
|
|
604
|
-
#openSQLiteCatchup(opts, ctx) {
|
|
730
|
+
#openSQLiteCatchup(lc, opts, ctx) {
|
|
605
731
|
let reader;
|
|
606
732
|
try {
|
|
607
733
|
reader = new SQLiteChangeLogReader(this.#lc, opts.changeLogFile);
|
|
608
734
|
if (reader.plan(ctx.watermark).kind === "not-ready") {
|
|
609
735
|
reader.close();
|
|
610
|
-
this.#declineSQLiteCatchup(ctx, opts, `${opts.changeLogFile} has no changes to serve yet`);
|
|
736
|
+
this.#declineSQLiteCatchup(lc, ctx, opts, `${opts.changeLogFile} has no changes to serve yet`);
|
|
611
737
|
return;
|
|
612
738
|
}
|
|
613
739
|
} catch (e) {
|
|
614
740
|
reader?.close();
|
|
615
|
-
this.#declineSQLiteCatchup(ctx, opts, `cannot read ${opts.changeLogFile}`, e);
|
|
741
|
+
this.#declineSQLiteCatchup(lc, ctx, opts, `cannot read ${opts.changeLogFile}`, e);
|
|
616
742
|
return;
|
|
617
743
|
}
|
|
618
744
|
this.#changeLogUnavailableSince = void 0;
|
|
@@ -620,7 +746,11 @@ var ChangeStreamerImpl = class {
|
|
|
620
746
|
batchSize: opts.readBatchRows,
|
|
621
747
|
barrierTimeoutMs: opts.barrierTimeoutMs,
|
|
622
748
|
barrierPollIntervalMs: opts.barrierPollIntervalMs,
|
|
623
|
-
cleanupGuard: opts.cleanupGuard
|
|
749
|
+
cleanupGuard: opts.cleanupGuard,
|
|
750
|
+
onFailure: (failure) => {
|
|
751
|
+
this.#lc.warn?.(`temporarily disabling SQLite catchup after ${failure}`);
|
|
752
|
+
this.#readRouter?.trip();
|
|
753
|
+
}
|
|
624
754
|
});
|
|
625
755
|
return this.#sqliteCatchup;
|
|
626
756
|
}
|
|
@@ -629,12 +759,11 @@ var ChangeStreamerImpl = class {
|
|
|
629
759
|
* unavailable so that a subscription that merely arrived before the writer's
|
|
630
760
|
* first reconcile does not look like an incident.
|
|
631
761
|
*/
|
|
632
|
-
#declineSQLiteCatchup(ctx, opts, reason, error) {
|
|
762
|
+
#declineSQLiteCatchup(lc, ctx, opts, reason, error) {
|
|
633
763
|
const now = Date.now();
|
|
634
764
|
this.#changeLogUnavailableSince ??= now;
|
|
635
765
|
const unavailableMs = now - this.#changeLogUnavailableSince;
|
|
636
|
-
|
|
637
|
-
this.#lc[unavailableMs >= threshold ? "warn" : "debug"]?.(`serving ${ctx.id} from PG catchup: ${reason} (unavailable for ${unavailableMs} ms)`, ...error === void 0 ? [] : [error]);
|
|
766
|
+
lc[unavailableMs >= (opts.notReadyWarnThresholdMs ?? DEFAULT_CHANGE_LOG_UNAVAILABLE_WARN_THRESHOLD_MS) ? "warn" : "debug"]?.(`serving ${ctx.id} from PG catchup: ${reason} (unavailable for ${unavailableMs} ms)`, ...error === void 0 ? [] : [error]);
|
|
638
767
|
}
|
|
639
768
|
};
|
|
640
769
|
var CLEANUP_DELAY_MS = DEFAULT_MAX_RETRY_DELAY_MS * 3;
|