orez 0.4.43 → 0.4.45
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/dist/pg-proxy-do-backend.d.ts +1 -0
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +32 -4
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/worker/zero-cache-replica-repair.d.ts +5 -0
- package/dist/worker/zero-cache-replica-repair.d.ts.map +1 -1
- package/dist/worker/zero-cache-replica-repair.js +37 -0
- package/dist/worker/zero-cache-replica-repair.js.map +1 -1
- package/package.json +2 -2
|
@@ -36,6 +36,7 @@ export declare class DoBackend {
|
|
|
36
36
|
private txChangeTablesSnapshotted;
|
|
37
37
|
private txMetadataDirty;
|
|
38
38
|
private txHasTrackedWrite;
|
|
39
|
+
private lastPersistedMetadata;
|
|
39
40
|
private txOwner;
|
|
40
41
|
constructor(doUrl: string, dbName?: string, namespace?: string, opts?: {
|
|
41
42
|
fetch?: typeof fetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"AAq/HA,wBAAsB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACzE,KAAK,CAAC;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACxD,CAAC,CACH,CAkDA;AAwkCD,qBAAa,SAAS;IACpB,KAAK,UAAQ;IACb,MAAM,UAAQ;IACd,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAoC;IAGxD,OAAO,CAAC,4BAA4B,CAAoB;IACxD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,OAAO,CAAiC;IAOhD,OAAO,CAAC,yBAAyB,CAAsC;IACvE,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,cAAc,CAAc;IAQpC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,iBAAiB,CAAI;IAM7B,OAAO,CAAC,yBAAyB,CAAQ;IAGzC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;
|
|
1
|
+
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -4764,6 +4764,14 @@ export class DoBackend {
|
|
|
4764
4764
|
// round-trip to durable storage after every DDL statement in a migration.
|
|
4765
4765
|
txMetadataDirty = false;
|
|
4766
4766
|
txHasTrackedWrite = false;
|
|
4767
|
+
// durable-metadata rows as last read/written (kind\0key\0subkey -> value).
|
|
4768
|
+
// persistDurableMetadata diffs against this and writes only changed rows —
|
|
4769
|
+
// a full INSERT OR REPLACE of the whole set on every dirty commit/rollback
|
|
4770
|
+
// is what let a crash-looping embed boot re-write ~700 identical
|
|
4771
|
+
// _orez_pg_metadata rows per cycle into the SQL DO until the write circuit
|
|
4772
|
+
// tripped (2026-07-09 prod incident). null until the first load/persist,
|
|
4773
|
+
// which falls back to a full write.
|
|
4774
|
+
lastPersistedMetadata = null;
|
|
4767
4775
|
// identifies the client process generation owning this backend's
|
|
4768
4776
|
// transactions in the durable tx journal. a process that knows its previous
|
|
4769
4777
|
// generation is dead (e.g. the zero-cache embed at boot) recovers orphaned
|
|
@@ -4855,11 +4863,13 @@ export class DoBackend {
|
|
|
4855
4863
|
try {
|
|
4856
4864
|
await this.ensureMetadataTable();
|
|
4857
4865
|
const result = await this.doExecResult(`SELECT kind, key, subkey, value FROM ${quoteIdentifier(METADATA_TABLE)}`);
|
|
4866
|
+
this.lastPersistedMetadata = new Map();
|
|
4858
4867
|
for (const row of result.rows) {
|
|
4859
4868
|
const kind = String(row.kind ?? '');
|
|
4860
4869
|
const key = String(row.key ?? '');
|
|
4861
4870
|
const subkey = String(row.subkey ?? '');
|
|
4862
4871
|
const value = String(row.value ?? '');
|
|
4872
|
+
this.lastPersistedMetadata.set(`${kind}\u0000${key}\u0000${subkey}`, value);
|
|
4863
4873
|
if (kind === 'schema-column') {
|
|
4864
4874
|
const metadata = JSON.parse(value);
|
|
4865
4875
|
let table = this.schemaMetadata.get(key);
|
|
@@ -4944,7 +4954,6 @@ export class DoBackend {
|
|
|
4944
4954
|
}
|
|
4945
4955
|
async persistDurableMetadata() {
|
|
4946
4956
|
try {
|
|
4947
|
-
await this.ensureMetadataTable();
|
|
4948
4957
|
const rows = [];
|
|
4949
4958
|
for (const [tableName, columns] of this.schemaMetadata) {
|
|
4950
4959
|
for (const [columnName, metadata] of columns) {
|
|
@@ -4964,21 +4973,40 @@ export class DoBackend {
|
|
|
4964
4973
|
JSON.stringify(child),
|
|
4965
4974
|
]);
|
|
4966
4975
|
}
|
|
4967
|
-
|
|
4976
|
+
// write only rows that differ from what durable storage already holds
|
|
4977
|
+
// (seeded by loadDurableMetadata, maintained below). every persisted row
|
|
4978
|
+
// is a real DO rows-written cost even when the value is identical —
|
|
4979
|
+
// INSERT OR REPLACE always rewrites — and this method fires on every
|
|
4980
|
+
// dirty commit AND every rollback, so a crash-looping embed boot used to
|
|
4981
|
+
// rewrite the entire set (~700 rows on a real app schema) several times
|
|
4982
|
+
// per ~4s cycle into the SQL DO until the write circuit tripped and
|
|
4983
|
+
// blocked auth (2026-07-09 prod incident).
|
|
4984
|
+
const known = this.lastPersistedMetadata;
|
|
4985
|
+
const changed = known === null
|
|
4986
|
+
? rows
|
|
4987
|
+
: rows.filter(([kind, key, subkey, value]) => known.get(`${kind}\u0000${key}\u0000${subkey}`) !== value);
|
|
4988
|
+
if (changed.length === 0)
|
|
4968
4989
|
return;
|
|
4990
|
+
await this.ensureMetadataTable();
|
|
4969
4991
|
// single multi-row INSERT OR REPLACE per chunk. previously this was one
|
|
4970
4992
|
// HTTP roundtrip per row, which dominated boot when migrations touched
|
|
4971
4993
|
// many columns. Cloudflare DO SQLite has a lower host-param cap than
|
|
4972
4994
|
// stock SQLite; 4 cols × 20 rows keeps metadata persistence comfortably
|
|
4973
4995
|
// below that limit.
|
|
4974
4996
|
const CHUNK = 20;
|
|
4975
|
-
|
|
4976
|
-
|
|
4997
|
+
const persisted = this.lastPersistedMetadata ?? new Map();
|
|
4998
|
+
this.lastPersistedMetadata = persisted;
|
|
4999
|
+
for (let i = 0; i < changed.length; i += CHUNK) {
|
|
5000
|
+
const chunk = changed.slice(i, i + CHUNK);
|
|
4977
5001
|
const placeholders = chunk.map(() => '(?, ?, ?, ?)').join(', ');
|
|
4978
5002
|
const params = [];
|
|
4979
5003
|
for (const row of chunk)
|
|
4980
5004
|
params.push(...row);
|
|
4981
5005
|
await this.doExecResult(`INSERT OR REPLACE INTO ${quoteIdentifier(METADATA_TABLE)} (kind, key, subkey, value) VALUES ${placeholders}`, params);
|
|
5006
|
+
// per-chunk so a mid-persist failure never marks unwritten rows as done
|
|
5007
|
+
for (const [kind, key, subkey, value] of chunk) {
|
|
5008
|
+
persisted.set(`${kind}\u0000${key}\u0000${subkey}`, value);
|
|
5009
|
+
}
|
|
4982
5010
|
}
|
|
4983
5011
|
}
|
|
4984
5012
|
catch { }
|