chkit 0.1.0-beta.26 → 0.1.0-beta.27

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.
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAe,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAM1F,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEzD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,EAAE,EAAE,kBAAkB,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,WAAW,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8CjC"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAe,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAO1F,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEzD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,EAAE,EAAE,kBAAkB,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,WAAW,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgEjC"}
@@ -4,6 +4,7 @@ import { waitForDDLPropagation } from '@chkit/clickhouse';
4
4
  import { debug } from '../../runtime/debug.js';
5
5
  import { checksumSQL } from '../../runtime/migration-store.js';
6
6
  import { extractExecutableStatements, extractMigrationOperationSummaries, } from '../../runtime/safety-markers.js';
7
+ import { applyAsyncStatement } from './async-apply.js';
7
8
  export async function applyMigration(input) {
8
9
  const { db, journalStore, pluginRuntime, config, tableScope, flags, migrationsDir, file } = input;
9
10
  debug('migrate', `applying ${file}`);
@@ -20,10 +21,27 @@ export async function applyMigration(input) {
20
21
  sql,
21
22
  statements: parsedStatements,
22
23
  });
24
+ const migrationChecksum = checksumSQL(sql);
23
25
  for (let i = 0; i < statements.length; i++) {
24
26
  const statement = statements[i];
25
- await db.command(statement);
26
27
  const operation = operationSummaries[i];
28
+ if (operation?.mode === 'async') {
29
+ await applyAsyncStatement({
30
+ db,
31
+ journalStore,
32
+ sql: statement,
33
+ migrationName: file,
34
+ migrationChecksum,
35
+ statementIndex: i,
36
+ operationType: operation.type,
37
+ operationKey: operation.key,
38
+ beforeRetry: operation.beforeRetry,
39
+ log: (line) => console.log(line),
40
+ });
41
+ // Async ops are DML (loads, backfills) — no DDL propagation to wait on.
42
+ continue;
43
+ }
44
+ await db.command(statement);
27
45
  if (operation) {
28
46
  await waitForDDLPropagation(db, operation.type, operation.key);
29
47
  }
@@ -31,7 +49,7 @@ export async function applyMigration(input) {
31
49
  const entry = {
32
50
  name: file,
33
51
  appliedAt: new Date().toISOString().replace('Z', ''),
34
- checksum: checksumSQL(sql),
52
+ checksum: migrationChecksum,
35
53
  };
36
54
  await journalStore.appendEntry(entry);
37
55
  await pluginRuntime.runOnAfterApply({
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,qBAAqB,EAA2B,MAAM,mBAAmB,CAAA;AAIlF,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,OAAO,EAAE,WAAW,EAA8B,MAAM,kCAAkC,CAAA;AAC1F,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,iCAAiC,CAAA;AAIxC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KASpC;IACC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAEjG,KAAK,CAAC,SAAS,EAAE,YAAY,IAAI,EAAE,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC7D,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAA;IACzD,MAAM,kBAAkB,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAA;IAClE,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,gBAAgB,CAAC,MAAM,gBAAgB,kBAAkB,CAAC,MAAM,aAAa,CAAC,CAAA;IAE3G,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC;QACtD,OAAO,EAAE,SAAS;QAClB,MAAM;QACN,UAAU;QACV,KAAK;QACL,SAAS,EAAE,IAAI;QACf,GAAG;QACH,UAAU,EAAE,gBAAgB;KAC7B,CAAC,CAAA;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAW,CAAA;QACzC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC3B,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,qBAAqB,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAA0B;QACnC,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACpD,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC;KAC3B,CAAA;IACD,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAErC,MAAM,aAAa,CAAC,eAAe,CAAC;QAClC,OAAO,EAAE,SAAS;QAClB,MAAM;QACN,UAAU;QACV,KAAK;QACL,SAAS,EAAE,IAAI;QACf,UAAU;QACV,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ClickHouseExecutor } from '@chkit/clickhouse';
2
+ import type { JournalStore, OperationState } from '../../runtime/journal-store.js';
3
+ export interface AsyncApplyInput {
4
+ db: ClickHouseExecutor;
5
+ journalStore: JournalStore;
6
+ sql: string;
7
+ migrationName: string;
8
+ migrationChecksum: string;
9
+ statementIndex: number;
10
+ operationType: string;
11
+ operationKey: string;
12
+ beforeRetry: string | null;
13
+ log: (line: string) => void;
14
+ pollIntervalMs?: number;
15
+ sleep?: (ms: number) => Promise<void>;
16
+ now?: () => number;
17
+ }
18
+ export type AsyncApplyResult = {
19
+ kind: 'completed';
20
+ operation: OperationState;
21
+ } | {
22
+ kind: 'skipped';
23
+ operation: OperationState;
24
+ };
25
+ export declare function applyAsyncStatement(input: AsyncApplyInput): Promise<AsyncApplyResult>;
26
+ export declare function makeDeterministicQueryId(migrationName: string, statementIndex: number): string;
27
+ //# sourceMappingURL=async-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-apply.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/async-apply.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,mBAAmB,CAAA;AAGxE,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACf,MAAM,gCAAgC,CAAA;AAIvC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,kBAAkB,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,CAAA;AAElD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2I3F;AAkKD,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,MAAM,CAWR"}
@@ -0,0 +1,234 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { debug } from '../../runtime/debug.js';
3
+ const POLL_INTERVAL_MS = 5_000;
4
+ export async function applyAsyncStatement(input) {
5
+ const { db, journalStore, sql, migrationName, migrationChecksum, statementIndex, operationType, operationKey, beforeRetry, log, pollIntervalMs = POLL_INTERVAL_MS, sleep = defaultSleep, now = Date.now, } = input;
6
+ const queryId = makeDeterministicQueryId(migrationName, statementIndex);
7
+ debug('migrate:async', `${migrationName}#${statementIndex} query_id=${queryId} type=${operationType}`);
8
+ const initialMigrationState = await journalStore.readMigrationState(migrationName);
9
+ if (initialMigrationState !== null &&
10
+ !initialMigrationState.migrationCompleted &&
11
+ initialMigrationState.checksum !== migrationChecksum) {
12
+ throw new Error(`Migration ${migrationName} has in-progress async journal state for checksum ${initialMigrationState.checksum}, but the current file checksum is ${migrationChecksum}. Restore the original migration file or clear the in-progress journal state before retrying.`);
13
+ }
14
+ const priorOpState = initialMigrationState?.operations.find((op) => op.operationIndex === statementIndex);
15
+ // 1. Already completed → skip entirely
16
+ if (priorOpState?.status === 'completed') {
17
+ log(` ${operationType}: query_id=${queryId} already completed in prior run — skipping`);
18
+ return { kind: 'skipped', operation: priorOpState };
19
+ }
20
+ // 2. Currently in flight on the server → attach
21
+ const inFlight = await db.queryStatus(queryId);
22
+ if (inFlight.status === 'running') {
23
+ log(` ${operationType}: query_id=${queryId} already running on server — attaching to in-flight query`);
24
+ return await pollUntilTerminal({
25
+ db,
26
+ journalStore,
27
+ migrationState: initialMigrationState,
28
+ migrationName,
29
+ migrationChecksum,
30
+ statementIndex,
31
+ operationType,
32
+ operationKey,
33
+ queryId,
34
+ pollAfterTime: '1970-01-01 00:00:00',
35
+ log,
36
+ pollIntervalMs,
37
+ sleep,
38
+ now,
39
+ // No submit promise — query was started by a prior chkit run that's
40
+ // now gone. We only observe its eventual completion.
41
+ submitPromise: null,
42
+ startedAt: priorOpState?.startedAt ?? isoWithoutZone(new Date(now())),
43
+ });
44
+ }
45
+ // 3. Prior in-progress row exists but query is not in system.processes →
46
+ // RETRY. Run before-retry compensation, then resubmit forward.
47
+ // 4. No prior row → FIRST attempt. Skip compensation, submit forward.
48
+ // (priorOpState.status === 'completed' was already returned above.)
49
+ if (priorOpState !== undefined) {
50
+ const errorTail = priorOpState.lastError
51
+ ? `: ${firstLine(priorOpState.lastError)}`
52
+ : '';
53
+ log(` ${operationType}: previous attempt of query_id=${queryId} is no longer running (status=${priorOpState.status}${errorTail}) — running before-retry then resubmitting`);
54
+ if (beforeRetry !== null) {
55
+ log(` ${operationType}: running before-retry SQL`);
56
+ await db.command(beforeRetry);
57
+ }
58
+ }
59
+ else {
60
+ log(` ${operationType}: submitting async (query_id=${queryId})`);
61
+ }
62
+ const submitAfterTime = priorOpState === undefined ? undefined : isoWithoutZone(new Date(now() - 60_000));
63
+ const startedAt = isoWithoutZone(new Date(now()));
64
+ // Persist the "started" intent BEFORE submitting, so a crash between here
65
+ // and the next event still leaves chkit able to detect "this op was tried."
66
+ await journalStore.writeMigrationState(upsertOperation(initialMigrationState ?? freshMigrationState(migrationName, migrationChecksum), {
67
+ operationIndex: statementIndex,
68
+ operationKey,
69
+ operationType,
70
+ queryId,
71
+ status: 'started',
72
+ startedAt,
73
+ finishedAt: null,
74
+ lastError: '',
75
+ }, now));
76
+ // Re-read so we have the row's actual stored applied_at (matters for
77
+ // subsequent ReplacingMergeTree writes during polling).
78
+ const stateAfterStart = await journalStore.readMigrationState(migrationName);
79
+ const submitPromise = db.submit(sql, queryId);
80
+ return await pollUntilTerminal({
81
+ db,
82
+ journalStore,
83
+ migrationState: stateAfterStart,
84
+ migrationName,
85
+ migrationChecksum,
86
+ statementIndex,
87
+ operationType,
88
+ operationKey,
89
+ queryId,
90
+ pollAfterTime: submitAfterTime,
91
+ log,
92
+ pollIntervalMs,
93
+ sleep,
94
+ now,
95
+ submitPromise,
96
+ startedAt,
97
+ });
98
+ }
99
+ async function pollUntilTerminal(input) {
100
+ const { db, journalStore, migrationState, migrationName, migrationChecksum, statementIndex, operationType, operationKey, queryId, pollAfterTime, log, pollIntervalMs, sleep, now, submitPromise, startedAt, } = input;
101
+ let submitError = null;
102
+ // Capture the submit promise rejection so it doesn't surface as an
103
+ // unhandled rejection. Polling is the source of truth for outcome.
104
+ const submitPromiseGuarded = submitPromise === null
105
+ ? null
106
+ : submitPromise.catch((error) => {
107
+ submitError = error instanceof Error ? error : new Error(String(error));
108
+ });
109
+ const pollStartedAt = now();
110
+ try {
111
+ for (;;) {
112
+ await sleep(pollIntervalMs);
113
+ const status = await db.queryStatus(queryId, pollAfterTime === undefined ? undefined : { afterTime: pollAfterTime });
114
+ const elapsedSec = Math.floor((now() - pollStartedAt) / 1000);
115
+ if (status.status === 'finished') {
116
+ const finishedSec = Math.round((status.durationMs ?? 0) / 1000);
117
+ const finishedOp = {
118
+ operationIndex: statementIndex,
119
+ operationKey,
120
+ operationType,
121
+ queryId,
122
+ status: 'completed',
123
+ startedAt,
124
+ finishedAt: isoWithoutZone(new Date(now())),
125
+ lastError: '',
126
+ };
127
+ const baseState = migrationState ?? freshMigrationState(migrationName, migrationChecksum);
128
+ await journalStore.writeMigrationState(upsertOperation(baseState, finishedOp, now));
129
+ log(` ${operationType}: finished — written=${formatRows(status.writtenRows)} (${formatBytes(status.writtenBytes)}) in ${finishedSec}s`);
130
+ return { kind: 'completed', operation: finishedOp };
131
+ }
132
+ if (status.status === 'failed') {
133
+ const failedOp = {
134
+ operationIndex: statementIndex,
135
+ operationKey,
136
+ operationType,
137
+ queryId,
138
+ status: 'failed',
139
+ startedAt,
140
+ finishedAt: isoWithoutZone(new Date(now())),
141
+ lastError: status.error ?? '<unknown>',
142
+ };
143
+ const baseState = migrationState ?? freshMigrationState(migrationName, migrationChecksum);
144
+ await journalStore.writeMigrationState(upsertOperation(baseState, failedOp, now));
145
+ throw new Error(`Async migration step ${operationType} failed (query_id ${queryId}): ${status.error ?? '<unknown>'}`);
146
+ }
147
+ if (status.status === 'running') {
148
+ log(progressLine(operationType, status, elapsedSec));
149
+ continue;
150
+ }
151
+ // status === 'unknown'
152
+ // If submit has already rejected, the query never made it server-side
153
+ // (e.g. SQL parse error) — surface that error. Otherwise it's a
154
+ // transient gap (just-submitted or just-finished); loop.
155
+ if (submitError) {
156
+ throw submitError;
157
+ }
158
+ log(` ${operationType}: status unknown — still polling (elapsed ${elapsedSec}s)`);
159
+ }
160
+ }
161
+ finally {
162
+ if (submitPromiseGuarded) {
163
+ await submitPromiseGuarded.catch(() => { });
164
+ }
165
+ }
166
+ }
167
+ function upsertOperation(state, op, now) {
168
+ const others = state.operations.filter((existing) => existing.operationIndex !== op.operationIndex);
169
+ const operations = [...others, op].sort((a, b) => a.operationIndex - b.operationIndex);
170
+ return {
171
+ ...state,
172
+ appliedAt: isoWithoutZone(new Date(now())),
173
+ operations,
174
+ // migrationCompleted stays false until applyMigration explicitly flips it
175
+ migrationCompleted: state.migrationCompleted,
176
+ };
177
+ }
178
+ function freshMigrationState(migrationName, checksum) {
179
+ return {
180
+ name: migrationName,
181
+ appliedAt: '1970-01-01 00:00:00.000',
182
+ checksum,
183
+ chkitVersion: '',
184
+ migrationCompleted: false,
185
+ operations: [],
186
+ };
187
+ }
188
+ export function makeDeterministicQueryId(migrationName, statementIndex) {
189
+ const hex = createHash('sha256')
190
+ .update(`chkit:${migrationName}:${statementIndex}`)
191
+ .digest('hex');
192
+ return [
193
+ hex.slice(0, 8),
194
+ hex.slice(8, 12),
195
+ hex.slice(12, 16),
196
+ hex.slice(16, 20),
197
+ hex.slice(20, 32),
198
+ ].join('-');
199
+ }
200
+ function progressLine(operationLabel, status, elapsedSec) {
201
+ const rows = formatRows(status.writtenRows);
202
+ const bytes = formatBytes(status.writtenBytes);
203
+ return ` ${operationLabel}: written=${rows} (${bytes}), elapsed ${elapsedSec}s`;
204
+ }
205
+ function formatRows(value) {
206
+ if (value === undefined || value === 0)
207
+ return '0 rows';
208
+ if (value >= 1_000_000)
209
+ return `${(value / 1_000_000).toFixed(2)}M rows`;
210
+ if (value >= 1_000)
211
+ return `${(value / 1_000).toFixed(1)}K rows`;
212
+ return `${value} rows`;
213
+ }
214
+ function formatBytes(value) {
215
+ if (value === undefined || value === 0)
216
+ return '0 B';
217
+ if (value >= 1024 ** 3)
218
+ return `${(value / 1024 ** 3).toFixed(2)} GiB`;
219
+ if (value >= 1024 ** 2)
220
+ return `${(value / 1024 ** 2).toFixed(1)} MiB`;
221
+ if (value >= 1024)
222
+ return `${(value / 1024).toFixed(1)} KiB`;
223
+ return `${value} B`;
224
+ }
225
+ function isoWithoutZone(date) {
226
+ return date.toISOString().replace('Z', '');
227
+ }
228
+ function firstLine(value) {
229
+ return value.split('\n')[0] ?? value;
230
+ }
231
+ function defaultSleep(ms) {
232
+ return new Promise((resolve) => setTimeout(resolve, ms));
233
+ }
234
+ //# sourceMappingURL=async-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-apply.js","sourceRoot":"","sources":["../../../src/commands/migrate/async-apply.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,30 @@
1
1
  import { type ClickHouseExecutor } from '@chkit/clickhouse';
2
2
  import type { MigrationJournal, MigrationJournalEntry } from './migration-store.js';
3
- interface JournalStore {
3
+ export type OperationStatus = 'started' | 'completed' | 'failed';
4
+ export interface OperationState {
5
+ operationIndex: number;
6
+ operationKey: string;
7
+ operationType: string;
8
+ queryId: string;
9
+ status: OperationStatus;
10
+ startedAt: string;
11
+ finishedAt: string | null;
12
+ lastError: string;
13
+ }
14
+ export interface MigrationRowState {
15
+ name: string;
16
+ appliedAt: string;
17
+ checksum: string;
18
+ chkitVersion: string;
19
+ migrationCompleted: boolean;
20
+ operations: OperationState[];
21
+ }
22
+ export interface JournalStore {
4
23
  readJournal(): Promise<MigrationJournal>;
24
+ readMigrationState(migrationName: string): Promise<MigrationRowState | null>;
25
+ writeMigrationState(state: MigrationRowState): Promise<void>;
5
26
  appendEntry(entry: MigrationJournalEntry): Promise<void>;
6
27
  readonly databaseMissing: boolean;
7
28
  }
8
29
  export declare function createJournalStore(db: ClickHouseExecutor): JournalStore;
9
- export {};
10
30
  //# sourceMappingURL=journal-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"journal-store.d.ts","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAInF,UAAU,YAAY;IACpB,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACxC,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAClC;AA4BD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,GAAG,YAAY,CAkHvE"}
1
+ {"version":3,"file":"journal-store.d.ts","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAInF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,cAAc,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACxC,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC5E,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAClC;AAkFD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,GAAG,YAAY,CAoKvE"}
@@ -11,12 +11,46 @@ function resolveJournalTableName() {
11
11
  }
12
12
  return candidate;
13
13
  }
14
+ const OPERATIONS_TUPLE_TYPE = 'Array(Tuple(operation_index Int32, operation_key String, operation_type String, query_id String, status LowCardinality(String), started_at DateTime64(3, \'UTC\'), finished_at Nullable(DateTime64(3, \'UTC\')), last_error String))';
14
15
  function isRetryableInsertRace(error) {
15
16
  if (!(error instanceof Error))
16
17
  return false;
17
18
  const message = error.message;
18
19
  return message.includes('INSERT race condition') || message.includes('Please retry the INSERT');
19
20
  }
21
+ function escapeSqlString(value) {
22
+ return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
23
+ }
24
+ function operationToTupleLiteral(op) {
25
+ const parts = [
26
+ String(op.operationIndex),
27
+ `'${escapeSqlString(op.operationKey)}'`,
28
+ `'${escapeSqlString(op.operationType)}'`,
29
+ `'${escapeSqlString(op.queryId)}'`,
30
+ `'${escapeSqlString(op.status)}'`,
31
+ `'${escapeSqlString(op.startedAt)}'`,
32
+ op.finishedAt === null ? 'NULL' : `'${escapeSqlString(op.finishedAt)}'`,
33
+ `'${escapeSqlString(op.lastError)}'`,
34
+ ];
35
+ return `(${parts.join(',')})`;
36
+ }
37
+ function operationsArrayLiteral(operations) {
38
+ if (operations.length === 0)
39
+ return '[]';
40
+ return `[${operations.map(operationToTupleLiteral).join(',')}]`;
41
+ }
42
+ function operationFromTuple(row) {
43
+ return {
44
+ operationIndex: Number(row.operation_index),
45
+ operationKey: row.operation_key,
46
+ operationType: row.operation_type,
47
+ queryId: row.query_id,
48
+ status: row.status,
49
+ startedAt: row.started_at,
50
+ finishedAt: row.finished_at,
51
+ lastError: row.last_error,
52
+ };
53
+ }
20
54
  export function createJournalStore(db) {
21
55
  const journalTable = resolveJournalTableName();
22
56
  debug('journal', `journal table: ${journalTable}${process.env.CHKIT_JOURNAL_TABLE ? ' (from CHKIT_JOURNAL_TABLE)' : ''}`);
@@ -24,7 +58,9 @@ export function createJournalStore(db) {
24
58
  name String,
25
59
  applied_at DateTime64(3, 'UTC'),
26
60
  checksum String,
27
- chkit_version String
61
+ chkit_version String,
62
+ migration_completed Bool DEFAULT true,
63
+ operations ${OPERATIONS_TUPLE_TYPE} DEFAULT []
28
64
  ) ENGINE = ReplacingMergeTree(applied_at)
29
65
  ORDER BY (name)
30
66
  SETTINGS index_granularity = 1`;
@@ -36,7 +72,8 @@ SETTINGS index_granularity = 1`;
36
72
  debug('journal', `probing journal table "${journalTable}"`);
37
73
  try {
38
74
  await db.query(`SELECT name FROM ${journalTable} LIMIT 0`);
39
- debug('journal', 'journal table exists');
75
+ debug('journal', 'journal table exists — checking schema');
76
+ await ensureSchemaUpgraded();
40
77
  bootstrapped = true;
41
78
  return;
42
79
  }
@@ -73,6 +110,22 @@ SETTINGS index_granularity = 1`;
73
110
  }
74
111
  bootstrapped = true;
75
112
  }
113
+ async function ensureSchemaUpgraded() {
114
+ // Pre-existing journal tables predate per-operation tracking. Add the
115
+ // columns idempotently so older deployments pick them up on first run
116
+ // of the new chkit. ALTER ADD COLUMN IF NOT EXISTS is a metadata op,
117
+ // no data rewrite.
118
+ await db.command(`ALTER TABLE ${journalTable} ADD COLUMN IF NOT EXISTS migration_completed Bool DEFAULT true`);
119
+ await db.command(`ALTER TABLE ${journalTable} ADD COLUMN IF NOT EXISTS operations ${OPERATIONS_TUPLE_TYPE} DEFAULT []`);
120
+ }
121
+ async function trySyncReplica() {
122
+ try {
123
+ await db.command(`SYSTEM SYNC REPLICA ${journalTable}`);
124
+ }
125
+ catch {
126
+ // Non-replicated or single-node setups don't support SYSTEM SYNC REPLICA.
127
+ }
128
+ }
76
129
  return {
77
130
  get databaseMissing() {
78
131
  return _databaseMissing;
@@ -84,13 +137,8 @@ SETTINGS index_granularity = 1`;
84
137
  debug('journal', 'database missing — returning empty journal');
85
138
  return { version: 1, applied: [] };
86
139
  }
87
- try {
88
- await db.command(`SYSTEM SYNC REPLICA ${journalTable}`);
89
- }
90
- catch {
91
- // Non-replicated or single-node setups don't support SYSTEM SYNC REPLICA.
92
- }
93
- const rows = await db.query(`SELECT name, applied_at, checksum, chkit_version FROM ${journalTable} ORDER BY name SETTINGS select_sequential_consistency = 1`);
140
+ await trySyncReplica();
141
+ const rows = await db.query(`SELECT name, applied_at, checksum, chkit_version FROM ${journalTable} FINAL WHERE migration_completed = true ORDER BY name SETTINGS select_sequential_consistency = 1`);
94
142
  debug('journal', `journal has ${rows.length} applied entries`);
95
143
  return {
96
144
  version: 1,
@@ -101,16 +149,32 @@ SETTINGS index_granularity = 1`;
101
149
  })),
102
150
  };
103
151
  },
104
- async appendEntry(entry) {
105
- debug('journal', `appending entry: ${entry.name} (checksum: ${entry.checksum})`);
152
+ async readMigrationState(migrationName) {
153
+ await ensureTable();
154
+ if (_databaseMissing)
155
+ return null;
156
+ await trySyncReplica();
157
+ const rows = await db.query(`SELECT name, applied_at, checksum, chkit_version, migration_completed, operations FROM ${journalTable} FINAL WHERE name = '${escapeSqlString(migrationName)}' LIMIT 1 SETTINGS select_sequential_consistency = 1`);
158
+ const row = rows[0];
159
+ if (!row)
160
+ return null;
161
+ return {
162
+ name: row.name,
163
+ appliedAt: row.applied_at,
164
+ checksum: row.checksum,
165
+ chkitVersion: row.chkit_version,
166
+ migrationCompleted: Boolean(row.migration_completed),
167
+ operations: (row.operations ?? []).map(operationFromTuple),
168
+ };
169
+ },
170
+ async writeMigrationState(state) {
106
171
  if (_databaseMissing) {
107
172
  debug('journal', 'resetting databaseMissing flag — migration may have created the database');
108
173
  _databaseMissing = false;
109
174
  bootstrapped = false;
110
175
  }
111
176
  await ensureTable();
112
- const esc = (s) => s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
113
- const insertSql = `INSERT INTO ${journalTable} (name, applied_at, checksum, chkit_version) VALUES ('${esc(entry.name)}', '${esc(entry.appliedAt)}', '${esc(entry.checksum)}', '${esc(CLI_VERSION)}')`;
177
+ const insertSql = `INSERT INTO ${journalTable} (name, applied_at, checksum, chkit_version, migration_completed, operations) VALUES ('${escapeSqlString(state.name)}', '${escapeSqlString(state.appliedAt)}', '${escapeSqlString(state.checksum)}', '${escapeSqlString(state.chkitVersion || CLI_VERSION)}', ${state.migrationCompleted ? 'true' : 'false'}, ${operationsArrayLiteral(state.operations)})`;
114
178
  const maxAttempts = 5;
115
179
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
116
180
  try {
@@ -125,12 +189,21 @@ SETTINGS index_granularity = 1`;
125
189
  await new Promise((r) => setTimeout(r, attempt * 150));
126
190
  }
127
191
  }
128
- try {
129
- await db.command(`SYSTEM SYNC REPLICA ${journalTable}`);
130
- }
131
- catch {
132
- // Non-replicated or single-node setups don't support SYSTEM SYNC REPLICA.
133
- }
192
+ await trySyncReplica();
193
+ },
194
+ async appendEntry(entry) {
195
+ debug('journal', `appending entry: ${entry.name} (checksum: ${entry.checksum})`);
196
+ // Preserve any per-operation history that async statements wrote
197
+ // earlier in this migration's apply — we just flip migrationCompleted.
198
+ const existing = await this.readMigrationState(entry.name);
199
+ await this.writeMigrationState({
200
+ name: entry.name,
201
+ appliedAt: entry.appliedAt,
202
+ checksum: entry.checksum,
203
+ chkitVersion: CLI_VERSION,
204
+ migrationCompleted: true,
205
+ operations: existing?.operations ?? [],
206
+ });
134
207
  },
135
208
  };
