@rocicorp/zero 0.23.2025081401 → 0.23.2025081901
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/analyze-query/src/bin-analyze.d.ts.map +1 -1
- package/out/analyze-query/src/bin-analyze.js +56 -99
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/analyze-query/src/explain-queries.d.ts +4 -0
- package/out/analyze-query/src/explain-queries.d.ts.map +1 -0
- package/out/analyze-query/src/explain-queries.js +18 -0
- package/out/analyze-query/src/explain-queries.js.map +1 -0
- package/out/analyze-query/src/run-ast.d.ts +29 -0
- package/out/analyze-query/src/run-ast.d.ts.map +1 -0
- package/out/analyze-query/src/run-ast.js +68 -0
- package/out/analyze-query/src/run-ast.js.map +1 -0
- package/out/{chunk-KKPRF2XZ.js → chunk-DYTMKRKN.js} +124 -63
- package/out/{chunk-KKPRF2XZ.js.map → chunk-DYTMKRKN.js.map} +4 -4
- package/out/{chunk-O536GEIT.js → chunk-RPVWLROJ.js} +80 -35
- package/out/{chunk-O536GEIT.js.map → chunk-RPVWLROJ.js.map} +3 -3
- package/out/{chunk-ZIZNSAHP.js → chunk-ZOMIZNT3.js} +55 -58
- package/out/chunk-ZOMIZNT3.js.map +7 -0
- package/out/{inspector-J5P4DOGH.js → inspector-NC47TWFX.js} +4 -3
- package/out/{inspector-J5P4DOGH.js.map → inspector-NC47TWFX.js.map} +2 -2
- package/out/react.js +2 -2
- package/out/solid.js +3 -3
- package/out/zero/package.json +1 -1
- package/out/zero/src/server/reaper.d.ts +2 -0
- package/out/zero/src/server/reaper.d.ts.map +1 -0
- package/out/zero/src/server/reaper.js +2 -0
- package/out/zero/src/server/reaper.js.map +1 -0
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +2 -3
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +4 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +9 -1
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.d.ts +2 -3
- package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +18 -4
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/observability/events.js +1 -2
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/server/inspect-metrics-delegate.d.ts +23 -0
- package/out/zero-cache/src/server/inspect-metrics-delegate.d.ts.map +1 -0
- package/out/zero-cache/src/server/inspect-metrics-delegate.js +55 -0
- package/out/zero-cache/src/server/inspect-metrics-delegate.js.map +1 -0
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +12 -15
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/reaper.d.ts +3 -0
- package/out/zero-cache/src/server/reaper.d.ts.map +1 -0
- package/out/zero-cache/src/server/reaper.js +31 -0
- package/out/zero-cache/src/server/reaper.js.map +1 -0
- package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.js +6 -0
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +3 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts +6 -0
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -0
- package/out/zero-cache/src/services/analyze.js +70 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -0
- package/out/zero-cache/src/services/change-source/custom/change-source.js +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 +8 -3
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +38 -2
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts +3 -2
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +39 -34
- package/out/zero-cache/src/services/replicator/change-processor.js.map +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 +1 -3
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/running-state.d.ts +5 -0
- package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/running-state.js +8 -1
- package/out/zero-cache/src/services/running-state.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +2 -0
- 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 +3 -0
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts +16 -0
- package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js +86 -0
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +16 -9
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +50 -30
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- 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 +36 -26
- 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.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.js +27 -0
- 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 +2 -9
- 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 +93 -75
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +1 -1
- package/out/zero-cache/src/types/pg.js +1 -1
- package/out/zero-client/src/client/context.d.ts +1 -0
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/types.d.ts +1 -0
- package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -1
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-events/src/status.d.ts +10 -9
- package/out/zero-events/src/status.d.ts.map +1 -1
- package/out/zero-events/src/status.js +7 -10
- package/out/zero-events/src/status.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.d.ts +77 -5
- package/out/zero-protocol/src/custom-queries.d.ts.map +1 -1
- package/out/zero-protocol/src/custom-queries.js +19 -1
- package/out/zero-protocol/src/custom-queries.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +19 -1
- package/out/zero-protocol/src/down.d.ts.map +1 -1
- package/out/zero-protocol/src/down.js +2 -1
- package/out/zero-protocol/src/down.js.map +1 -1
- package/out/zero-protocol/src/inspect-down.d.ts +8 -0
- package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-down.js +1 -0
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +3 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-server/src/mod.d.ts +1 -0
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/mod.js +1 -0
- package/out/zero-server/src/mod.js.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +46 -0
- package/out/zero-server/src/process-mutations.d.ts.map +1 -0
- package/out/zero-server/src/process-mutations.js +187 -0
- package/out/zero-server/src/process-mutations.js.map +1 -0
- package/out/zero-server/src/push-processor.d.ts +2 -27
- package/out/zero-server/src/push-processor.d.ts.map +1 -1
- package/out/zero-server/src/push-processor.js +17 -154
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/queries/process-queries.d.ts +1 -1
- package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
- package/out/zero-server/src/queries/process-queries.js +1 -1
- package/out/zero-server/src/queries/process-queries.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts +1 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero.js +14 -10
- package/out/zql/src/builder/builder.d.ts +5 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +49 -16
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/debug-delegate.d.ts +29 -0
- package/out/zql/src/builder/debug-delegate.d.ts.map +1 -0
- package/out/zql/src/builder/debug-delegate.js +55 -0
- package/out/zql/src/builder/debug-delegate.js.map +1 -0
- package/out/zql/src/builder/filter.d.ts +0 -3
- package/out/zql/src/builder/filter.d.ts.map +1 -1
- package/out/zql/src/builder/filter.js +0 -3
- package/out/zql/src/builder/filter.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +2 -1
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +7 -2
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +2 -0
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/source.d.ts +2 -1
- package/out/zql/src/ivm/source.d.ts.map +1 -1
- package/out/zql/src/query/measure-push-operator.d.ts +19 -0
- package/out/zql/src/query/measure-push-operator.d.ts.map +1 -0
- package/out/zql/src/query/measure-push-operator.js +36 -0
- package/out/zql/src/query/measure-push-operator.js.map +1 -0
- package/out/zql/src/query/metrics-delegate.d.ts +3 -0
- package/out/zql/src/query/metrics-delegate.d.ts.map +1 -1
- package/out/zql/src/query/metrics-delegate.js +6 -1
- package/out/zql/src/query/metrics-delegate.js.map +1 -1
- package/out/zql/src/query/named.d.ts +38 -9
- package/out/zql/src/query/named.d.ts.map +1 -1
- package/out/zql/src/query/named.js +49 -24
- package/out/zql/src/query/named.js.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +1 -1
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zqlite/src/query-delegate.d.ts +1 -0
- package/out/zqlite/src/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-delegate.js +2 -1
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts +3 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +8 -10
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +1 -1
- package/out/chunk-ZIZNSAHP.js.map +0 -7
- package/out/zero-client/src/client/measure-push-operator.d.ts +0 -17
- package/out/zero-client/src/client/measure-push-operator.d.ts.map +0 -1
- package/out/zqlite/src/runtime-debug.d.ts +0 -23
- package/out/zqlite/src/runtime-debug.d.ts.map +0 -1
- package/out/zqlite/src/runtime-debug.js +0 -69
- package/out/zqlite/src/runtime-debug.js.map +0 -1
|
@@ -23,6 +23,10 @@ CREATE TABLE ${schema(shard)}.instances (
|
|
|
23
23
|
"grantedAt" TIMESTAMPTZ, -- The time at which the current owner was last granted ownership (most recent connection time).
|
|
24
24
|
"clientSchema" JSONB -- ClientSchema of the client group
|
|
25
25
|
);
|
|
26
|
+
|
|
27
|
+
-- For garbage collection.
|
|
28
|
+
CREATE INDEX instances_last_active
|
|
29
|
+
ON ${schema(shard)}.instances ("lastActive");
|
|
26
30
|
`;
|
|
27
31
|
}
|
|
28
32
|
export function compareInstancesRows(a, b) {
|
|
@@ -39,6 +43,7 @@ CREATE TABLE ${schema(shard)}.clients (
|
|
|
39
43
|
CONSTRAINT fk_clients_client_group
|
|
40
44
|
FOREIGN KEY("clientGroupID")
|
|
41
45
|
REFERENCES ${schema(shard)}.instances("clientGroupID")
|
|
46
|
+
ON DELETE CASCADE
|
|
42
47
|
);
|
|
43
48
|
|
|
44
49
|
`;
|
|
@@ -69,6 +74,7 @@ CREATE TABLE ${schema(shard)}.queries (
|
|
|
69
74
|
CONSTRAINT fk_queries_client_group
|
|
70
75
|
FOREIGN KEY("clientGroupID")
|
|
71
76
|
REFERENCES ${schema(shard)}.instances("clientGroupID")
|
|
77
|
+
ON DELETE CASCADE
|
|
72
78
|
);
|
|
73
79
|
|
|
74
80
|
-- For catchup patches.
|
|
@@ -163,11 +169,33 @@ export function compareRowsRows(a, b) {
|
|
|
163
169
|
return stringCompare(stringifySorted(a.rowKey), stringifySorted(b.rowKey));
|
|
164
170
|
}
|
|
165
171
|
/**
|
|
172
|
+
* The version of the data in the `cvr.rows` table. This may lag
|
|
173
|
+
* `version` in `cvr.instances` but eventually catches up, modulo
|
|
174
|
+
* exceptional circumstances like a server crash.
|
|
175
|
+
*
|
|
176
|
+
* The `rowsVersion` is tracked in a separate table (as opposed to
|
|
177
|
+
* a column in the `cvr.instances` table) so that general `cvr` updates
|
|
178
|
+
* and `row` updates can be executed independently without serialization
|
|
179
|
+
* conflicts.
|
|
180
|
+
*
|
|
166
181
|
* Note: Although `clientGroupID` logically references the same column in
|
|
167
182
|
* `cvr.instances`, a FOREIGN KEY constraint must not be declared as the
|
|
168
183
|
* `cvr.rows` TABLE needs to be updated without affecting the
|
|
169
184
|
* `SELECT ... FOR UPDATE` lock when `cvr.instances` is updated.
|
|
170
185
|
*/
|
|
186
|
+
export function createRowsVersionTable(shard) {
|
|
187
|
+
return `
|
|
188
|
+
CREATE TABLE ${schema(shard)}."rowsVersion" (
|
|
189
|
+
"clientGroupID" TEXT PRIMARY KEY,
|
|
190
|
+
"version" TEXT NOT NULL
|
|
191
|
+
);
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* CVR `rows` are updated asynchronously from the CVR metadata
|
|
196
|
+
* (i.e. `instances`). The `rowsVersion` table is updated atomically with
|
|
197
|
+
* updates to the `rows` data.
|
|
198
|
+
*/
|
|
171
199
|
function createRowsTable(shard) {
|
|
172
200
|
return `
|
|
173
201
|
CREATE TABLE ${schema(shard)}.rows (
|
|
@@ -179,7 +207,12 @@ CREATE TABLE ${schema(shard)}.rows (
|
|
|
179
207
|
"patchVersion" TEXT NOT NULL,
|
|
180
208
|
"refCounts" JSONB, -- {[queryHash: string]: number}, NULL for tombstone
|
|
181
209
|
|
|
182
|
-
PRIMARY KEY ("clientGroupID", "schema", "table", "rowKey")
|
|
210
|
+
PRIMARY KEY ("clientGroupID", "schema", "table", "rowKey"),
|
|
211
|
+
|
|
212
|
+
CONSTRAINT fk_rows_client_group
|
|
213
|
+
FOREIGN KEY("clientGroupID")
|
|
214
|
+
REFERENCES ${schema(shard)}."rowsVersion" ("clientGroupID")
|
|
215
|
+
ON DELETE CASCADE
|
|
183
216
|
);
|
|
184
217
|
|
|
185
218
|
-- For catchup patches.
|
|
@@ -192,37 +225,14 @@ CREATE INDEX row_ref_counts ON ${schema(shard)}.rows
|
|
|
192
225
|
USING GIN ("refCounts");
|
|
193
226
|
`;
|
|
194
227
|
}
|
|
195
|
-
/**
|
|
196
|
-
* The version of the data in the `cvr.rows` table. This may lag
|
|
197
|
-
* `version` in `cvr.instances` but eventually catches up, modulo
|
|
198
|
-
* exceptional circumstances like a server crash.
|
|
199
|
-
*
|
|
200
|
-
* The `rowsVersion` is tracked in a separate table (as opposed to
|
|
201
|
-
* a column in the `cvr.instances` table) so that general `cvr` updates
|
|
202
|
-
* and `row` updates can be executed independently without serialization
|
|
203
|
-
* conflicts.
|
|
204
|
-
*
|
|
205
|
-
* Note: Although `clientGroupID` logically references the same column in
|
|
206
|
-
* `cvr.instances`, a FOREIGN KEY constraint must not be declared as the
|
|
207
|
-
* `cvr.rows` TABLE needs to be updated without affecting the
|
|
208
|
-
* `SELECT ... FOR UPDATE` lock when `cvr.instances` is updated.
|
|
209
|
-
*/
|
|
210
|
-
export function createRowsVersionTable(shard) {
|
|
211
|
-
return `
|
|
212
|
-
CREATE TABLE ${schema(shard)}."rowsVersion" (
|
|
213
|
-
"clientGroupID" TEXT PRIMARY KEY,
|
|
214
|
-
"version" TEXT NOT NULL
|
|
215
|
-
);
|
|
216
|
-
`;
|
|
217
|
-
}
|
|
218
228
|
function createTables(shard) {
|
|
219
229
|
return (createSchema(shard) +
|
|
220
230
|
createInstancesTable(shard) +
|
|
221
231
|
createClientsTable(shard) +
|
|
222
232
|
createQueriesTable(shard) +
|
|
223
233
|
createDesiresTable(shard) +
|
|
224
|
-
|
|
225
|
-
|
|
234
|
+
createRowsVersionTable(shard) +
|
|
235
|
+
createRowsTable(shard));
|
|
226
236
|
}
|
|
227
237
|
export async function setupCVRTables(lc, db, shard) {
|
|
228
238
|
lc.info?.(`Setting up CVR tables`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cvr.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/cvr.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,WAAW,CAAC;AAEhC,OAAO,EAGL,SAAS,GACV,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAC,aAAa,EAAC,MAAM,6CAA6C,CAAC;AAE1E,OAAO,EAAC,kBAAkB,EAAc,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAC,SAAS,EAAe,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAGL,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,yCAAyC;AACzC,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,+BAA+B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AACzD,CAAC;AAaD,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO;eACM,MAAM,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"cvr.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/cvr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAOjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAY,KAAK,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAGjE,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,UAAU,EACf,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAOjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAY,KAAK,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAGjE,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,UAAU,EACf,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAoLf"}
|
|
@@ -92,6 +92,29 @@ export async function initViewSyncerSchema(log, db, shard) {
|
|
|
92
92
|
await tx `ALTER TABLE ${tx(schema)}.instances ADD COLUMN "ttlClock" DOUBLE PRECISION NOT NULL DEFAULT 0`;
|
|
93
93
|
},
|
|
94
94
|
};
|
|
95
|
+
const migratedV13ToV14 = {
|
|
96
|
+
migrateSchema: async (_, sql) => {
|
|
97
|
+
await sql `
|
|
98
|
+
CREATE INDEX instances_last_active ON ${sql(schema)}.instances ("lastActive");
|
|
99
|
+
`;
|
|
100
|
+
// Update / add foreign key constraints to cascade deletes.
|
|
101
|
+
for (const [table, reference] of [
|
|
102
|
+
['clients', 'instances'],
|
|
103
|
+
['queries', 'instances'],
|
|
104
|
+
['rows', 'rowsVersion'],
|
|
105
|
+
]) {
|
|
106
|
+
const constraint = sql(`fk_${table}_client_group`);
|
|
107
|
+
await sql `
|
|
108
|
+
ALTER TABLE ${sql(schema)}.${sql(table)} DROP CONSTRAINT IF EXISTS ${constraint}`;
|
|
109
|
+
await sql `
|
|
110
|
+
ALTER TABLE ${sql(schema)}.${sql(table)} ADD CONSTRAINT ${constraint}
|
|
111
|
+
FOREIGN KEY("clientGroupID")
|
|
112
|
+
REFERENCES ${sql(schema)}.${sql(reference)} ("clientGroupID")
|
|
113
|
+
ON DELETE CASCADE;
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
95
118
|
const schemaVersionMigrationMap = {
|
|
96
119
|
2: migrateV1toV2,
|
|
97
120
|
3: migrateV2ToV3,
|
|
@@ -113,6 +136,10 @@ export async function initViewSyncerSchema(log, db, shard) {
|
|
|
113
136
|
12: migratedV11ToV12,
|
|
114
137
|
// V13 adds instances."ttlClock"
|
|
115
138
|
13: migratedV12ToV13,
|
|
139
|
+
// V14 adds an index on instances."lastActive" and a FK constraint
|
|
140
|
+
// from rows."clientGroupID" to rowsVersion."clientGroupID" for
|
|
141
|
+
// garbage collection
|
|
142
|
+
14: migratedV13ToV14,
|
|
116
143
|
};
|
|
117
144
|
await runSchemaMigrations(log, 'view-syncer', cvrSchema(shard), db, setupMigration, schemaVersionMigrationMap);
|
|
118
145
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../zero-cache/src/services/view-syncer/schema/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import type { JWTPayload } from 'jose';
|
|
3
|
-
import { TDigest } from '../../../../shared/src/tdigest.ts';
|
|
4
3
|
import type { ChangeDesiredQueriesMessage } from '../../../../zero-protocol/src/change-desired-queries.ts';
|
|
5
4
|
import type { InitConnectionMessage } from '../../../../zero-protocol/src/connect.ts';
|
|
6
5
|
import type { DeleteClientsMessage } from '../../../../zero-protocol/src/delete-clients.ts';
|
|
7
6
|
import type { Downstream } from '../../../../zero-protocol/src/down.ts';
|
|
8
7
|
import type { InspectUpMessage } from '../../../../zero-protocol/src/inspect-up.ts';
|
|
9
8
|
import { type ZeroConfig } from '../../config/zero-config.ts';
|
|
9
|
+
import { InspectMetricsDelegate } from '../../server/inspect-metrics-delegate.ts';
|
|
10
10
|
import type { PostgresDB } from '../../types/pg.ts';
|
|
11
11
|
import type { ShardID } from '../../types/shards.ts';
|
|
12
12
|
import type { Source } from '../../types/streams.ts';
|
|
@@ -28,13 +28,6 @@ export type SyncContext = {
|
|
|
28
28
|
readonly tokenData: TokenData | undefined;
|
|
29
29
|
readonly httpCookie: string | undefined;
|
|
30
30
|
};
|
|
31
|
-
/**
|
|
32
|
-
* Server-side metrics collected for queries during materialization.
|
|
33
|
-
* These metrics are reported via the inspector and complement client-side metrics.
|
|
34
|
-
*/
|
|
35
|
-
export type ServerMetrics = {
|
|
36
|
-
'query-materialization-server': TDigest;
|
|
37
|
-
};
|
|
38
31
|
export interface ViewSyncer {
|
|
39
32
|
initConnection(ctx: SyncContext, msg: InitConnectionMessage): Source<Downstream>;
|
|
40
33
|
changeDesiredQueries(ctx: SyncContext, msg: ChangeDesiredQueriesMessage): Promise<void>;
|
|
@@ -59,7 +52,7 @@ type PartialZeroConfig = Pick<ZeroConfig, 'query' | 'serverVersion'>;
|
|
|
59
52
|
export declare class ViewSyncerService implements ViewSyncer, ActivityBasedService {
|
|
60
53
|
#private;
|
|
61
54
|
readonly id: string;
|
|
62
|
-
constructor(config: PartialZeroConfig, lc: LogContext, shard: ShardID, taskID: string, clientGroupID: string, cvrDb: PostgresDB, upstreamDb: PostgresDB | undefined, pipelineDriver: PipelineDriver, versionChanges: Subscription<ReplicaState>, drainCoordinator: DrainCoordinator, slowHydrateThreshold: number, keepaliveMs?: number, setTimeoutFn?: SetTimeout);
|
|
55
|
+
constructor(config: PartialZeroConfig, lc: LogContext, shard: ShardID, taskID: string, clientGroupID: string, cvrDb: PostgresDB, upstreamDb: PostgresDB | undefined, pipelineDriver: PipelineDriver, versionChanges: Subscription<ReplicaState>, drainCoordinator: DrainCoordinator, slowHydrateThreshold: number, inspectMetricsDelegate: InspectMetricsDelegate, keepaliveMs?: number, setTimeoutFn?: SetTimeout);
|
|
63
56
|
run(): Promise<void>;
|
|
64
57
|
/**
|
|
65
58
|
* Guarantees that the ViewSyncer will remain running for at least
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-syncer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/view-syncer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AAcrC,OAAO,
|
|
1
|
+
{"version":3,"file":"view-syncer.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/view-syncer/view-syncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,15 +7,14 @@ import { assert, unreachable } from "../../../../shared/src/asserts.js";
|
|
|
7
7
|
import { stringify } from "../../../../shared/src/bigint-json.js";
|
|
8
8
|
import { CustomKeyMap } from "../../../../shared/src/custom-key-map.js";
|
|
9
9
|
import { must } from "../../../../shared/src/must.js";
|
|
10
|
-
import { mapValues } from "../../../../shared/src/objects.js";
|
|
11
10
|
import { randInt } from "../../../../shared/src/rand.js";
|
|
12
|
-
import { TDigest } from "../../../../shared/src/tdigest.js";
|
|
13
11
|
import { ErrorKind } from "../../../../zero-protocol/src/error-kind.js";
|
|
14
12
|
import { clampTTL, MAX_TTL_MS } from "../../../../zql/src/query/ttl.js";
|
|
15
13
|
import { transformAndHashQuery, } from "../../auth/read-authorizer.js";
|
|
16
14
|
import { getServerVersion } from "../../config/zero-config.js";
|
|
17
15
|
import { CustomQueryTransformer } from "../../custom-queries/transform-query.js";
|
|
18
16
|
import { getOrCreateCounter, getOrCreateHistogram, getOrCreateUpDownCounter, } from "../../observability/metrics.js";
|
|
17
|
+
import { InspectMetricsDelegate } from "../../server/inspect-metrics-delegate.js";
|
|
19
18
|
import { ErrorForClient, getLogLevel } from "../../types/error-for-client.js";
|
|
20
19
|
import { rowIDString } from "../../types/row-key.js";
|
|
21
20
|
import { Subscription } from "../../types/subscription.js";
|
|
@@ -27,6 +26,7 @@ import { PipelineDriver } from "./pipeline-driver.js";
|
|
|
27
26
|
import { cmpVersions, EMPTY_CVR_VERSION, versionFromString, versionString, versionToCookie, } from "./schema/types.js";
|
|
28
27
|
import { ResetPipelinesSignal } from "./snapshotter.js";
|
|
29
28
|
import { ttlClockAsNumber, ttlClockFromNumber, } from "./ttl-clock.js";
|
|
29
|
+
import { wrapIterable } from "../../../../shared/src/iterables.js";
|
|
30
30
|
const tracer = trace.getTracer('view-syncer', version);
|
|
31
31
|
const PROTOCOL_VERSION_ATTR = 'protocol.version';
|
|
32
32
|
const DEFAULT_KEEPALIVE_MS = 5_000;
|
|
@@ -112,13 +112,9 @@ export class ViewSyncerService {
|
|
|
112
112
|
description: 'Time to advance all queries for a given client group after applying a new transaction to the replica.',
|
|
113
113
|
unit: 's',
|
|
114
114
|
});
|
|
115
|
-
|
|
116
|
-
#perQueryServerMetrics = new Map();
|
|
117
|
-
#serverMetrics = {
|
|
118
|
-
'query-materialization-server': new TDigest(),
|
|
119
|
-
};
|
|
115
|
+
#inspectMetricsDelegate;
|
|
120
116
|
#config;
|
|
121
|
-
constructor(config, lc, shard, taskID, clientGroupID, cvrDb, upstreamDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
|
|
117
|
+
constructor(config, lc, shard, taskID, clientGroupID, cvrDb, upstreamDb, pipelineDriver, versionChanges, drainCoordinator, slowHydrateThreshold, inspectMetricsDelegate, keepaliveMs = DEFAULT_KEEPALIVE_MS, setTimeoutFn = setTimeout.bind(globalThis)) {
|
|
122
118
|
const { query: pullConfig } = config;
|
|
123
119
|
this.#config = config;
|
|
124
120
|
this.id = clientGroupID;
|
|
@@ -130,6 +126,7 @@ export class ViewSyncerService {
|
|
|
130
126
|
this.#drainCoordinator = drainCoordinator;
|
|
131
127
|
this.#keepaliveMs = keepaliveMs;
|
|
132
128
|
this.#slowHydrateThreshold = slowHydrateThreshold;
|
|
129
|
+
this.#inspectMetricsDelegate = inspectMetricsDelegate;
|
|
133
130
|
this.#cvrStore = new CVRStore(lc, cvrDb, upstreamDb, shard, taskID, clientGroupID,
|
|
134
131
|
// On failure, cancel the #stateChanges subscription. The run()
|
|
135
132
|
// loop will then await #cvrStore.flushed() which rejects if necessary.
|
|
@@ -627,7 +624,7 @@ export class ViewSyncerService {
|
|
|
627
624
|
return; // hydration needs to be run with the CVR updater.
|
|
628
625
|
}
|
|
629
626
|
const gotQueries = Object.entries(cvr.queries).filter(([_, state]) => state.transformationHash !== undefined);
|
|
630
|
-
const customQueries =
|
|
627
|
+
const customQueries = new Map();
|
|
631
628
|
const otherQueries = [];
|
|
632
629
|
for (const [, query] of gotQueries) {
|
|
633
630
|
if (query.type !== 'internal' &&
|
|
@@ -635,38 +632,27 @@ export class ViewSyncerService {
|
|
|
635
632
|
continue; // No longer desired.
|
|
636
633
|
}
|
|
637
634
|
if (query.type === 'custom') {
|
|
638
|
-
customQueries.
|
|
635
|
+
customQueries.set(query.id, query);
|
|
639
636
|
}
|
|
640
637
|
else {
|
|
641
638
|
otherQueries.push(query);
|
|
642
639
|
}
|
|
643
640
|
}
|
|
644
641
|
const transformedQueries = [];
|
|
645
|
-
if (customQueries.
|
|
642
|
+
if (customQueries.size > 0 && !this.#customQueryTransformer) {
|
|
646
643
|
lc.error?.('Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.');
|
|
647
644
|
}
|
|
648
|
-
|
|
645
|
+
const [_, byOriginalHash] = this.#pipelines.addedQueries();
|
|
646
|
+
if (this.#customQueryTransformer && customQueries.size > 0) {
|
|
647
|
+
const filteredCustomQueries = this.#filterCustomQueries(customQueries.values(), byOriginalHash, undefined);
|
|
649
648
|
const transformedCustomQueries = await this.#customQueryTransformer.transform({
|
|
650
649
|
apiKey: this.#queryConfig.apiKey,
|
|
651
650
|
token: this.#authData?.raw,
|
|
652
651
|
cookie: this.#queryConfig.forwardCookies
|
|
653
652
|
? this.#httpCookie
|
|
654
653
|
: undefined,
|
|
655
|
-
},
|
|
656
|
-
|
|
657
|
-
if (Array.isArray(transformedCustomQueries)) {
|
|
658
|
-
for (const q of transformedCustomQueries) {
|
|
659
|
-
if ('error' in q) {
|
|
660
|
-
lc.error?.(`Error transforming custom query ${q.name}: ${q.error}`);
|
|
661
|
-
continue;
|
|
662
|
-
}
|
|
663
|
-
transformedQueries.push(q);
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
// If the result is not an array, it is an error.
|
|
668
|
-
lc.error?.('Error calling API server to transform custom queries', transformedCustomQueries);
|
|
669
|
-
}
|
|
654
|
+
}, filteredCustomQueries);
|
|
655
|
+
this.#processTransformedCustomQueries(lc, transformedCustomQueries, (q) => transformedQueries.push(q), customQueries);
|
|
670
656
|
}
|
|
671
657
|
for (const q of otherQueries) {
|
|
672
658
|
const transformed = transformAndHashQuery(lc, q.id, q.ast, must(this.#pipelines.currentPermissions()).permissions ?? {
|
|
@@ -684,7 +670,7 @@ export class ViewSyncerService {
|
|
|
684
670
|
span.setAttribute('queryHash', hash);
|
|
685
671
|
span.setAttribute('transformationHash', transformationHash);
|
|
686
672
|
span.setAttribute('table', transformedAst.table);
|
|
687
|
-
for (const _ of this.#pipelines.addQuery(transformationHash, transformedAst, timer.start())) {
|
|
673
|
+
for (const _ of this.#pipelines.addQuery(transformationHash, hash, transformedAst, timer.start())) {
|
|
688
674
|
if (++count % TIME_SLICE_CHECK_SIZE === 0) {
|
|
689
675
|
if (timer.elapsedLap() > TIME_SLICE_MS) {
|
|
690
676
|
timer.stopLap();
|
|
@@ -697,19 +683,45 @@ export class ViewSyncerService {
|
|
|
697
683
|
const elapsed = timer.totalElapsed();
|
|
698
684
|
this.#hydrations.add(1);
|
|
699
685
|
this.#hydrationTime.record(elapsed / 1000);
|
|
700
|
-
this.#addQueryMaterializationServerMetric(
|
|
686
|
+
this.#addQueryMaterializationServerMetric(transformationHash, elapsed);
|
|
701
687
|
lc.debug?.(`hydrated ${count} rows for ${hash} (${elapsed} ms)`);
|
|
702
688
|
}
|
|
703
689
|
}
|
|
704
|
-
#
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
690
|
+
#processTransformedCustomQueries(lc, transformedCustomQueries, cb, customQueryMap) {
|
|
691
|
+
const errors = [];
|
|
692
|
+
for (const q of transformedCustomQueries) {
|
|
693
|
+
if ('error' in q) {
|
|
694
|
+
lc.error?.(`Error transforming custom query ${q.name}: ${q.error}`);
|
|
695
|
+
errors.push(q);
|
|
696
|
+
continue;
|
|
697
|
+
}
|
|
698
|
+
cb(q);
|
|
699
|
+
}
|
|
700
|
+
// todo: fan errors out to connected clients
|
|
701
|
+
// based on the client data from queries
|
|
702
|
+
this.#sendQueryTransformErrorToClients(customQueryMap, errors);
|
|
703
|
+
}
|
|
704
|
+
#sendQueryTransformErrorToClients(customQueryMap, errors) {
|
|
705
|
+
const errorGroups = new Map();
|
|
706
|
+
for (const err of errors) {
|
|
707
|
+
const q = customQueryMap.get(err.id);
|
|
708
|
+
assert(q, 'got an error that does not map back to a custom query');
|
|
709
|
+
const clientIds = Object.keys(q.clientState);
|
|
710
|
+
for (const clientId of clientIds) {
|
|
711
|
+
const group = errorGroups.get(clientId) ?? [];
|
|
712
|
+
group.push(err);
|
|
713
|
+
errorGroups.set(clientId, group);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
for (const [clientId, errors] of errorGroups) {
|
|
717
|
+
const client = this.#clients.get(clientId);
|
|
718
|
+
if (client) {
|
|
719
|
+
client.sendQueryTransformErrors(errors);
|
|
720
|
+
}
|
|
710
721
|
}
|
|
711
|
-
|
|
712
|
-
|
|
722
|
+
}
|
|
723
|
+
#addQueryMaterializationServerMetric(transformationHash, elapsed) {
|
|
724
|
+
this.#inspectMetricsDelegate.addMetric('query-materialization-server', elapsed, transformationHash);
|
|
713
725
|
}
|
|
714
726
|
/**
|
|
715
727
|
* Adds and/or removes queries to/from the PipelineDriver to bring it
|
|
@@ -722,7 +734,7 @@ export class ViewSyncerService {
|
|
|
722
734
|
#syncQueryPipelineSet(lc, cvr) {
|
|
723
735
|
return startAsyncSpan(tracer, 'vs.#syncQueryPipelineSet', async () => {
|
|
724
736
|
assert(this.#pipelines.initialized(), 'pipelines must be initialized (syncQueryPipelineSet)');
|
|
725
|
-
const hydratedQueries = this.#pipelines.addedQueries();
|
|
737
|
+
const [hydratedQueries, byOriginalHash] = this.#pipelines.addedQueries();
|
|
726
738
|
// Convert queries to their transformed ast's and hashes
|
|
727
739
|
const hashToIDs = new Map();
|
|
728
740
|
if (this.#ttlClock === undefined) {
|
|
@@ -766,29 +778,29 @@ export class ViewSyncerService {
|
|
|
766
778
|
lc.error?.('Custom/named queries were requested but no `ZERO_QUERY_URL` is configured for Zero Cache.');
|
|
767
779
|
}
|
|
768
780
|
if (this.#customQueryTransformer && customQueries.size > 0) {
|
|
781
|
+
const filteredCustomQueries = this.#filterCustomQueries(customQueries.values(), byOriginalHash, (origQuery, existing) => {
|
|
782
|
+
for (const transformed of existing) {
|
|
783
|
+
transformedQueries.push({
|
|
784
|
+
id: origQuery.id,
|
|
785
|
+
origQuery,
|
|
786
|
+
transformed: {
|
|
787
|
+
id: origQuery.id,
|
|
788
|
+
transformationHash: transformed.transformationHash,
|
|
789
|
+
transformedAst: transformed.transformedAst,
|
|
790
|
+
},
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
});
|
|
769
794
|
const transformedCustomQueries = await this.#customQueryTransformer.transform({
|
|
770
795
|
apiKey: this.#queryConfig.apiKey,
|
|
771
796
|
token: this.#authData?.raw,
|
|
772
797
|
cookie: this.#httpCookie,
|
|
773
|
-
},
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
continue;
|
|
780
|
-
}
|
|
781
|
-
transformedQueries.push({
|
|
782
|
-
id: q.id,
|
|
783
|
-
origQuery: must(customQueries.get(q.id)),
|
|
784
|
-
transformed: q,
|
|
785
|
-
});
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
else {
|
|
789
|
-
// If the result is not an array, it is an error.
|
|
790
|
-
lc.error?.('Error calling API server to transform custom queries', transformedCustomQueries);
|
|
791
|
-
}
|
|
798
|
+
}, filteredCustomQueries);
|
|
799
|
+
this.#processTransformedCustomQueries(lc, transformedCustomQueries, (q) => transformedQueries.push({
|
|
800
|
+
id: q.id,
|
|
801
|
+
origQuery: must(customQueries.get(q.id)),
|
|
802
|
+
transformed: q,
|
|
803
|
+
}), customQueries);
|
|
792
804
|
}
|
|
793
805
|
const serverQueries = transformedQueries.map(({ id, origQuery, transformed }) => {
|
|
794
806
|
const ids = hashToIDs.get(transformed.transformationHash);
|
|
@@ -823,6 +835,21 @@ export class ViewSyncerService {
|
|
|
823
835
|
}
|
|
824
836
|
});
|
|
825
837
|
}
|
|
838
|
+
// Removes queries from `customQueries` that are already
|
|
839
|
+
// transformed and in the pipelines. We do not want to re-transform
|
|
840
|
+
// a query that has already been transformed. The reason is that
|
|
841
|
+
// we do not want a query that is already running to suddenly flip
|
|
842
|
+
// to error due to re-calling transform.
|
|
843
|
+
#filterCustomQueries(customQueries, byOriginalHash, onExisting) {
|
|
844
|
+
return wrapIterable(customQueries).filter(origQuery => {
|
|
845
|
+
const existing = byOriginalHash.get(origQuery.id);
|
|
846
|
+
if (existing) {
|
|
847
|
+
onExisting?.(origQuery, existing);
|
|
848
|
+
return false;
|
|
849
|
+
}
|
|
850
|
+
return true;
|
|
851
|
+
});
|
|
852
|
+
}
|
|
826
853
|
// This must be called from within the #lock.
|
|
827
854
|
#addAndRemoveQueries(lc, cvr, addQueries, removeQueries, unhydrateQueries, hashToIDs) {
|
|
828
855
|
return startAsyncSpan(tracer, 'vs.#addAndRemoveQueries', async () => {
|
|
@@ -847,7 +874,7 @@ export class ViewSyncerService {
|
|
|
847
874
|
for (const q of removeQueries) {
|
|
848
875
|
this.#pipelines.removeQuery(q.transformationHash);
|
|
849
876
|
// Remove per-query server metrics when query is deleted
|
|
850
|
-
this.#
|
|
877
|
+
this.#inspectMetricsDelegate.deleteMetricsForQuery(q.id);
|
|
851
878
|
}
|
|
852
879
|
for (const hash of unhydrateQueries) {
|
|
853
880
|
this.#pipelines.removeQuery(hash);
|
|
@@ -855,7 +882,7 @@ export class ViewSyncerService {
|
|
|
855
882
|
const ids = hashToIDs.get(hash);
|
|
856
883
|
if (ids) {
|
|
857
884
|
for (const id of ids) {
|
|
858
|
-
this.#
|
|
885
|
+
this.#inspectMetricsDelegate.deleteMetricsForQuery(id);
|
|
859
886
|
}
|
|
860
887
|
}
|
|
861
888
|
}
|
|
@@ -872,10 +899,10 @@ export class ViewSyncerService {
|
|
|
872
899
|
.withContext('hash', q.id)
|
|
873
900
|
.withContext('transformationHash', q.transformationHash);
|
|
874
901
|
lc.debug?.(`adding pipeline for query`, q.ast);
|
|
875
|
-
yield* pipelines.addQuery(q.transformationHash, q.ast, timer.start());
|
|
902
|
+
yield* pipelines.addQuery(q.transformationHash, q.id, q.ast, timer.start());
|
|
876
903
|
const elapsed = timer.stop();
|
|
877
904
|
totalProcessTime += elapsed;
|
|
878
|
-
self.#addQueryMaterializationServerMetric(q.
|
|
905
|
+
self.#addQueryMaterializationServerMetric(q.transformationHash, elapsed);
|
|
879
906
|
if (elapsed > slowHydrateThreshold) {
|
|
880
907
|
lc.warn?.('Slow query materialization', elapsed, q.ast);
|
|
881
908
|
}
|
|
@@ -1093,18 +1120,10 @@ export class ViewSyncerService {
|
|
|
1093
1120
|
case 'queries': {
|
|
1094
1121
|
const queryRows = await this.#cvrStore.inspectQueries(lc, cvr.ttlClock, body.clientID);
|
|
1095
1122
|
// Enhance query rows with server-side materialization metrics
|
|
1096
|
-
const enhancedRows = queryRows.map(row => {
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
'query-materialization-server': serverMetrics['query-materialization-server'].toJSON(),
|
|
1101
|
-
}
|
|
1102
|
-
: null;
|
|
1103
|
-
return {
|
|
1104
|
-
...row,
|
|
1105
|
-
metrics,
|
|
1106
|
-
};
|
|
1107
|
-
});
|
|
1123
|
+
const enhancedRows = queryRows.map(row => ({
|
|
1124
|
+
...row,
|
|
1125
|
+
metrics: this.#inspectMetricsDelegate.getMetricsJSONForQuery(row.queryID),
|
|
1126
|
+
}));
|
|
1108
1127
|
client.sendInspectResponse(lc, {
|
|
1109
1128
|
op: 'queries',
|
|
1110
1129
|
id: body.id,
|
|
@@ -1113,11 +1132,10 @@ export class ViewSyncerService {
|
|
|
1113
1132
|
break;
|
|
1114
1133
|
}
|
|
1115
1134
|
case 'metrics': {
|
|
1116
|
-
const serverMetrics = mapValues(this.#serverMetrics, metric => metric.toJSON());
|
|
1117
1135
|
client.sendInspectResponse(lc, {
|
|
1118
1136
|
op: 'metrics',
|
|
1119
1137
|
id: body.id,
|
|
1120
|
-
value:
|
|
1138
|
+
value: this.#inspectMetricsDelegate.getMetricsJSON(),
|
|
1121
1139
|
});
|
|
1122
1140
|
break;
|
|
1123
1141
|
}
|