@quereus/sync-coordinator 0.9.1 → 0.10.0
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/README.md +9 -0
- package/dist/src/common/index.d.ts +1 -1
- package/dist/src/common/index.d.ts.map +1 -1
- package/dist/src/common/index.js +1 -1
- package/dist/src/common/index.js.map +1 -1
- package/dist/src/common/serialization.d.ts +5 -0
- package/dist/src/common/serialization.d.ts.map +1 -1
- package/dist/src/common/serialization.js +42 -0
- package/dist/src/common/serialization.js.map +1 -1
- package/dist/src/service/coordinator-service.d.ts +5 -0
- package/dist/src/service/coordinator-service.d.ts.map +1 -1
- package/dist/src/service/coordinator-service.js +75 -12
- package/dist/src/service/coordinator-service.js.map +1 -1
- package/dist/src/service/s3-batch-store.d.ts +9 -0
- package/dist/src/service/s3-batch-store.d.ts.map +1 -1
- package/dist/src/service/s3-batch-store.js +41 -1
- package/dist/src/service/s3-batch-store.js.map +1 -1
- package/dist/src/service/s3-snapshot-store.d.ts +16 -1
- package/dist/src/service/s3-snapshot-store.d.ts.map +1 -1
- package/dist/src/service/s3-snapshot-store.js +55 -4
- package/dist/src/service/s3-snapshot-store.js.map +1 -1
- package/dist/src/service/store-manager.d.ts +29 -0
- package/dist/src/service/store-manager.d.ts.map +1 -1
- package/dist/src/service/store-manager.js +109 -8
- package/dist/src/service/store-manager.js.map +1 -1
- package/dist/src/service/types.d.ts +2 -1
- package/dist/src/service/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -79,6 +79,10 @@ Enable S3 batch storage for durability and disaster recovery:
|
|
|
79
79
|
| `S3_SECRET_ACCESS_KEY` | AWS secret key | — |
|
|
80
80
|
| `S3_FORCE_PATH_STYLE` | Use path-style URLs (for MinIO) | `false` |
|
|
81
81
|
| `S3_KEY_PREFIX` | Key prefix for all objects | — |
|
|
82
|
+
| `DISK_EVICTION_ENABLED` | Enable disk eviction for idle stores backed by S3 (auto-enabled with `S3_BUCKET`) | `true` if S3 set |
|
|
83
|
+
| `DISK_EVICTION_IDLE_MS` | Idle time (ms) before a closed store's local directory is deleted | `3600000` (1 hr) |
|
|
84
|
+
|
|
85
|
+
When S3 is configured, local LevelDB directories act as a write-back cache. After a store is closed (idle 5 min) and remains unused for `DISK_EVICTION_IDLE_MS`, its local directory is deleted — provided an S3 snapshot exists. On next access, the store is automatically restored from S3.
|
|
82
86
|
|
|
83
87
|
#### Local Testing with MinIO
|
|
84
88
|
|
|
@@ -128,10 +132,15 @@ sync_http_requests_total # HTTP requests by endpoint/status
|
|
|
128
132
|
sync_changes_applied_total # Changes applied
|
|
129
133
|
sync_changes_received_total # Changes received from clients
|
|
130
134
|
sync_changes_rejected_total # Changes rejected during validation
|
|
135
|
+
sync_changes_broadcast_total # Changes broadcast to clients
|
|
136
|
+
sync_broadcast_errors_total # Broadcast send failures
|
|
137
|
+
sync_snapshot_requests_total # Snapshot requests
|
|
138
|
+
sync_snapshot_chunks_total # Snapshot chunks sent
|
|
131
139
|
sync_auth_attempts_total # Authentication attempts
|
|
132
140
|
sync_auth_failures_total # Authentication failures
|
|
133
141
|
sync_apply_changes_duration_seconds # Apply operation duration histogram
|
|
134
142
|
sync_get_changes_duration_seconds # Get changes duration histogram
|
|
143
|
+
sync_change_batch_size # Change batch size histogram
|
|
135
144
|
```
|
|
136
145
|
|
|
137
146
|
## Custom Hooks
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Common utilities for sync-coordinator.
|
|
3
3
|
*/
|
|
4
4
|
export { createLogger, serverLog, httpLog, wsLog, serviceLog, authLog, configLog, } from './logger.js';
|
|
5
|
-
export { serializeChangeSet, deserializeChangeSet, serializeSnapshotChunk, } from './serialization.js';
|
|
5
|
+
export { serializeChangeSet, deserializeChangeSet, serializeSnapshotChunk, deserializeSnapshotChunk, } from './serialization.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
|
package/dist/src/common/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Common utilities for sync-coordinator.
|
|
3
3
|
*/
|
|
4
4
|
export { createLogger, serverLog, httpLog, wsLog, serviceLog, authLog, configLog, } from './logger.js';
|
|
5
|
-
export { serializeChangeSet, deserializeChangeSet, serializeSnapshotChunk, } from './serialization.js';
|
|
5
|
+
export { serializeChangeSet, deserializeChangeSet, serializeSnapshotChunk, deserializeSnapshotChunk, } from './serialization.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -15,6 +15,11 @@ export declare function serializeChangeSet(cs: ChangeSet): object;
|
|
|
15
15
|
* Converts binary fields (siteId, HLCs) to base64 strings.
|
|
16
16
|
*/
|
|
17
17
|
export declare function serializeSnapshotChunk(chunk: SnapshotChunk): object;
|
|
18
|
+
/**
|
|
19
|
+
* Deserialize a SnapshotChunk from JSON transport format.
|
|
20
|
+
* Converts base64 strings back to binary fields (SiteId, HLC).
|
|
21
|
+
*/
|
|
22
|
+
export declare function deserializeSnapshotChunk(obj: unknown): SnapshotChunk;
|
|
18
23
|
/**
|
|
19
24
|
* Deserialize a ChangeSet from JSON transport format.
|
|
20
25
|
* Converts base64 strings back to binary fields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../src/common/serialization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAKN,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAcxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkCnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAe3D"}
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../src/common/serialization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAKN,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAcxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkCnE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAqCpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAe3D"}
|
|
@@ -63,6 +63,48 @@ export function serializeSnapshotChunk(chunk) {
|
|
|
63
63
|
return chunk;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Deserialize a SnapshotChunk from JSON transport format.
|
|
68
|
+
* Converts base64 strings back to binary fields (SiteId, HLC).
|
|
69
|
+
*/
|
|
70
|
+
export function deserializeSnapshotChunk(obj) {
|
|
71
|
+
const chunk = obj;
|
|
72
|
+
switch (chunk.type) {
|
|
73
|
+
case 'header':
|
|
74
|
+
return {
|
|
75
|
+
type: 'header',
|
|
76
|
+
siteId: siteIdFromBase64(chunk.siteId),
|
|
77
|
+
hlc: deserializeHLC(Buffer.from(chunk.hlc, 'base64')),
|
|
78
|
+
tableCount: chunk.tableCount,
|
|
79
|
+
migrationCount: chunk.migrationCount,
|
|
80
|
+
snapshotId: chunk.snapshotId,
|
|
81
|
+
};
|
|
82
|
+
case 'column-versions':
|
|
83
|
+
return {
|
|
84
|
+
type: 'column-versions',
|
|
85
|
+
schema: chunk.schema,
|
|
86
|
+
table: chunk.table,
|
|
87
|
+
entries: chunk.entries.map(([key, hlc, value]) => [
|
|
88
|
+
key,
|
|
89
|
+
deserializeHLC(Buffer.from(hlc, 'base64')),
|
|
90
|
+
value,
|
|
91
|
+
]),
|
|
92
|
+
};
|
|
93
|
+
case 'schema-migration': {
|
|
94
|
+
const migration = chunk.migration;
|
|
95
|
+
return {
|
|
96
|
+
type: 'schema-migration',
|
|
97
|
+
migration: {
|
|
98
|
+
...migration,
|
|
99
|
+
hlc: deserializeHLC(Buffer.from(migration.hlc, 'base64')),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// table-start, table-end, footer have no binary fields
|
|
104
|
+
default:
|
|
105
|
+
return chunk;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
66
108
|
/**
|
|
67
109
|
* Deserialize a ChangeSet from JSON transport format.
|
|
68
110
|
* Converts base64 strings back to binary fields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../../src/common/serialization.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../../src/common/serialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,6 +149,11 @@ export declare class CoordinatorService {
|
|
|
149
149
|
* Get the metrics registry for this service.
|
|
150
150
|
*/
|
|
151
151
|
getMetrics(): CoordinatorMetrics;
|
|
152
|
+
/**
|
|
153
|
+
* Restore a database from S3 snapshot + batches.
|
|
154
|
+
* Called by StoreManager's onStoreCreated when a new store is opened with no local data.
|
|
155
|
+
*/
|
|
156
|
+
private restoreFromS3;
|
|
152
157
|
/**
|
|
153
158
|
* Manually trigger a snapshot for a database.
|
|
154
159
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator-service.d.ts","sourceRoot":"","sources":["../../../src/service/coordinator-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EACL,KAAK,GAAG,EACR,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAIxB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAmB,KAAK,iBAAiB,EAAqB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,yBAAyB;IACzB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,uCAAuC;IACvC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,mFAAmF;IACnF,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAkB;IAEnD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IAExE,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"coordinator-service.d.ts","sourceRoot":"","sources":["../../../src/service/coordinator-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { randomUUID } from 'node:crypto';
|
|
11
11
|
import { siteIdFromBase64, siteIdEquals, siteIdToBase64, } from '@quereus/sync';
|
|
12
|
-
import { serviceLog, authLog, serializeChangeSet } from '../common/index.js';
|
|
12
|
+
import { serviceLog, authLog, serializeChangeSet, deserializeChangeSet } from '../common/index.js';
|
|
13
13
|
import { createCoordinatorMetrics, } from '../metrics/index.js';
|
|
14
14
|
import { StoreManager } from './store-manager.js';
|
|
15
15
|
import { createS3Client } from './s3-config.js';
|
|
@@ -34,6 +34,22 @@ export class CoordinatorService {
|
|
|
34
34
|
this.config = options.config;
|
|
35
35
|
this.hooks = options.hooks || {};
|
|
36
36
|
this.metrics = options.metrics || createCoordinatorMetrics();
|
|
37
|
+
// Initialize S3 stores if configured (before StoreManager, since onStoreCreated references them)
|
|
38
|
+
if (options.s3Config) {
|
|
39
|
+
const s3Client = createS3Client(options.s3Config);
|
|
40
|
+
// Pass storage path resolver from storeHooks to S3 stores
|
|
41
|
+
const resolveStoragePath = options.storeHooks?.resolveStoragePath;
|
|
42
|
+
this.s3BatchStore = new S3BatchStore(s3Client, options.s3Config, resolveStoragePath);
|
|
43
|
+
this.s3SnapshotStore = new S3SnapshotStore(s3Client, options.s3Config, options.snapshotConfig, resolveStoragePath);
|
|
44
|
+
serviceLog('S3 batch storage enabled: bucket=%s', options.s3Config.bucket);
|
|
45
|
+
}
|
|
46
|
+
// Disk eviction: auto-enabled when S3 is configured, can be forced on/off via env
|
|
47
|
+
const diskEvictionEnabled = options.s3Config
|
|
48
|
+
? process.env.DISK_EVICTION_ENABLED !== 'false'
|
|
49
|
+
: process.env.DISK_EVICTION_ENABLED === 'true';
|
|
50
|
+
const diskEvictionIdleMs = diskEvictionEnabled
|
|
51
|
+
? parseInt(process.env.DISK_EVICTION_IDLE_MS || '3600000', 10)
|
|
52
|
+
: 0;
|
|
37
53
|
this._storeManager = new StoreManager({
|
|
38
54
|
dataDir: this.config.dataDir,
|
|
39
55
|
maxOpenStores: 100,
|
|
@@ -44,15 +60,22 @@ export class CoordinatorService {
|
|
|
44
60
|
batchSize: this.config.sync.batchSize,
|
|
45
61
|
},
|
|
46
62
|
hooks: options.storeHooks,
|
|
63
|
+
onStoreCreated: this.s3SnapshotStore
|
|
64
|
+
? (entry) => this.restoreFromS3(entry)
|
|
65
|
+
: undefined,
|
|
66
|
+
diskEvictionIdleMs,
|
|
67
|
+
onEvictStore: this.s3SnapshotStore && diskEvictionIdleMs > 0
|
|
68
|
+
? async (databaseId) => {
|
|
69
|
+
const hasSnapshot = await this.s3SnapshotStore.hasSnapshot(databaseId);
|
|
70
|
+
if (!hasSnapshot) {
|
|
71
|
+
serviceLog('Disk eviction skipped (no S3 snapshot): %s', databaseId);
|
|
72
|
+
}
|
|
73
|
+
return hasSnapshot;
|
|
74
|
+
}
|
|
75
|
+
: undefined,
|
|
47
76
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const s3Client = createS3Client(options.s3Config);
|
|
51
|
-
// Pass storage path resolver from storeHooks to S3 stores
|
|
52
|
-
const resolveStoragePath = options.storeHooks?.resolveStoragePath;
|
|
53
|
-
this.s3BatchStore = new S3BatchStore(s3Client, options.s3Config, resolveStoragePath);
|
|
54
|
-
this.s3SnapshotStore = new S3SnapshotStore(s3Client, options.s3Config, options.snapshotConfig, resolveStoragePath);
|
|
55
|
-
serviceLog('S3 batch storage enabled: bucket=%s', options.s3Config.bucket);
|
|
77
|
+
if (diskEvictionIdleMs > 0) {
|
|
78
|
+
serviceLog('Disk eviction enabled: idle threshold %dms', diskEvictionIdleMs);
|
|
56
79
|
}
|
|
57
80
|
}
|
|
58
81
|
/**
|
|
@@ -272,9 +295,9 @@ export class CoordinatorService {
|
|
|
272
295
|
if (this.hooks.onAfterApplyChanges) {
|
|
273
296
|
this.hooks.onAfterApplyChanges(client, approvedChanges, result);
|
|
274
297
|
}
|
|
275
|
-
// Store batch to S3 for durability (non-blocking)
|
|
298
|
+
// Store batch to S3 for durability (non-blocking, serialized for JSON-safe storage)
|
|
276
299
|
if (this.s3BatchStore && result.applied > 0) {
|
|
277
|
-
this.s3BatchStore.storeBatch(databaseId, siteIdToBase64(client.siteId), approvedChanges, { applied: result.applied, skipped: result.skipped, conflicts: result.conflicts }).catch(err => {
|
|
300
|
+
this.s3BatchStore.storeBatch(databaseId, siteIdToBase64(client.siteId), approvedChanges.map(cs => serializeChangeSet(cs)), { applied: result.applied, skipped: result.skipped, conflicts: result.conflicts }).catch(err => {
|
|
278
301
|
serviceLog('S3 batch storage failed (non-fatal): %s', err.message);
|
|
279
302
|
});
|
|
280
303
|
}
|
|
@@ -379,7 +402,7 @@ export class CoordinatorService {
|
|
|
379
402
|
}
|
|
380
403
|
// Call connect hook
|
|
381
404
|
if (this.hooks.onClientConnect) {
|
|
382
|
-
const allowed = await this.hooks.onClientConnect(identity, socket);
|
|
405
|
+
const allowed = await this.hooks.onClientConnect(identity, socket, databaseId);
|
|
383
406
|
if (!allowed) {
|
|
384
407
|
throw new Error('Connection rejected');
|
|
385
408
|
}
|
|
@@ -513,6 +536,46 @@ export class CoordinatorService {
|
|
|
513
536
|
return this.metrics;
|
|
514
537
|
}
|
|
515
538
|
// ============================================================================
|
|
539
|
+
// S3 Restore
|
|
540
|
+
// ============================================================================
|
|
541
|
+
/**
|
|
542
|
+
* Restore a database from S3 snapshot + batches.
|
|
543
|
+
* Called by StoreManager's onStoreCreated when a new store is opened with no local data.
|
|
544
|
+
*/
|
|
545
|
+
async restoreFromS3(entry) {
|
|
546
|
+
const { databaseId, syncManager } = entry;
|
|
547
|
+
if (!this.s3SnapshotStore)
|
|
548
|
+
return;
|
|
549
|
+
serviceLog('Attempting S3 restore for %s', databaseId);
|
|
550
|
+
const snapshot = await this.s3SnapshotStore.downloadLatestSnapshot(databaseId);
|
|
551
|
+
if (!snapshot) {
|
|
552
|
+
serviceLog('No S3 snapshot found for %s, starting with empty store', databaseId);
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
// Apply snapshot chunks via async iterable
|
|
556
|
+
const { chunks } = snapshot;
|
|
557
|
+
async function* chunkIterable() {
|
|
558
|
+
for (const chunk of chunks) {
|
|
559
|
+
yield chunk;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
await syncManager.applySnapshotStream(chunkIterable());
|
|
563
|
+
serviceLog('Restored snapshot for %s: %s (%d chunks)', databaseId, snapshot.metadata.snapshotId, snapshot.chunks.length);
|
|
564
|
+
// Replay batches created after the snapshot
|
|
565
|
+
if (this.s3BatchStore) {
|
|
566
|
+
const batchKeys = await this.s3BatchStore.listBatchesSince(databaseId, snapshot.metadata.timestamp);
|
|
567
|
+
for (const key of batchKeys) {
|
|
568
|
+
const batch = await this.s3BatchStore.downloadBatch(key);
|
|
569
|
+
const changes = batch.changes.map(c => deserializeChangeSet(c));
|
|
570
|
+
await syncManager.applyChanges(changes);
|
|
571
|
+
}
|
|
572
|
+
if (batchKeys.length > 0) {
|
|
573
|
+
serviceLog('Replayed %d batches for %s', batchKeys.length, databaseId);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
serviceLog('S3 restore complete for %s', databaseId);
|
|
577
|
+
}
|
|
578
|
+
// ============================================================================
|
|
516
579
|
// Snapshot Operations
|
|
517
580
|
// ============================================================================
|
|
518
581
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator-service.js","sourceRoot":"","sources":["../../../src/service/coordinator-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coordinator-service.js","sourceRoot":"","sources":["../../../src/service/coordinator-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,15 @@ export declare class S3BatchStore {
|
|
|
50
50
|
changes: unknown[];
|
|
51
51
|
metadata?: Record<string, unknown>;
|
|
52
52
|
}>): Promise<SyncBatch[]>;
|
|
53
|
+
/**
|
|
54
|
+
* List batch keys stored after a given timestamp.
|
|
55
|
+
* Returns S3 keys in chronological order.
|
|
56
|
+
*/
|
|
57
|
+
listBatchesSince(databaseId: string, sinceTimestamp: string): Promise<string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Download and parse a batch by its S3 key.
|
|
60
|
+
*/
|
|
61
|
+
downloadBatch(key: string): Promise<SyncBatch>;
|
|
53
62
|
}
|
|
54
63
|
/**
|
|
55
64
|
* Create an S3 batch store from configuration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-batch-store.d.ts","sourceRoot":"","sources":["../../../src/service/s3-batch-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"s3-batch-store.d.ts","sourceRoot":"","sources":["../../../src/service/s3-batch-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG7G,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IAEjB,qCAAqC;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;gBAGvD,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,mBAAmB;IAO1C;;;;;;;;OAQG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAAE,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC;IAyCrB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC,GACD,OAAO,CAAC,SAAS,EAAE,CAAC;IAMvB;;;OAGG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA8BrF;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CASrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,mBAAmB,GACvC,YAAY,CAEd"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Uploads sync batches to S3 after each debounced sync operation,
|
|
5
5
|
* providing durability and enabling disaster recovery.
|
|
6
6
|
*/
|
|
7
|
-
import { PutObjectCommand } from '@aws-sdk/client-s3';
|
|
7
|
+
import { GetObjectCommand, ListObjectsV2Command, PutObjectCommand } from '@aws-sdk/client-s3';
|
|
8
8
|
import { randomUUID } from 'node:crypto';
|
|
9
9
|
import { serviceLog } from '../common/logger.js';
|
|
10
10
|
import { buildBatchKey, defaultStoragePathResolver, } from './s3-config.js';
|
|
@@ -71,6 +71,46 @@ export class S3BatchStore {
|
|
|
71
71
|
async storeBatches(batches) {
|
|
72
72
|
return Promise.all(batches.map(b => this.storeBatch(b.databaseId, b.clientId, b.changes, b.metadata)));
|
|
73
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* List batch keys stored after a given timestamp.
|
|
76
|
+
* Returns S3 keys in chronological order.
|
|
77
|
+
*/
|
|
78
|
+
async listBatchesSince(databaseId, sinceTimestamp) {
|
|
79
|
+
const storagePath = this.resolveStoragePath(databaseId);
|
|
80
|
+
const prefix = this.config.keyPrefix ?? '';
|
|
81
|
+
const listPrefix = `${prefix}${storagePath}/batches/`;
|
|
82
|
+
// Normalize timestamp to match key format (colons/dots → hyphens)
|
|
83
|
+
const normalizedTimestamp = sinceTimestamp.replace(/[:.]/g, '-');
|
|
84
|
+
const startAfter = `${listPrefix}${normalizedTimestamp}`;
|
|
85
|
+
const keys = [];
|
|
86
|
+
let continuationToken;
|
|
87
|
+
do {
|
|
88
|
+
const response = await this.client.send(new ListObjectsV2Command({
|
|
89
|
+
Bucket: this.config.bucket,
|
|
90
|
+
Prefix: listPrefix,
|
|
91
|
+
StartAfter: startAfter,
|
|
92
|
+
ContinuationToken: continuationToken,
|
|
93
|
+
}));
|
|
94
|
+
for (const obj of response.Contents ?? []) {
|
|
95
|
+
if (obj.Key)
|
|
96
|
+
keys.push(obj.Key);
|
|
97
|
+
}
|
|
98
|
+
continuationToken = response.NextContinuationToken;
|
|
99
|
+
} while (continuationToken);
|
|
100
|
+
serviceLog('Listed %d batches since %s for %s', keys.length, sinceTimestamp, databaseId);
|
|
101
|
+
return keys;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Download and parse a batch by its S3 key.
|
|
105
|
+
*/
|
|
106
|
+
async downloadBatch(key) {
|
|
107
|
+
const response = await this.client.send(new GetObjectCommand({
|
|
108
|
+
Bucket: this.config.bucket,
|
|
109
|
+
Key: key,
|
|
110
|
+
}));
|
|
111
|
+
const body = await response.Body.transformToString();
|
|
112
|
+
return JSON.parse(body);
|
|
113
|
+
}
|
|
74
114
|
}
|
|
75
115
|
/**
|
|
76
116
|
* Create an S3 batch store from configuration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-batch-store.js","sourceRoot":"","sources":["../../../src/service/s3-batch-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"s3-batch-store.js","sourceRoot":"","sources":["../../../src/service/s3-batch-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { type S3Client } from '@aws-sdk/client-s3';
|
|
12
12
|
import { type S3StorageConfig, type StoragePathResolver } from './s3-config.js';
|
|
13
|
-
import type { SyncManager } from '@quereus/sync';
|
|
13
|
+
import type { SyncManager, SnapshotChunk } from '@quereus/sync';
|
|
14
14
|
/**
|
|
15
15
|
* Snapshot metadata stored alongside the snapshot.
|
|
16
16
|
*/
|
|
@@ -92,10 +92,25 @@ export declare class S3SnapshotStore {
|
|
|
92
92
|
* Check if a snapshot exists for a database.
|
|
93
93
|
*/
|
|
94
94
|
hasSnapshot(databaseId: string): Promise<boolean>;
|
|
95
|
+
/**
|
|
96
|
+
* Download and deserialize the latest snapshot for a database.
|
|
97
|
+
* Returns null if no snapshots exist.
|
|
98
|
+
*/
|
|
99
|
+
downloadLatestSnapshot(databaseId: string): Promise<{
|
|
100
|
+
chunks: SnapshotChunk[];
|
|
101
|
+
metadata: {
|
|
102
|
+
snapshotId: string;
|
|
103
|
+
timestamp: string;
|
|
104
|
+
};
|
|
105
|
+
} | null>;
|
|
95
106
|
/**
|
|
96
107
|
* Compress data using gzip.
|
|
97
108
|
*/
|
|
98
109
|
private compressData;
|
|
110
|
+
/**
|
|
111
|
+
* Decompress gzipped data.
|
|
112
|
+
*/
|
|
113
|
+
private decompressData;
|
|
99
114
|
/**
|
|
100
115
|
* Get databases that need snapshots (for external scheduling).
|
|
101
116
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-snapshot-store.d.ts","sourceRoot":"","sources":["../../../src/service/s3-snapshot-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"s3-snapshot-store.d.ts","sourceRoot":"","sources":["../../../src/service/s3-snapshot-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
* - Time interval (e.g., every 5 minutes)
|
|
9
9
|
* - Change volume threshold (e.g., every 1000 changes)
|
|
10
10
|
*/
|
|
11
|
-
import { ListObjectsV2Command, PutObjectCommand } from '@aws-sdk/client-s3';
|
|
11
|
+
import { GetObjectCommand, ListObjectsV2Command, PutObjectCommand } from '@aws-sdk/client-s3';
|
|
12
12
|
import { randomUUID } from 'node:crypto';
|
|
13
|
-
import { createGzip } from 'node:zlib';
|
|
13
|
+
import { createGunzip, createGzip } from 'node:zlib';
|
|
14
14
|
import { serviceLog } from '../common/logger.js';
|
|
15
|
+
import { serializeSnapshotChunk, deserializeSnapshotChunk } from '../common/serialization.js';
|
|
15
16
|
import { buildSnapshotKey, defaultStoragePathResolver, } from './s3-config.js';
|
|
16
17
|
const DEFAULT_SCHEDULE_CONFIG = {
|
|
17
18
|
intervalMs: 5 * 60 * 1000, // 5 minutes
|
|
@@ -131,8 +132,11 @@ export class S3SnapshotStore {
|
|
|
131
132
|
totalTables++;
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
|
-
// Serialize
|
|
135
|
-
const jsonData = JSON.stringify({
|
|
135
|
+
// Serialize chunks for JSON-safe storage, then compress
|
|
136
|
+
const jsonData = JSON.stringify({
|
|
137
|
+
snapshotId, databaseId, timestamp,
|
|
138
|
+
chunks: chunks.map(c => serializeSnapshotChunk(c)),
|
|
139
|
+
});
|
|
136
140
|
const compressed = await this.compressData(jsonData);
|
|
137
141
|
// Upload to S3
|
|
138
142
|
await this.client.send(new PutObjectCommand({
|
|
@@ -187,6 +191,40 @@ export class S3SnapshotStore {
|
|
|
187
191
|
const response = await this.client.send(command);
|
|
188
192
|
return (response.KeyCount ?? 0) > 0;
|
|
189
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Download and deserialize the latest snapshot for a database.
|
|
196
|
+
* Returns null if no snapshots exist.
|
|
197
|
+
*/
|
|
198
|
+
async downloadLatestSnapshot(databaseId) {
|
|
199
|
+
const storagePath = this.resolveStoragePath(databaseId);
|
|
200
|
+
const prefix = this.config.keyPrefix ?? '';
|
|
201
|
+
const listPrefix = `${prefix}${storagePath}/snapshots/`;
|
|
202
|
+
const response = await this.client.send(new ListObjectsV2Command({
|
|
203
|
+
Bucket: this.config.bucket,
|
|
204
|
+
Prefix: listPrefix,
|
|
205
|
+
}));
|
|
206
|
+
if (!response.Contents?.length)
|
|
207
|
+
return null;
|
|
208
|
+
// Keys have timestamp prefix → alphabetical order is chronological
|
|
209
|
+
const sorted = response.Contents
|
|
210
|
+
.filter(obj => obj.Key)
|
|
211
|
+
.sort((a, b) => a.Key.localeCompare(b.Key));
|
|
212
|
+
const latestKey = sorted[sorted.length - 1].Key;
|
|
213
|
+
serviceLog('Downloading snapshot for %s: %s', databaseId, latestKey);
|
|
214
|
+
const getResponse = await this.client.send(new GetObjectCommand({
|
|
215
|
+
Bucket: this.config.bucket,
|
|
216
|
+
Key: latestKey,
|
|
217
|
+
}));
|
|
218
|
+
const compressed = await getResponse.Body.transformToByteArray();
|
|
219
|
+
const decompressed = await this.decompressData(Buffer.from(compressed));
|
|
220
|
+
const data = JSON.parse(decompressed);
|
|
221
|
+
const chunks = data.chunks.map(c => deserializeSnapshotChunk(c));
|
|
222
|
+
serviceLog('Downloaded snapshot for %s: %s (%d chunks)', databaseId, data.snapshotId, chunks.length);
|
|
223
|
+
return {
|
|
224
|
+
chunks,
|
|
225
|
+
metadata: { snapshotId: data.snapshotId, timestamp: data.timestamp },
|
|
226
|
+
};
|
|
227
|
+
}
|
|
190
228
|
/**
|
|
191
229
|
* Compress data using gzip.
|
|
192
230
|
*/
|
|
@@ -200,6 +238,19 @@ export class S3SnapshotStore {
|
|
|
200
238
|
gzip.end(Buffer.from(data, 'utf-8'));
|
|
201
239
|
});
|
|
202
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Decompress gzipped data.
|
|
243
|
+
*/
|
|
244
|
+
async decompressData(data) {
|
|
245
|
+
const gunzip = createGunzip();
|
|
246
|
+
const buffers = [];
|
|
247
|
+
gunzip.on('data', (chunk) => buffers.push(chunk));
|
|
248
|
+
return new Promise((resolve, reject) => {
|
|
249
|
+
gunzip.on('end', () => resolve(Buffer.concat(buffers).toString('utf-8')));
|
|
250
|
+
gunzip.on('error', reject);
|
|
251
|
+
gunzip.end(data);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
203
254
|
/**
|
|
204
255
|
* Get databases that need snapshots (for external scheduling).
|
|
205
256
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-snapshot-store.js","sourceRoot":"","sources":["../../../src/service/s3-snapshot-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"s3-snapshot-store.js","sourceRoot":"","sources":["../../../src/service/s3-snapshot-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export interface StoreEntry {
|
|
|
18
18
|
storeEvents: StoreEventEmitter;
|
|
19
19
|
refCount: number;
|
|
20
20
|
lastAccess: number;
|
|
21
|
+
/** True if no local data existed before this store was opened. */
|
|
22
|
+
isNew?: boolean;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Context passed to store hooks for auth-aware decisions.
|
|
@@ -68,6 +70,12 @@ export interface StoreManagerConfig {
|
|
|
68
70
|
};
|
|
69
71
|
/** Hooks for customizing behavior */
|
|
70
72
|
hooks?: StoreManagerHooks;
|
|
73
|
+
/** Called when a new store is created (no pre-existing local data). Used for S3 restore. */
|
|
74
|
+
onStoreCreated?: (entry: StoreEntry) => Promise<void>;
|
|
75
|
+
/** Idle time (ms) before a closed store's local directory is eligible for disk eviction. 0 = disabled. */
|
|
76
|
+
diskEvictionIdleMs?: number;
|
|
77
|
+
/** Called to confirm a closed store can be safely evicted from disk. Return true to proceed with deletion. */
|
|
78
|
+
onEvictStore?: (databaseId: string) => Promise<boolean>;
|
|
71
79
|
}
|
|
72
80
|
/**
|
|
73
81
|
* Manages multiple LevelDB stores for multi-tenant sync.
|
|
@@ -77,6 +85,12 @@ export declare class StoreManager {
|
|
|
77
85
|
private readonly resolveStoragePath;
|
|
78
86
|
private readonly isValidDatabaseId;
|
|
79
87
|
private readonly stores;
|
|
88
|
+
private readonly pendingOpens;
|
|
89
|
+
private readonly onStoreCreated?;
|
|
90
|
+
/** Tracks closed stores eligible for disk eviction: databaseId → { storagePath, closedAt } */
|
|
91
|
+
private readonly closedStores;
|
|
92
|
+
private readonly diskEvictionIdleMs;
|
|
93
|
+
private readonly onEvictStore?;
|
|
80
94
|
private cleanupTimer;
|
|
81
95
|
private shutdownPromise;
|
|
82
96
|
private _shuttingDown;
|
|
@@ -87,6 +101,7 @@ export declare class StoreManager {
|
|
|
87
101
|
start(): void;
|
|
88
102
|
/**
|
|
89
103
|
* Get or open a store for a database. Increments refCount.
|
|
104
|
+
* Uses pendingOpens to prevent concurrent open+restore for the same databaseId.
|
|
90
105
|
* @param databaseId The database identifier
|
|
91
106
|
* @param context Optional auth context for auth-aware path resolution
|
|
92
107
|
*/
|
|
@@ -107,6 +122,10 @@ export declare class StoreManager {
|
|
|
107
122
|
* Get count of open stores.
|
|
108
123
|
*/
|
|
109
124
|
get openCount(): number;
|
|
125
|
+
/**
|
|
126
|
+
* Get count of closed stores pending disk eviction.
|
|
127
|
+
*/
|
|
128
|
+
get evictionCandidateCount(): number;
|
|
110
129
|
/**
|
|
111
130
|
* Check if a database ID is valid.
|
|
112
131
|
* @param databaseId The database identifier
|
|
@@ -117,11 +136,21 @@ export declare class StoreManager {
|
|
|
117
136
|
* Shutdown all stores.
|
|
118
137
|
*/
|
|
119
138
|
shutdown(): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Open a store and run the onStoreCreated callback if the store is new.
|
|
141
|
+
* On callback failure, closes the store and rethrows.
|
|
142
|
+
*/
|
|
143
|
+
private openAndRestore;
|
|
120
144
|
private openStore;
|
|
121
145
|
/**
|
|
122
146
|
* Cleanup idle stores with refCount=0 past timeout.
|
|
123
147
|
*/
|
|
124
148
|
private cleanup;
|
|
149
|
+
/**
|
|
150
|
+
* Evict closed stores from local disk if they've been idle long enough
|
|
151
|
+
* and the eviction callback confirms safety (e.g. data is durable in S3).
|
|
152
|
+
*/
|
|
153
|
+
private evictFromDisk;
|
|
125
154
|
/**
|
|
126
155
|
* Evict least recently used store (with refCount=0).
|
|
127
156
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../../../src/service/store-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../../../src/service/store-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* parsing and path resolution via hooks in StoreManagerConfig.
|
|
10
10
|
*/
|
|
11
11
|
import { join } from 'node:path';
|
|
12
|
-
import {
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { mkdir, rm } from 'node:fs/promises';
|
|
13
14
|
import { StoreEventEmitter } from '@quereus/store';
|
|
14
15
|
import { LevelDBStore } from '@quereus/plugin-leveldb';
|
|
15
16
|
import { createSyncModule, } from '@quereus/sync';
|
|
@@ -58,6 +59,12 @@ export class StoreManager {
|
|
|
58
59
|
resolveStoragePath;
|
|
59
60
|
isValidDatabaseId;
|
|
60
61
|
stores = new Map();
|
|
62
|
+
pendingOpens = new Map();
|
|
63
|
+
onStoreCreated;
|
|
64
|
+
/** Tracks closed stores eligible for disk eviction: databaseId → { storagePath, closedAt } */
|
|
65
|
+
closedStores = new Map();
|
|
66
|
+
diskEvictionIdleMs;
|
|
67
|
+
onEvictStore;
|
|
61
68
|
cleanupTimer = null;
|
|
62
69
|
shutdownPromise = null;
|
|
63
70
|
_shuttingDown = false;
|
|
@@ -65,6 +72,9 @@ export class StoreManager {
|
|
|
65
72
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
66
73
|
this.resolveStoragePath = config.hooks?.resolveStoragePath ?? defaultResolveStoragePath;
|
|
67
74
|
this.isValidDatabaseId = config.hooks?.isValidDatabaseId ?? defaultIsValidDatabaseId;
|
|
75
|
+
this.onStoreCreated = config.onStoreCreated;
|
|
76
|
+
this.diskEvictionIdleMs = config.diskEvictionIdleMs ?? 0;
|
|
77
|
+
this.onEvictStore = config.onEvictStore;
|
|
68
78
|
}
|
|
69
79
|
/**
|
|
70
80
|
* Start the store manager (begins cleanup interval).
|
|
@@ -77,10 +87,13 @@ export class StoreManager {
|
|
|
77
87
|
}
|
|
78
88
|
/**
|
|
79
89
|
* Get or open a store for a database. Increments refCount.
|
|
90
|
+
* Uses pendingOpens to prevent concurrent open+restore for the same databaseId.
|
|
80
91
|
* @param databaseId The database identifier
|
|
81
92
|
* @param context Optional auth context for auth-aware path resolution
|
|
82
93
|
*/
|
|
83
94
|
async acquire(databaseId, context) {
|
|
95
|
+
// Remove from eviction candidates — store is being (re-)opened
|
|
96
|
+
this.closedStores.delete(databaseId);
|
|
84
97
|
// Check if already open
|
|
85
98
|
let entry = this.stores.get(databaseId);
|
|
86
99
|
if (entry) {
|
|
@@ -89,15 +102,31 @@ export class StoreManager {
|
|
|
89
102
|
serviceLog('Store acquired (cached): %s, refCount=%d', databaseId, entry.refCount);
|
|
90
103
|
return entry;
|
|
91
104
|
}
|
|
105
|
+
// Check if open+restore is already in progress for this databaseId
|
|
106
|
+
const pending = this.pendingOpens.get(databaseId);
|
|
107
|
+
if (pending) {
|
|
108
|
+
entry = await pending;
|
|
109
|
+
entry.refCount++;
|
|
110
|
+
entry.lastAccess = Date.now();
|
|
111
|
+
serviceLog('Store acquired (waited for pending open): %s, refCount=%d', databaseId, entry.refCount);
|
|
112
|
+
return entry;
|
|
113
|
+
}
|
|
92
114
|
// Check if we need to evict before opening new
|
|
93
115
|
if (this.stores.size >= this.config.maxOpenStores) {
|
|
94
116
|
await this.evictLRU();
|
|
95
117
|
}
|
|
96
|
-
// Open new store
|
|
97
|
-
|
|
98
|
-
this.
|
|
99
|
-
|
|
100
|
-
|
|
118
|
+
// Open new store with dedup via pendingOpens
|
|
119
|
+
const openPromise = this.openAndRestore(databaseId, context);
|
|
120
|
+
this.pendingOpens.set(databaseId, openPromise);
|
|
121
|
+
try {
|
|
122
|
+
entry = await openPromise;
|
|
123
|
+
this.stores.set(databaseId, entry);
|
|
124
|
+
serviceLog('Store acquired (opened): %s', databaseId);
|
|
125
|
+
return entry;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
this.pendingOpens.delete(databaseId);
|
|
129
|
+
}
|
|
101
130
|
}
|
|
102
131
|
/**
|
|
103
132
|
* Release a store reference. Decrements refCount.
|
|
@@ -128,6 +157,12 @@ export class StoreManager {
|
|
|
128
157
|
get openCount() {
|
|
129
158
|
return this.stores.size;
|
|
130
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Get count of closed stores pending disk eviction.
|
|
162
|
+
*/
|
|
163
|
+
get evictionCandidateCount() {
|
|
164
|
+
return this.closedStores.size;
|
|
165
|
+
}
|
|
131
166
|
/**
|
|
132
167
|
* Check if a database ID is valid.
|
|
133
168
|
* @param databaseId The database identifier
|
|
@@ -159,10 +194,28 @@ export class StoreManager {
|
|
|
159
194
|
});
|
|
160
195
|
await Promise.all(closePromises);
|
|
161
196
|
this.stores.clear();
|
|
197
|
+
this.closedStores.clear();
|
|
162
198
|
serviceLog('StoreManager shutdown complete');
|
|
163
199
|
})();
|
|
164
200
|
return this.shutdownPromise;
|
|
165
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Open a store and run the onStoreCreated callback if the store is new.
|
|
204
|
+
* On callback failure, closes the store and rethrows.
|
|
205
|
+
*/
|
|
206
|
+
async openAndRestore(databaseId, context) {
|
|
207
|
+
const entry = await this.openStore(databaseId, context);
|
|
208
|
+
if (entry.isNew && this.onStoreCreated) {
|
|
209
|
+
try {
|
|
210
|
+
await this.onStoreCreated(entry);
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
await entry.store.close();
|
|
214
|
+
throw err;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return entry;
|
|
218
|
+
}
|
|
166
219
|
async openStore(databaseId, context) {
|
|
167
220
|
// Validate database ID
|
|
168
221
|
if (!this.isValidDatabaseId(databaseId, context)) {
|
|
@@ -170,10 +223,12 @@ export class StoreManager {
|
|
|
170
223
|
}
|
|
171
224
|
const storagePath = this.resolveStoragePath(databaseId, context);
|
|
172
225
|
const fullPath = join(this.config.dataDir, storagePath);
|
|
226
|
+
// Detect whether local data already exists before creating directories
|
|
227
|
+
const isNew = !existsSync(fullPath);
|
|
173
228
|
// Ensure parent directories exist (org folder for new org-based format)
|
|
174
229
|
const parentPath = join(this.config.dataDir, storagePath.split('/')[0]);
|
|
175
230
|
await mkdir(parentPath, { recursive: true });
|
|
176
|
-
serviceLog('Opening store at: %s', fullPath);
|
|
231
|
+
serviceLog('Opening store at: %s (isNew=%s)', fullPath, isNew);
|
|
177
232
|
const store = await LevelDBStore.open({
|
|
178
233
|
path: fullPath,
|
|
179
234
|
createIfMissing: true,
|
|
@@ -187,6 +242,7 @@ export class StoreManager {
|
|
|
187
242
|
storeEvents,
|
|
188
243
|
refCount: 1,
|
|
189
244
|
lastAccess: Date.now(),
|
|
245
|
+
isNew,
|
|
190
246
|
};
|
|
191
247
|
}
|
|
192
248
|
/**
|
|
@@ -208,6 +264,45 @@ export class StoreManager {
|
|
|
208
264
|
if (toClose.length > 0) {
|
|
209
265
|
serviceLog('Cleanup: closed %d idle stores', toClose.length);
|
|
210
266
|
}
|
|
267
|
+
// Disk eviction: delete local directories for closed stores past the eviction threshold
|
|
268
|
+
if (this.diskEvictionIdleMs > 0 && this.onEvictStore) {
|
|
269
|
+
await this.evictFromDisk(now);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Evict closed stores from local disk if they've been idle long enough
|
|
274
|
+
* and the eviction callback confirms safety (e.g. data is durable in S3).
|
|
275
|
+
*/
|
|
276
|
+
async evictFromDisk(now) {
|
|
277
|
+
const toEvict = [];
|
|
278
|
+
for (const [databaseId, info] of this.closedStores) {
|
|
279
|
+
// Skip if store was re-opened since being closed
|
|
280
|
+
if (this.stores.has(databaseId) || this.pendingOpens.has(databaseId)) {
|
|
281
|
+
this.closedStores.delete(databaseId);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (now - info.closedAt >= this.diskEvictionIdleMs) {
|
|
285
|
+
toEvict.push(databaseId);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (const databaseId of toEvict) {
|
|
289
|
+
const info = this.closedStores.get(databaseId);
|
|
290
|
+
try {
|
|
291
|
+
const canEvict = await this.onEvictStore(databaseId);
|
|
292
|
+
if (!canEvict)
|
|
293
|
+
continue;
|
|
294
|
+
const fullPath = join(this.config.dataDir, info.storagePath);
|
|
295
|
+
await rm(fullPath, { recursive: true, force: true });
|
|
296
|
+
this.closedStores.delete(databaseId);
|
|
297
|
+
serviceLog('Disk eviction: deleted local directory for %s', databaseId);
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
serviceLog('Disk eviction failed for %s (non-fatal): %O', databaseId, err);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (toEvict.length > 0) {
|
|
304
|
+
serviceLog('Disk eviction: processed %d candidates', toEvict.length);
|
|
305
|
+
}
|
|
211
306
|
}
|
|
212
307
|
/**
|
|
213
308
|
* Evict least recently used store (with refCount=0).
|
|
@@ -235,7 +330,7 @@ export class StoreManager {
|
|
|
235
330
|
* Re-checks refCount to avoid closing a store acquired between the eviction
|
|
236
331
|
* decision and this call (race window across await boundaries).
|
|
237
332
|
*/
|
|
238
|
-
async closeStore(databaseId) {
|
|
333
|
+
async closeStore(databaseId, context) {
|
|
239
334
|
const entry = this.stores.get(databaseId);
|
|
240
335
|
if (!entry)
|
|
241
336
|
return;
|
|
@@ -243,10 +338,16 @@ export class StoreManager {
|
|
|
243
338
|
// between the caller's refCount check and now.
|
|
244
339
|
if (entry.refCount > 0)
|
|
245
340
|
return;
|
|
341
|
+
// Resolve storage path before closing (needed for eviction tracking)
|
|
342
|
+
const storagePath = this.resolveStoragePath(databaseId, context);
|
|
246
343
|
try {
|
|
247
344
|
await entry.store.close();
|
|
248
345
|
this.stores.delete(databaseId);
|
|
249
346
|
serviceLog('Store closed: %s', databaseId);
|
|
347
|
+
// Track for disk eviction if configured
|
|
348
|
+
if (this.diskEvictionIdleMs > 0 && this.onEvictStore) {
|
|
349
|
+
this.closedStores.set(databaseId, { storagePath, closedAt: Date.now() });
|
|
350
|
+
}
|
|
250
351
|
}
|
|
251
352
|
catch (err) {
|
|
252
353
|
serviceLog('Error closing store %s: %O', databaseId, err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../../../src/service/store-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../../../src/service/store-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -133,9 +133,10 @@ export interface CoordinatorHooks {
|
|
|
133
133
|
*
|
|
134
134
|
* @param client - Authenticated client identity
|
|
135
135
|
* @param socket - The WebSocket connection
|
|
136
|
+
* @param databaseId - The database the client is connecting to
|
|
136
137
|
* @returns true to accept, false to reject
|
|
137
138
|
*/
|
|
138
|
-
onClientConnect?(client: ClientIdentity, socket: WebSocket): Promise<boolean>;
|
|
139
|
+
onClientConnect?(client: ClientIdentity, socket: WebSocket, databaseId: string): Promise<boolean>;
|
|
139
140
|
/**
|
|
140
141
|
* Called when a WebSocket client disconnects.
|
|
141
142
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/service/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EACV,MAAM,EACN,GAAG,EACH,SAAS,EACT,WAAW,EACZ,MAAM,eAAe,CAAC;AAMvB;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,gCAAgC;IAChC,WAAW,EAAE,GAAG,GAAG,SAAS,CAAC;IAC7B,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,SAAS,CAAC;CACnB;AAMD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAMhC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,iCAAiC;IACjC,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAMD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,cAAc,CAAC,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/D;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjF;;;;;;;OAOG;IACH,oBAAoB,CAAC,CACnB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,EAAE,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7B;;;;;;;OAOG;IACH,mBAAmB,CAAC,CAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,EAAE,EACpB,MAAM,EAAE,WAAW,GAClB,IAAI,CAAC;IAER
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/service/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/sync-coordinator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Standalone coordinator backend for Quereus Sync - production-ready sync server",
|
|
6
6
|
"keywords": [
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"@quereus/plugin-leveldb": "^0.6.0",
|
|
51
51
|
"@quereus/quereus": "^0.18.0",
|
|
52
52
|
"@quereus/store": "^0.7.0",
|
|
53
|
-
"@quereus/sync": "^0.
|
|
53
|
+
"@quereus/sync": "^0.8.0",
|
|
54
54
|
"commander": "^14.0.2",
|
|
55
55
|
"debug": "^4.4.3",
|
|
56
56
|
"fastify": "^5.7.0"
|