136
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"journal-store.js","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"journal-store.js","sourceRoot":"","sources":["../../src/runtime/journal-store.ts"],"names":[],"mappings":"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"}
@@ -11,10 +11,20 @@ export interface DestructiveOperationMarker {
11
11
  recommendation: string;
12
12
  summary: string;
13
13
  }
14
- interface MigrationOperationSummary {
14
+ export type MigrationOperationMode = 'sync' | 'async';
15
+ export interface MigrationOperationSummary {
15
16
  type: string;
16
17
  key: string;
17
18
  risk: string;
19
+ mode: MigrationOperationMode;
20
+ /**
21
+ * SQL to run BEFORE re-attempting this operation, parsed from a
22
+ * `-- before-retry: <sql>` header line that follows the `-- operation:`
23
+ * line. Empty / null on first attempt; runs on every retry. Compensates
24
+ * for partial side effects left behind by a failed prior attempt
25
+ * (e.g. TRUNCATE a partially-loaded table before re-INSERTing).
26
+ */
27
+ beforeRetry: string | null;
18
28
  summary: string;
19
29
  }
20
30
  export declare function migrationContainsDangerOperation(sql: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"safety-markers.d.ts","sourceRoot":"","sources":["../../src/runtime/safety-markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,EAAE,2BAA2B,EAAE,CAAA;AAEtC,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErE;AAqBD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAQ3F;AAyCD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,0BAA0B,EAAE,CAmB9B"}
1
+ {"version":3,"file":"safety-markers.d.ts","sourceRoot":"","sources":["../../src/runtime/safety-markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,EAAE,2BAA2B,EAAE,CAAA;AAEtC,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,sBAAsB,CAAA;IAC5B;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErE;AAoCD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,EAAE,CA0B3F;AAyCD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,0BAA0B,EAAE,CAmB9B"}
@@ -10,25 +10,57 @@ function extractDestructiveOperationSummaries(sql) {
10
10
  .filter((line) => line.startsWith('-- operation:') && line.includes('risk=danger'))
11
11
  .map((line) => line.replace(/^-- operation:\s*/, ''));
12
12
  }
13
- function parseOperationLine(summary) {
14
- const match = summary.match(/^([a-z_]+)\s+key=([^\s]+)\s+risk=([a-z_]+)$/);
13
+ function parseOperationLine(summary, beforeRetry) {
14
+ const match = summary.match(/^([a-z_]+)\s+key=([^\s]+)\s+risk=([a-z_]+)(?:\s+mode=([a-z_]+))?$/);
15
15
  if (!match)
16
16
  return null;
17
+ const rawMode = match[4];
18
+ const mode = rawMode === 'async' ? 'async' : 'sync';
17
19
  return {
18
20
  type: match[1] ?? 'unknown',
19
21
  key: match[2] ?? 'unknown',
20
22
  risk: match[3] ?? 'unknown',
23
+ mode,
24
+ beforeRetry,
21
25
  summary,
22
26
  };
23
27
  }
28
+ const BEFORE_RETRY_PREFIX = '-- before-retry:';
29
+ function stripTrailingSemicolon(value) {
30
+ return value.replace(/;\s*$/, '').trim();
31
+ }
24
32
  export function extractMigrationOperationSummaries(sql) {
25
- return sql
26
- .split('\n')
27
- .map((line) => line.trim())
28
- .filter((line) => line.startsWith('-- operation:'))
29
- .map((line) => line.replace(/^-- operation:\s*/, ''))
30
- .map((summary) => parseOperationLine(summary))
31
- .filter((item) => item !== null);
33
+ const lines = sql.split('\n').map((line) => line.trim());
34
+ const summaries = [];
35
+ for (let i = 0; i < lines.length; i++) {
36
+ const line = lines[i];
37
+ if (!line?.startsWith('-- operation:'))
38
+ continue;
39
+ const summary = line.replace(/^-- operation:\s*/, '');
40
+ // A `-- before-retry: <sql>` line is associated with the operation if it
41
+ // appears in the comment block immediately following the operation line
42
+ // (allowing blank/comment lines in between, but not executable SQL).
43
+ let beforeRetry = null;
44
+ for (let j = i + 1; j < lines.length; j++) {
45
+ const next = lines[j];
46
+ if (next === undefined)
47
+ break;
48
+ if (next === '')
49
+ continue;
50
+ if (!next.startsWith('--'))
51
+ break;
52
+ if (next.startsWith(BEFORE_RETRY_PREFIX)) {
53
+ beforeRetry = stripTrailingSemicolon(next.slice(BEFORE_RETRY_PREFIX.length).trim());
54
+ if (beforeRetry === '')
55
+ beforeRetry = null;
56
+ break;
57
+ }
58
+ }
59
+ const parsed = parseOperationLine(summary, beforeRetry);
60
+ if (parsed !== null)
61
+ summaries.push(parsed);
62
+ }
63
+ return summaries;
32
64
  }
33
65
  function describeDestructiveOperation(type) {
34
66
  if (type === 'drop_table') {
@@ -64,7 +96,7 @@ function describeDestructiveOperation(type) {
64
96
  }
65
97
  export function collectDestructiveOperationMarkers(migration, sql) {
66
98
  return extractDestructiveOperationSummaries(sql).map((summary) => {
67
- const parsed = parseOperationLine(summary);
99
+ const parsed = parseOperationLine(summary, null);
68
100
  const type = parsed?.type ?? 'unknown';
69
101
  const key = parsed?.key ?? 'unknown';
70
102
  const risk = parsed?.risk ?? 'danger';
@@ -1 +1 @@
1
- {"version":3,"file":"safety-markers.js","sourceRoot":"","sources":["../../src/runtime/safety-markers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safety-markers.js","sourceRoot":"","sources":["../../src/runtime/safety-markers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chkit",
3
- "version": "0.1.0-beta.26",
3
+ "version": "0.1.0-beta.27",
4
4
  "description": "ClickHouse schema and migration CLI for TypeScript projects",
5
5
  "license": "MIT",
6
6
  "author": "ObsessionDB",
@@ -40,12 +40,12 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "fast-glob": "^3.3.2",
43
- "@chkit/clickhouse": "0.1.0-beta.26",
44
- "@chkit/codegen": "0.1.0-beta.26",
45
- "@chkit/core": "0.1.0-beta.26",
43
+ "@chkit/clickhouse": "0.1.0-beta.27",
44
+ "@chkit/codegen": "0.1.0-beta.27",
45
+ "@chkit/core": "0.1.0-beta.27",
46
46
  "@logtape/logtape": "^2.0.5"
47
47
  },
48
48
  "optionalDependencies": {
49
- "@chkit/plugin-obsessiondb": "0.1.0-beta.24"
49
+ "@chkit/plugin-obsessiondb": "0.1.0-beta.26"
50
50
  }
51
51
  }