@rocicorp/zero 0.13.2025020500 → 0.13.2025020501
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/{chunk-H3C7QNPL.js → chunk-453TFLSU.js} +1055 -868
- package/out/chunk-453TFLSU.js.map +7 -0
- package/out/replicache/src/persist/collect-idb-databases.d.ts +2 -2
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +2 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/sync/patch.d.ts +5 -1
- package/out/replicache/src/sync/patch.d.ts.map +1 -1
- package/out/replicache/src/sync/pull.d.ts +2 -0
- package/out/replicache/src/sync/pull.d.ts.map +1 -1
- package/out/solid.js +1 -1
- package/out/zero-cache/src/db/migration.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration.js +1 -2
- package/out/zero-cache/src/db/migration.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 +1 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.js +1 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +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 +9 -7
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +2 -2
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +40 -27
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +5 -4
- 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 +44 -19
- 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 +1 -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 +21 -9
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +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 +57 -35
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js +61 -33
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.js +56 -43
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
- 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 +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +1 -1
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/crud.d.ts +5 -4
- package/out/zero-client/src/client/crud.d.ts.map +1 -1
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/ivm-source-repo.d.ts +13 -3
- package/out/zero-client/src/client/ivm-source-repo.d.ts.map +1 -1
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +8 -20
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-schema/src/name-mapper.d.ts +2 -2
- package/out/zero-schema/src/name-mapper.d.ts.map +1 -1
- package/out/zero-schema/src/name-mapper.js.map +1 -1
- package/out/zero.js +1 -1
- package/package.json +1 -1
- package/out/chunk-H3C7QNPL.js.map +0 -7
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { LogContext } from '@rocicorp/logger';
|
|
2
|
+
import { ident } from 'pg-format';
|
|
2
3
|
import postgres, {} from 'postgres';
|
|
3
4
|
import { AbortError } from "../../../../../shared/src/abort-error.js";
|
|
4
5
|
import { equals } from "../../../../../shared/src/set-utils.js";
|
|
6
|
+
export function cdcSchema(shardID) {
|
|
7
|
+
return `cdc_${shardID}`;
|
|
8
|
+
}
|
|
9
|
+
// For readability in the sql statements.
|
|
10
|
+
function schema(shardID) {
|
|
11
|
+
return ident(cdcSchema(shardID));
|
|
12
|
+
}
|
|
5
13
|
export const PG_SCHEMA = 'cdc';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
14
|
+
function createSchema(shardID) {
|
|
15
|
+
return `CREATE SCHEMA IF NOT EXISTS ${schema(shardID)};`;
|
|
16
|
+
}
|
|
17
|
+
function createChangeLogTable(shardID) {
|
|
18
|
+
return `
|
|
19
|
+
CREATE TABLE ${schema(shardID)}."changeLog" (
|
|
9
20
|
watermark TEXT,
|
|
10
21
|
pos INT8,
|
|
11
22
|
change JSONB NOT NULL,
|
|
@@ -13,54 +24,68 @@ const CREATE_CHANGE_LOG_TABLE = `
|
|
|
13
24
|
PRIMARY KEY (watermark, pos)
|
|
14
25
|
);
|
|
15
26
|
`;
|
|
16
|
-
|
|
17
|
-
|
|
27
|
+
}
|
|
28
|
+
export function createReplicationStateTable(shardID) {
|
|
29
|
+
return `
|
|
30
|
+
CREATE TABLE ${schema(shardID)}."replicationState" (
|
|
18
31
|
"lastWatermark" TEXT NOT NULL,
|
|
19
32
|
"owner" TEXT,
|
|
20
33
|
"lock" INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1)
|
|
21
34
|
);
|
|
22
35
|
`;
|
|
23
|
-
|
|
24
|
-
|
|
36
|
+
}
|
|
37
|
+
function createReplicationConfigTable(shardID) {
|
|
38
|
+
return `
|
|
39
|
+
CREATE TABLE ${schema(shardID)}."replicationConfig" (
|
|
25
40
|
"replicaVersion" TEXT NOT NULL,
|
|
26
41
|
"publications" TEXT[] NOT NULL,
|
|
27
42
|
"resetRequired" BOOL,
|
|
28
43
|
"lock" INTEGER PRIMARY KEY DEFAULT 1 CHECK (lock=1)
|
|
29
44
|
);
|
|
30
45
|
`;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
}
|
|
47
|
+
function createTables(shardID) {
|
|
48
|
+
return (createSchema(shardID) +
|
|
49
|
+
createChangeLogTable(shardID) +
|
|
50
|
+
createReplicationStateTable(shardID) +
|
|
51
|
+
createReplicationConfigTable(shardID));
|
|
52
|
+
}
|
|
53
|
+
export async function setupCDCTables(lc, db, shardID) {
|
|
36
54
|
lc.info?.(`Setting up CDC tables`);
|
|
37
|
-
await db.unsafe(
|
|
55
|
+
await db.unsafe(createTables(shardID));
|
|
38
56
|
}
|
|
39
|
-
export async function markResetRequired(db) {
|
|
40
|
-
|
|
57
|
+
export async function markResetRequired(db, shardID) {
|
|
58
|
+
const schema = cdcSchema(shardID);
|
|
59
|
+
await db `
|
|
60
|
+
UPDATE ${db(schema)}."replicationConfig"
|
|
61
|
+
SET "resetRequired" = true`;
|
|
41
62
|
}
|
|
42
|
-
export async function ensureReplicationConfig(lc, db, config, autoReset) {
|
|
63
|
+
export async function ensureReplicationConfig(lc, db, config, shardID, autoReset) {
|
|
43
64
|
// Restrict the fields of the supplied `config`.
|
|
44
65
|
const { publications, replicaVersion } = config;
|
|
45
66
|
const replicaConfig = { publications, replicaVersion };
|
|
46
67
|
const replicationState = {
|
|
47
68
|
lastWatermark: replicaVersion,
|
|
48
69
|
};
|
|
70
|
+
const schema = cdcSchema(shardID);
|
|
49
71
|
await db.begin(async (tx) => {
|
|
50
72
|
const stmts = [];
|
|
51
|
-
const results = await tx `
|
|
73
|
+
const results = await tx `
|
|
74
|
+
SELECT "replicaVersion", "publications", "resetRequired"
|
|
75
|
+
FROM ${tx(schema)}."replicationConfig"`;
|
|
52
76
|
if (results.length) {
|
|
53
77
|
const { replicaVersion, publications } = results[0];
|
|
54
78
|
if (replicaVersion !== replicaConfig.replicaVersion ||
|
|
55
79
|
!equals(new Set(publications), new Set(replicaConfig.publications))) {
|
|
56
80
|
lc.info?.(`Data in cdc tables @${replicaVersion} is incompatible ` +
|
|
57
81
|
`with replica @${replicaConfig.replicaVersion}. Clearing tables.`);
|
|
58
|
-
stmts.push(tx `TRUNCATE TABLE
|
|
82
|
+
stmts.push(tx `TRUNCATE TABLE ${tx(schema)}."changeLog"`, tx `TRUNCATE TABLE ${tx(schema)}."replicationConfig"`, tx `TRUNCATE TABLE ${tx(schema)}."replicationState"`);
|
|
59
83
|
}
|
|
60
84
|
}
|
|
61
85
|
// Initialize (or re-initialize TRUNCATED) tables
|
|
62
86
|
if (results.length === 0 || stmts.length > 0) {
|
|
63
|
-
stmts.push(tx `INSERT INTO
|
|
87
|
+
stmts.push(tx `INSERT INTO ${tx(schema)}."replicationConfig" ${tx(replicaConfig)}`, tx `INSERT INTO ${tx(schema)}."replicationState"
|
|
88
|
+
${tx(replicationState)}`);
|
|
64
89
|
return Promise.all(stmts);
|
|
65
90
|
}
|
|
66
91
|
const { resetRequired } = results[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,QAAQ,EAAE,EAA6B,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAC;AACpE,OAAO,EAAC,MAAM,EAAC,MAAM,wCAAwC,CAAC;AAI9D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAE/B,MAAM,
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/change-streamer/schema/tables.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,7 +39,7 @@ export declare class Storer implements Service {
|
|
|
39
39
|
#private;
|
|
40
40
|
readonly id = "storer";
|
|
41
41
|
readonly stopped: import("@rocicorp/resolver").Resolver<false, unknown>;
|
|
42
|
-
constructor(lc: LogContext, taskID: string, db: PostgresDB, replicaVersion: string, onConsumed: (c: Commit | StatusMessage) => void);
|
|
42
|
+
constructor(lc: LogContext, shardID: string, taskID: string, db: PostgresDB, replicaVersion: string, onConsumed: (c: Commit | StatusMessage) => void);
|
|
43
43
|
assumeOwnership(): Promise<void>;
|
|
44
44
|
getLastWatermark(): Promise<string>;
|
|
45
45
|
purgeRecordsBefore(watermark: string): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAU5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,KAAK,MAAM,EAAC,MAAM,iDAAiD,CAAC;AAC5E,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAIpE,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAc3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"storer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAU5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,KAAK,MAAM,EAAC,MAAM,iDAAiD,CAAC;AAC5E,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAIpE,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAc3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,MAAO,YAAW,OAAO;;IACpC,QAAQ,CAAC,EAAE,YAAY;IAQvB,QAAQ,CAAC,OAAO,wDAAqB;gBAGnC,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,UAAU,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI;IAe3C,eAAe;IAMf,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU5D,KAAK,CAAC,KAAK,EAAE,iBAAiB;IAI9B,MAAM,CAAC,CAAC,EAAE,aAAa;IAIvB,OAAO,CAAC,GAAG,EAAE,UAAU;IAIjB,GAAG;IAqMT,IAAI;CAIL"}
|
|
@@ -11,6 +11,7 @@ import { TransactionPool } from "../../db/transaction-pool.js";
|
|
|
11
11
|
import {} from "../change-source/protocol/current/downstream.js";
|
|
12
12
|
import {} from "./change-streamer.js";
|
|
13
13
|
import * as ErrorType from "./error-type-enum.js";
|
|
14
|
+
import { cdcSchema } from "./schema/tables.js";
|
|
14
15
|
import { Subscriber } from "./subscriber.js";
|
|
15
16
|
/**
|
|
16
17
|
* Handles the storage of changes and the catchup of subscribers
|
|
@@ -45,33 +46,39 @@ import { Subscriber } from "./subscriber.js";
|
|
|
45
46
|
export class Storer {
|
|
46
47
|
id = 'storer';
|
|
47
48
|
#lc;
|
|
49
|
+
#shardID;
|
|
48
50
|
#taskID;
|
|
49
51
|
#db;
|
|
50
52
|
#replicaVersion;
|
|
51
53
|
#onConsumed;
|
|
52
54
|
#queue = new Queue();
|
|
53
55
|
stopped = resolver();
|
|
54
|
-
constructor(lc, taskID, db, replicaVersion, onConsumed) {
|
|
56
|
+
constructor(lc, shardID, taskID, db, replicaVersion, onConsumed) {
|
|
55
57
|
this.#lc = lc;
|
|
58
|
+
this.#shardID = shardID;
|
|
56
59
|
this.#taskID = taskID;
|
|
57
60
|
this.#db = db;
|
|
58
61
|
this.#replicaVersion = replicaVersion;
|
|
59
62
|
this.#onConsumed = onConsumed;
|
|
60
63
|
}
|
|
64
|
+
// For readability in SQL statements.
|
|
65
|
+
#cdc(table) {
|
|
66
|
+
return this.#db(`${cdcSchema(this.#shardID)}.${table}`);
|
|
67
|
+
}
|
|
61
68
|
async assumeOwnership() {
|
|
62
69
|
const db = this.#db;
|
|
63
70
|
const owner = this.#taskID;
|
|
64
|
-
await db `UPDATE cdc
|
|
71
|
+
await db `UPDATE ${this.#cdc('replicationState')} SET ${db({ owner })}`;
|
|
65
72
|
}
|
|
66
73
|
async getLastWatermark() {
|
|
67
74
|
const [{ lastWatermark }] = await this.#db `
|
|
68
|
-
SELECT "lastWatermark" FROM cdc
|
|
75
|
+
SELECT "lastWatermark" FROM ${this.#cdc('replicationState')}`;
|
|
69
76
|
return lastWatermark;
|
|
70
77
|
}
|
|
71
78
|
async purgeRecordsBefore(watermark) {
|
|
72
79
|
const result = await this.#db `
|
|
73
80
|
WITH purged AS (
|
|
74
|
-
DELETE FROM cdc
|
|
81
|
+
DELETE FROM ${this.#cdc('changeLog')} WHERE watermark < ${watermark}
|
|
75
82
|
RETURNING watermark, pos
|
|
76
83
|
) SELECT COUNT(*) as deleted FROM purged;`;
|
|
77
84
|
return Number(result[0].deleted);
|
|
@@ -121,7 +128,8 @@ export class Storer {
|
|
|
121
128
|
// Pipeline a read of the current ReplicationState,
|
|
122
129
|
// which will be checked before committing.
|
|
123
130
|
tx.pool.process(tx => {
|
|
124
|
-
tx `
|
|
131
|
+
tx `
|
|
132
|
+
SELECT * FROM ${this.#cdc('replicationState')}`.then(([result]) => resolve(result), reject);
|
|
125
133
|
return [];
|
|
126
134
|
});
|
|
127
135
|
}
|
|
@@ -135,7 +143,10 @@ export class Storer {
|
|
|
135
143
|
pos: tx.pos,
|
|
136
144
|
change: change,
|
|
137
145
|
};
|
|
138
|
-
tx.pool.process(tx => [
|
|
146
|
+
tx.pool.process(tx => [
|
|
147
|
+
tx `
|
|
148
|
+
INSERT INTO ${this.#cdc('changeLog')} ${tx(entry)}`,
|
|
149
|
+
]);
|
|
139
150
|
if (tag === 'commit') {
|
|
140
151
|
const { owner } = await tx.startingReplicationState;
|
|
141
152
|
if (owner !== this.#taskID) {
|
|
@@ -146,7 +157,8 @@ export class Storer {
|
|
|
146
157
|
// Update the replication state.
|
|
147
158
|
const lastWatermark = watermark;
|
|
148
159
|
tx.pool.process(tx => [
|
|
149
|
-
tx `
|
|
160
|
+
tx `
|
|
161
|
+
UPDATE ${this.#cdc('replicationState')} SET ${tx({ lastWatermark })}`,
|
|
150
162
|
]);
|
|
151
163
|
tx.pool.setDone();
|
|
152
164
|
}
|
|
@@ -203,7 +215,7 @@ export class Storer {
|
|
|
203
215
|
let watermarkFound = sub.watermark === this.#replicaVersion;
|
|
204
216
|
let count = 0;
|
|
205
217
|
for await (const entries of tx `
|
|
206
|
-
SELECT watermark, change FROM cdc
|
|
218
|
+
SELECT watermark, change FROM ${this.#cdc('changeLog')}
|
|
207
219
|
WHERE watermark >= ${sub.watermark}
|
|
208
220
|
ORDER BY watermark, pos`.cursor(10000)) {
|
|
209
221
|
for (const entry of entries) {
|
|
@@ -228,7 +240,7 @@ export class Storer {
|
|
|
228
240
|
}
|
|
229
241
|
else {
|
|
230
242
|
const [{ lastWatermark }] = await this.#db `
|
|
231
|
-
SELECT "lastWatermark" FROM cdc
|
|
243
|
+
SELECT "lastWatermark" FROM ${this.#cdc('replicationState')}`;
|
|
232
244
|
this.#lc.warn?.(`subscriber at watermark ${sub.watermark} is ahead of latest watermark: ${lastWatermark}`);
|
|
233
245
|
}
|
|
234
246
|
// Flushes the backlog of messages buffered during catchup and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAC,KAAK,EAAC,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAC,WAAW,EAAC,MAAM,6CAA6C,CAAC;AACxE,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAa,MAAM,iDAAiD,CAAC;AAI5E,OAAO,EAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"storer.js","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-streamer/storer.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export type CVRFlushStats = {
|
|
|
16
16
|
};
|
|
17
17
|
export declare class CVRStore {
|
|
18
18
|
#private;
|
|
19
|
-
constructor(lc: LogContext, db: PostgresDB, taskID: string, cvrID: string, failService: (e: unknown) => void, loadAttemptIntervalMs?: number, maxLoadAttempts?: number, deferredRowFlushThreshold?: number, // somewhat arbitrary
|
|
19
|
+
constructor(lc: LogContext, db: PostgresDB, shardID: string, taskID: string, cvrID: string, failService: (e: unknown) => void, loadAttemptIntervalMs?: number, maxLoadAttempts?: number, deferredRowFlushThreshold?: number, // somewhat arbitrary
|
|
20
20
|
setTimeoutFn?: typeof setTimeout);
|
|
21
21
|
load(lc: LogContext, lastConnectTime: number): Promise<CVR>;
|
|
22
22
|
getRowRecords(): Promise<ReadonlyMap<RowID, RowRecord>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAoBjD,OAAO,EAAiB,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAC,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,KAAK,EAAQ,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAC,GAAG,EAAE,WAAW,EAAC,MAAM,UAAU,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"cvr-store.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/cvr-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import * as Mode from "../../db/mode-enum.js";
|
|
|
15
15
|
import { TransactionPool } from "../../db/transaction-pool.js";
|
|
16
16
|
import { ErrorForClient, ErrorWithLevel } from "../../types/error-for-client.js";
|
|
17
17
|
import { rowIDString } from "../../types/row-key.js";
|
|
18
|
-
import { rowRecordToRowsRow, rowsRowToRowRecord, } from "./schema/cvr.js";
|
|
18
|
+
import { cvrSchema, rowRecordToRowsRow, rowsRowToRowRecord, } from "./schema/cvr.js";
|
|
19
19
|
import { cmpVersions, EMPTY_CVR_VERSION, versionFromString, versionString, versionToNullableCookie, } from "./schema/types.js";
|
|
20
20
|
const tracer = trace.getTracer('cvr-store', version);
|
|
21
21
|
/**
|
|
@@ -75,6 +75,7 @@ class RowRecordCache {
|
|
|
75
75
|
#cache;
|
|
76
76
|
#lc;
|
|
77
77
|
#db;
|
|
78
|
+
#schema;
|
|
78
79
|
#cvrID;
|
|
79
80
|
#failService;
|
|
80
81
|
#deferredRowFlushThreshold;
|
|
@@ -84,14 +85,18 @@ class RowRecordCache {
|
|
|
84
85
|
#pendingRowsVersion = null;
|
|
85
86
|
#flushedRowsVersion = null;
|
|
86
87
|
#flushing = null;
|
|
87
|
-
constructor(lc, db, cvrID, failService, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
|
|
88
|
+
constructor(lc, db, shardID, cvrID, failService, deferredRowFlushThreshold = 100, setTimeoutFn = setTimeout) {
|
|
88
89
|
this.#lc = lc;
|
|
89
90
|
this.#db = db;
|
|
91
|
+
this.#schema = cvrSchema(shardID);
|
|
90
92
|
this.#cvrID = cvrID;
|
|
91
93
|
this.#failService = failService;
|
|
92
94
|
this.#deferredRowFlushThreshold = deferredRowFlushThreshold;
|
|
93
95
|
this.#setTimeout = setTimeoutFn;
|
|
94
96
|
}
|
|
97
|
+
#cvr(table) {
|
|
98
|
+
return this.#db(`${this.#schema}.${table}`);
|
|
99
|
+
}
|
|
95
100
|
async #ensureLoaded() {
|
|
96
101
|
if (this.#cache) {
|
|
97
102
|
return this.#cache;
|
|
@@ -101,7 +106,9 @@ class RowRecordCache {
|
|
|
101
106
|
// query is made even if there are multiple callers.
|
|
102
107
|
this.#cache = r.promise;
|
|
103
108
|
const cache = new CustomKeyMap(rowIDString);
|
|
104
|
-
for await (const rows of this.#db `
|
|
109
|
+
for await (const rows of this.#db `
|
|
110
|
+
SELECT * FROM ${this.#cvr(`rows`)}
|
|
111
|
+
WHERE "clientGroupID" = ${this.#cvrID} AND "refCounts" IS NOT NULL`
|
|
105
112
|
// TODO(arv): Arbitrary page size
|
|
106
113
|
.cursor(5000)) {
|
|
107
114
|
for (const row of rows) {
|
|
@@ -215,15 +222,15 @@ class RowRecordCache {
|
|
|
215
222
|
const reader = new TransactionPool(lc, Mode.READONLY).run(this.#db);
|
|
216
223
|
try {
|
|
217
224
|
// Verify that we are reading the right version of the CVR.
|
|
218
|
-
await reader.processReadTask(tx => checkVersion(tx, this.#cvrID, current));
|
|
225
|
+
await reader.processReadTask(tx => checkVersion(tx, this.#schema, this.#cvrID, current));
|
|
219
226
|
const { query } = await reader.processReadTask(tx => {
|
|
220
227
|
const query = excludeQueryHashes.length === 0
|
|
221
|
-
? tx `SELECT * FROM cvr
|
|
228
|
+
? tx `SELECT * FROM ${this.#cvr('rows')}
|
|
222
229
|
WHERE "clientGroupID" = ${this.#cvrID}
|
|
223
230
|
AND "patchVersion" > ${start}
|
|
224
231
|
AND "patchVersion" <= ${end}`
|
|
225
232
|
: // Exclude rows that were already sent as part of query hydration.
|
|
226
|
-
tx `SELECT * FROM cvr
|
|
233
|
+
tx `SELECT * FROM ${this.#cvr('rows')}
|
|
227
234
|
WHERE "clientGroupID" = ${this.#cvrID}
|
|
228
235
|
AND "patchVersion" > ${start}
|
|
229
236
|
AND "patchVersion" <= ${end}
|
|
@@ -251,7 +258,7 @@ class RowRecordCache {
|
|
|
251
258
|
version: versionString(version),
|
|
252
259
|
};
|
|
253
260
|
const pending = [
|
|
254
|
-
tx `INSERT INTO cvr
|
|
261
|
+
tx `INSERT INTO ${this.#cvr('rowsVersion')} ${tx(rowsVersion)}
|
|
255
262
|
ON CONFLICT ("clientGroupID")
|
|
256
263
|
DO UPDATE SET ${tx(rowsVersion)}`.execute(),
|
|
257
264
|
];
|
|
@@ -259,7 +266,7 @@ class RowRecordCache {
|
|
|
259
266
|
for (const [id, row] of rowUpdates.entries()) {
|
|
260
267
|
if (row === null) {
|
|
261
268
|
pending.push(tx `
|
|
262
|
-
DELETE FROM cvr
|
|
269
|
+
DELETE FROM ${this.#cvr('rows')}
|
|
263
270
|
WHERE "clientGroupID" = ${this.#cvrID}
|
|
264
271
|
AND "schema" = ${id.schema}
|
|
265
272
|
AND "table" = ${id.table}
|
|
@@ -272,7 +279,7 @@ class RowRecordCache {
|
|
|
272
279
|
}
|
|
273
280
|
if (rowRecordRows.length) {
|
|
274
281
|
pending.push(tx `
|
|
275
|
-
INSERT INTO cvr
|
|
282
|
+
INSERT INTO ${this.#cvr('rows')}(
|
|
276
283
|
"clientGroupID", "schema", "table", "rowKey", "rowVersion", "patchVersion", "refCounts"
|
|
277
284
|
) SELECT
|
|
278
285
|
"clientGroupID", "schema", "table", "rowKey", "rowVersion", "patchVersion", "refCounts"
|
|
@@ -324,6 +331,7 @@ const LOAD_ATTEMPT_INTERVAL_MS = 500;
|
|
|
324
331
|
// as it is technically application specific.
|
|
325
332
|
const MAX_LOAD_ATTEMPTS = 10;
|
|
326
333
|
export class CVRStore {
|
|
334
|
+
#schema;
|
|
327
335
|
#taskID;
|
|
328
336
|
#id;
|
|
329
337
|
#db;
|
|
@@ -333,15 +341,19 @@ export class CVRStore {
|
|
|
333
341
|
#rowCache;
|
|
334
342
|
#loadAttemptIntervalMs;
|
|
335
343
|
#maxLoadAttempts;
|
|
336
|
-
constructor(lc, db, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, // somewhat arbitrary
|
|
344
|
+
constructor(lc, db, shardID, taskID, cvrID, failService, loadAttemptIntervalMs = LOAD_ATTEMPT_INTERVAL_MS, maxLoadAttempts = MAX_LOAD_ATTEMPTS, deferredRowFlushThreshold = 100, // somewhat arbitrary
|
|
337
345
|
setTimeoutFn = setTimeout) {
|
|
338
346
|
this.#db = db;
|
|
347
|
+
this.#schema = cvrSchema(shardID);
|
|
339
348
|
this.#taskID = taskID;
|
|
340
349
|
this.#id = cvrID;
|
|
341
|
-
this.#rowCache = new RowRecordCache(lc, db, cvrID, failService, deferredRowFlushThreshold, setTimeoutFn);
|
|
350
|
+
this.#rowCache = new RowRecordCache(lc, db, shardID, cvrID, failService, deferredRowFlushThreshold, setTimeoutFn);
|
|
342
351
|
this.#loadAttemptIntervalMs = loadAttemptIntervalMs;
|
|
343
352
|
this.#maxLoadAttempts = maxLoadAttempts;
|
|
344
353
|
}
|
|
354
|
+
#cvr(table) {
|
|
355
|
+
return this.#db(`${this.#schema}.${table}`);
|
|
356
|
+
}
|
|
345
357
|
load(lc, lastConnectTime) {
|
|
346
358
|
return startAsyncSpan(tracer, 'cvr.load', async () => {
|
|
347
359
|
let err;
|
|
@@ -382,13 +394,18 @@ export class CVRStore {
|
|
|
382
394
|
"owner",
|
|
383
395
|
"grantedAt",
|
|
384
396
|
rows."version" as "rowsVersion"
|
|
385
|
-
FROM cvr
|
|
386
|
-
LEFT JOIN cvr
|
|
397
|
+
FROM ${this.#cvr('instances')} AS cvr
|
|
398
|
+
LEFT JOIN ${this.#cvr('rowsVersion')} AS rows
|
|
387
399
|
ON cvr."clientGroupID" = rows."clientGroupID"
|
|
388
400
|
WHERE cvr."clientGroupID" = ${id}`,
|
|
389
|
-
tx `
|
|
390
|
-
|
|
391
|
-
|
|
401
|
+
tx `
|
|
402
|
+
SELECT "clientID", "patchVersion" FROM ${this.#cvr('clients')}
|
|
403
|
+
WHERE "clientGroupID" = ${id}`,
|
|
404
|
+
tx `
|
|
405
|
+
SELECT * FROM ${this.#cvr('queries')}
|
|
406
|
+
WHERE "clientGroupID" = ${id} AND (deleted IS NULL OR deleted = FALSE)`,
|
|
407
|
+
tx `SELECT * FROM ${this.#cvr('desires')}
|
|
408
|
+
WHERE "clientGroupID" = ${id} AND (deleted IS NULL OR deleted = FALSE)`,
|
|
392
409
|
]);
|
|
393
410
|
if (instance.length === 0) {
|
|
394
411
|
// This is the first time we see this CVR.
|
|
@@ -410,8 +427,9 @@ export class CVRStore {
|
|
|
410
427
|
// Note that the query is structured such that it only succeeds in the
|
|
411
428
|
// correct conditions (i.e. gated on `grantedAt`).
|
|
412
429
|
void this.#db `
|
|
413
|
-
UPDATE
|
|
414
|
-
|
|
430
|
+
UPDATE ${this.#cvr('instances')}
|
|
431
|
+
SET "owner" = ${this.#taskID},
|
|
432
|
+
"grantedAt" = ${lastConnectTime}
|
|
415
433
|
WHERE "clientGroupID" = ${this.#id} AND
|
|
416
434
|
("grantedAt" IS NULL OR
|
|
417
435
|
"grantedAt" <= to_timestamp(${lastConnectTime / 1000}))
|
|
@@ -497,7 +515,7 @@ export class CVRStore {
|
|
|
497
515
|
grantedAt: lastConnectTime,
|
|
498
516
|
};
|
|
499
517
|
return tx `
|
|
500
|
-
INSERT INTO cvr
|
|
518
|
+
INSERT INTO ${this.#cvr('instances')} ${tx(change)}
|
|
501
519
|
ON CONFLICT ("clientGroupID") DO UPDATE SET ${tx(change)}`;
|
|
502
520
|
},
|
|
503
521
|
});
|
|
@@ -505,7 +523,7 @@ export class CVRStore {
|
|
|
505
523
|
markQueryAsDeleted(version, queryPatch) {
|
|
506
524
|
this.#writes.add({
|
|
507
525
|
stats: { queries: 1 },
|
|
508
|
-
write: tx => tx `UPDATE cvr
|
|
526
|
+
write: tx => tx `UPDATE ${this.#cvr('queries')} SET ${tx({
|
|
509
527
|
patchVersion: versionString(version),
|
|
510
528
|
deleted: true,
|
|
511
529
|
transformationHash: null,
|
|
@@ -539,7 +557,7 @@ export class CVRStore {
|
|
|
539
557
|
};
|
|
540
558
|
this.#writes.add({
|
|
541
559
|
stats: { queries: 1 },
|
|
542
|
-
write: tx => tx `INSERT INTO cvr
|
|
560
|
+
write: tx => tx `INSERT INTO ${this.#cvr('queries')} ${tx(change)}
|
|
543
561
|
ON CONFLICT ("clientGroupID", "queryHash")
|
|
544
562
|
DO UPDATE SET ${tx(change)}`,
|
|
545
563
|
});
|
|
@@ -556,14 +574,14 @@ export class CVRStore {
|
|
|
556
574
|
};
|
|
557
575
|
this.#writes.add({
|
|
558
576
|
stats: { queries: 1 },
|
|
559
|
-
write: tx => tx `UPDATE cvr
|
|
577
|
+
write: tx => tx `UPDATE ${this.#cvr('queries')} SET ${tx(change)}
|
|
560
578
|
WHERE "clientGroupID" = ${this.#id} AND "queryHash" = ${query.id}`,
|
|
561
579
|
});
|
|
562
580
|
}
|
|
563
581
|
updateClientPatchVersion(clientID, patchVersion) {
|
|
564
582
|
this.#writes.add({
|
|
565
583
|
stats: { clients: 1 },
|
|
566
|
-
write: tx => tx `UPDATE cvr
|
|
584
|
+
write: tx => tx `UPDATE ${this.#cvr('clients')}
|
|
567
585
|
SET "patchVersion" = ${versionString(patchVersion)}
|
|
568
586
|
WHERE "clientGroupID" = ${this.#id} AND "clientID" = ${clientID}`,
|
|
569
587
|
});
|
|
@@ -578,7 +596,7 @@ export class CVRStore {
|
|
|
578
596
|
};
|
|
579
597
|
this.#writes.add({
|
|
580
598
|
stats: { clients: 1 },
|
|
581
|
-
write: tx => tx `INSERT INTO cvr
|
|
599
|
+
write: tx => tx `INSERT INTO ${this.#cvr('clients')} ${tx(change)}`,
|
|
582
600
|
});
|
|
583
601
|
}
|
|
584
602
|
insertDesiredQuery(newVersion, query, client, deleted) {
|
|
@@ -592,7 +610,7 @@ export class CVRStore {
|
|
|
592
610
|
this.#writes.add({
|
|
593
611
|
stats: { desires: 1 },
|
|
594
612
|
write: tx => tx `
|
|
595
|
-
INSERT INTO cvr
|
|
613
|
+
INSERT INTO ${this.#cvr('desires')} ${tx(change)}
|
|
596
614
|
ON CONFLICT ("clientGroupID", "clientID", "queryHash")
|
|
597
615
|
DO UPDATE SET ${tx(change)}
|
|
598
616
|
`,
|
|
@@ -612,18 +630,21 @@ export class CVRStore {
|
|
|
612
630
|
const reader = new TransactionPool(lc, Mode.READONLY).run(this.#db);
|
|
613
631
|
try {
|
|
614
632
|
// Verify that we are reading the right version of the CVR.
|
|
615
|
-
await reader.processReadTask(tx => checkVersion(tx, this.#id, current));
|
|
633
|
+
await reader.processReadTask(tx => checkVersion(tx, this.#schema, this.#id, current));
|
|
616
634
|
const [allDesires, clientRows, queryRows] = await reader.processReadTask(tx => Promise.all([
|
|
617
|
-
tx `
|
|
618
|
-
|
|
635
|
+
tx `
|
|
636
|
+
SELECT * FROM ${this.#cvr('desires')}
|
|
637
|
+
WHERE "clientGroupID" = ${this.#id}
|
|
619
638
|
AND "patchVersion" > ${start}
|
|
620
639
|
AND "patchVersion" <= ${end}`,
|
|
621
|
-
tx `
|
|
622
|
-
|
|
640
|
+
tx `
|
|
641
|
+
SELECT * FROM ${this.#cvr('clients')}
|
|
642
|
+
WHERE "clientGroupID" = ${this.#id}
|
|
623
643
|
AND "patchVersion" > ${start}
|
|
624
644
|
AND "patchVersion" <= ${end}`,
|
|
625
|
-
tx `
|
|
626
|
-
|
|
645
|
+
tx `
|
|
646
|
+
SELECT deleted, "queryHash", "patchVersion" FROM ${this.#cvr('queries')}
|
|
647
|
+
WHERE "clientGroupID" = ${this.#id}
|
|
627
648
|
AND "patchVersion" > ${start}
|
|
628
649
|
AND "patchVersion" <= ${end}`,
|
|
629
650
|
]));
|
|
@@ -662,7 +683,7 @@ export class CVRStore {
|
|
|
662
683
|
}
|
|
663
684
|
async #checkVersionAndOwnership(tx, expectedCurrentVersion, lastConnectTime) {
|
|
664
685
|
const expected = versionString(expectedCurrentVersion);
|
|
665
|
-
const result = await tx `SELECT "version", "owner", "grantedAt" FROM cvr
|
|
686
|
+
const result = await tx `SELECT "version", "owner", "grantedAt" FROM ${this.#cvr('instances')}
|
|
666
687
|
WHERE "clientGroupID" = ${this.#id}
|
|
667
688
|
FOR UPDATE`.execute(); // Note: execute() immediately to send the query before others.
|
|
668
689
|
const { version, owner, grantedAt } = result.length > 0
|
|
@@ -769,10 +790,11 @@ export class CVRStore {
|
|
|
769
790
|
* that it only checks the version and is suitable for snapshot reads
|
|
770
791
|
* (i.e. by doing a plain `SELECT` rather than a `SELECT ... FOR UPDATE`).
|
|
771
792
|
*/
|
|
772
|
-
async function checkVersion(tx, clientGroupID, expectedCurrentVersion) {
|
|
793
|
+
async function checkVersion(tx, schema, clientGroupID, expectedCurrentVersion) {
|
|
773
794
|
const expected = versionString(expectedCurrentVersion);
|
|
774
795
|
const result = await tx `
|
|
775
|
-
SELECT version FROM
|
|
796
|
+
SELECT version FROM ${tx(schema)}.instances
|
|
797
|
+
WHERE "clientGroupID" = ${clientGroupID}`;
|
|
776
798
|
const { version } = result.length > 0 ? result[0] : { version: EMPTY_CVR_VERSION.stateVersion };
|
|
777
799
|
if (version !== expected) {
|
|
778
800
|
throw new ConcurrentModificationException(expected, version);
|