@powersync/service-module-mongodb 0.0.0-dev-20241111122558 → 0.0.0-dev-20241128134723
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/CHANGELOG.md +26 -17
- package/dist/api/MongoRouteAPIAdapter.d.ts +1 -0
- package/dist/api/MongoRouteAPIAdapter.js +54 -21
- package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
- package/dist/replication/ChangeStream.d.ts +23 -2
- package/dist/replication/ChangeStream.js +178 -42
- package/dist/replication/ChangeStream.js.map +1 -1
- package/dist/replication/ChangeStreamReplicationJob.js +7 -4
- package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
- package/dist/replication/MongoErrorRateLimiter.js +0 -6
- package/dist/replication/MongoErrorRateLimiter.js.map +1 -1
- package/dist/replication/MongoRelation.js +5 -2
- package/dist/replication/MongoRelation.js.map +1 -1
- package/dist/replication/replication-utils.d.ts +1 -0
- package/dist/replication/replication-utils.js +1 -0
- package/dist/replication/replication-utils.js.map +1 -1
- package/dist/types/types.d.ts +35 -0
- package/dist/types/types.js +38 -2
- package/dist/types/types.js.map +1 -1
- package/package.json +6 -9
- package/src/api/MongoRouteAPIAdapter.ts +53 -21
- package/src/replication/ChangeStream.ts +277 -121
- package/src/replication/ChangeStreamReplicationJob.ts +6 -4
- package/src/replication/MongoErrorRateLimiter.ts +1 -8
- package/src/replication/MongoRelation.ts +5 -2
- package/src/replication/replication-utils.ts +2 -1
- package/src/types/types.ts +43 -3
- package/test/src/change_stream.test.ts +442 -231
- package/test/src/change_stream_utils.ts +54 -27
- package/test/src/mongo_test.test.ts +180 -46
- package/test/src/slow_tests.test.ts +109 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,25 +1,34 @@
|
|
|
1
1
|
# @powersync/service-module-mongodb
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20241128134723
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [74548e4]
|
|
8
|
+
- @powersync/service-core@0.0.0-dev-20241128134723
|
|
9
|
+
- @powersync/service-types@0.0.0-dev-20241128134723
|
|
10
|
+
|
|
11
|
+
## 0.1.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
|
6
14
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
15
|
+
- 57bd18b: Reduce permissions required for replicating a single mongodb database
|
|
16
|
+
- 57bd18b: Add MongoDB support (Alpha)
|
|
9
17
|
|
|
10
18
|
### Patch Changes
|
|
11
19
|
|
|
12
|
-
-
|
|
13
|
-
- Updated dependencies [
|
|
14
|
-
- Updated dependencies [
|
|
15
|
-
- Updated dependencies [
|
|
16
|
-
- Updated dependencies [
|
|
17
|
-
- Updated dependencies [
|
|
18
|
-
- Updated dependencies [
|
|
19
|
-
- Updated dependencies [
|
|
20
|
-
- Updated dependencies [
|
|
21
|
-
- Updated dependencies [
|
|
22
|
-
|
|
23
|
-
- @powersync/
|
|
24
|
-
- @powersync/
|
|
25
|
-
- @powersync/service-
|
|
20
|
+
- 57bd18b: Fix diagnostics schema authorization issues for MongoDB
|
|
21
|
+
- Updated dependencies [57bd18b]
|
|
22
|
+
- Updated dependencies [57bd18b]
|
|
23
|
+
- Updated dependencies [57bd18b]
|
|
24
|
+
- Updated dependencies [57bd18b]
|
|
25
|
+
- Updated dependencies [57bd18b]
|
|
26
|
+
- Updated dependencies [57bd18b]
|
|
27
|
+
- Updated dependencies [57bd18b]
|
|
28
|
+
- Updated dependencies [57bd18b]
|
|
29
|
+
- Updated dependencies [57bd18b]
|
|
30
|
+
- Updated dependencies [57bd18b]
|
|
31
|
+
- @powersync/service-core@0.9.0
|
|
32
|
+
- @powersync/lib-services-framework@0.2.0
|
|
33
|
+
- @powersync/service-sync-rules@0.21.0
|
|
34
|
+
- @powersync/service-types@0.3.0
|
|
@@ -12,6 +12,7 @@ export declare class MongoRouteAPIAdapter implements api.RouteAPI {
|
|
|
12
12
|
constructor(config: types.ResolvedConnectionConfig);
|
|
13
13
|
getParseSyncRulesOptions(): ParseSyncRulesOptions;
|
|
14
14
|
shutdown(): Promise<void>;
|
|
15
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
15
16
|
getSourceConfig(): Promise<service_types.configFile.ResolvedDataSourceConfig>;
|
|
16
17
|
getConnectionStatus(): Promise<service_types.ConnectionStatusV2>;
|
|
17
18
|
executeQuery(query: string, params: any[]): Promise<service_types.internal_routes.ExecuteSqlResponse>;
|
|
@@ -6,6 +6,7 @@ import { MongoManager } from '../replication/MongoManager.js';
|
|
|
6
6
|
import { constructAfterRecord, createCheckpoint } from '../replication/MongoRelation.js';
|
|
7
7
|
import * as types from '../types/types.js';
|
|
8
8
|
import { escapeRegExp } from '../utils.js';
|
|
9
|
+
import { CHECKPOINTS_COLLECTION } from '../replication/replication-utils.js';
|
|
9
10
|
export class MongoRouteAPIAdapter {
|
|
10
11
|
constructor(config) {
|
|
11
12
|
this.config = config;
|
|
@@ -23,6 +24,9 @@ export class MongoRouteAPIAdapter {
|
|
|
23
24
|
async shutdown() {
|
|
24
25
|
await this.client.close();
|
|
25
26
|
}
|
|
27
|
+
async [Symbol.asyncDispose]() {
|
|
28
|
+
await this.shutdown();
|
|
29
|
+
}
|
|
26
30
|
async getSourceConfig() {
|
|
27
31
|
return this.config;
|
|
28
32
|
}
|
|
@@ -60,6 +64,29 @@ export class MongoRouteAPIAdapter {
|
|
|
60
64
|
}
|
|
61
65
|
async getDebugTablesInfo(tablePatterns, sqlSyncRules) {
|
|
62
66
|
let result = [];
|
|
67
|
+
const validatePostImages = (schema, collection) => {
|
|
68
|
+
if (this.config.postImages == types.PostImagesOption.OFF) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
else if (!collection.options?.changeStreamPreAndPostImages?.enabled) {
|
|
72
|
+
if (this.config.postImages == types.PostImagesOption.READ_ONLY) {
|
|
73
|
+
return [
|
|
74
|
+
{ level: 'fatal', message: `changeStreamPreAndPostImages not enabled on ${schema}.${collection.name}` }
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return [
|
|
79
|
+
{
|
|
80
|
+
level: 'warning',
|
|
81
|
+
message: `changeStreamPreAndPostImages not enabled on ${schema}.${collection.name}, will be enabled automatically`
|
|
82
|
+
}
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
};
|
|
63
90
|
for (let tablePattern of tablePatterns) {
|
|
64
91
|
const schema = tablePattern.schema;
|
|
65
92
|
let patternResult = {
|
|
@@ -80,12 +107,19 @@ export class MongoRouteAPIAdapter {
|
|
|
80
107
|
.db(schema)
|
|
81
108
|
.listCollections({
|
|
82
109
|
name: nameFilter
|
|
83
|
-
}, { nameOnly:
|
|
110
|
+
}, { nameOnly: false })
|
|
84
111
|
.toArray();
|
|
85
112
|
if (tablePattern.isWildcard) {
|
|
86
113
|
patternResult.tables = [];
|
|
87
114
|
for (let collection of collections) {
|
|
88
115
|
const sourceTable = new SourceTable(0, this.connectionTag, collection.name, schema, collection.name, [], true);
|
|
116
|
+
let errors = [];
|
|
117
|
+
if (collection.type == 'view') {
|
|
118
|
+
errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} is a view` });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
errors.push(...validatePostImages(schema, collection));
|
|
122
|
+
}
|
|
89
123
|
const syncData = sqlSyncRules.tableSyncsData(sourceTable);
|
|
90
124
|
const syncParameters = sqlSyncRules.tableSyncsParameters(sourceTable);
|
|
91
125
|
patternResult.tables.push({
|
|
@@ -94,7 +128,7 @@ export class MongoRouteAPIAdapter {
|
|
|
94
128
|
replication_id: ['_id'],
|
|
95
129
|
data_queries: syncData,
|
|
96
130
|
parameter_queries: syncParameters,
|
|
97
|
-
errors:
|
|
131
|
+
errors: errors
|
|
98
132
|
});
|
|
99
133
|
}
|
|
100
134
|
}
|
|
@@ -102,26 +136,25 @@ export class MongoRouteAPIAdapter {
|
|
|
102
136
|
const sourceTable = new SourceTable(0, this.connectionTag, tablePattern.name, schema, tablePattern.name, [], true);
|
|
103
137
|
const syncData = sqlSyncRules.tableSyncsData(sourceTable);
|
|
104
138
|
const syncParameters = sqlSyncRules.tableSyncsParameters(sourceTable);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
replication_id: ['_id'],
|
|
110
|
-
data_queries: syncData,
|
|
111
|
-
parameter_queries: syncParameters,
|
|
112
|
-
errors: []
|
|
113
|
-
};
|
|
139
|
+
const collection = collections[0];
|
|
140
|
+
let errors = [];
|
|
141
|
+
if (collections.length != 1) {
|
|
142
|
+
errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} not found` });
|
|
114
143
|
}
|
|
115
|
-
else {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
data_queries: syncData,
|
|
121
|
-
parameter_queries: syncParameters,
|
|
122
|
-
errors: [{ level: 'warning', message: `Collection ${schema}.${tablePattern.name} not found` }]
|
|
123
|
-
};
|
|
144
|
+
else if (collection.type == 'view') {
|
|
145
|
+
errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} is a view` });
|
|
146
|
+
}
|
|
147
|
+
else if (!collection.options?.changeStreamPreAndPostImages?.enabled) {
|
|
148
|
+
errors.push(...validatePostImages(schema, collection));
|
|
124
149
|
}
|
|
150
|
+
patternResult.table = {
|
|
151
|
+
schema,
|
|
152
|
+
name: tablePattern.name,
|
|
153
|
+
replication_id: ['_id'],
|
|
154
|
+
data_queries: syncData,
|
|
155
|
+
parameter_queries: syncParameters,
|
|
156
|
+
errors
|
|
157
|
+
};
|
|
125
158
|
}
|
|
126
159
|
}
|
|
127
160
|
return result;
|
|
@@ -159,7 +192,7 @@ export class MongoRouteAPIAdapter {
|
|
|
159
192
|
}
|
|
160
193
|
let tables = [];
|
|
161
194
|
for (let collection of collections) {
|
|
162
|
-
if ([
|
|
195
|
+
if ([CHECKPOINTS_COLLECTION].includes(collection.name)) {
|
|
163
196
|
continue;
|
|
164
197
|
}
|
|
165
198
|
if (collection.name.startsWith('system.')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/MongoRouteAPIAdapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MongoRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/MongoRouteAPIAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,15 @@ export interface ChangeStreamOptions {
|
|
|
11
11
|
interface InitResult {
|
|
12
12
|
needsInitialSync: boolean;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when the change stream is not valid anymore, and replication
|
|
16
|
+
* must be restarted.
|
|
17
|
+
*
|
|
18
|
+
* Possible reasons:
|
|
19
|
+
* * Some change stream documents do not have postImages.
|
|
20
|
+
* * startAfter/resumeToken is not valid anymore.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ChangeStreamInvalidatedError extends Error {
|
|
15
23
|
constructor(message: string);
|
|
16
24
|
}
|
|
17
25
|
export declare class ChangeStream {
|
|
@@ -26,7 +34,15 @@ export declare class ChangeStream {
|
|
|
26
34
|
private relation_cache;
|
|
27
35
|
constructor(options: ChangeStreamOptions);
|
|
28
36
|
get stopped(): boolean;
|
|
29
|
-
|
|
37
|
+
private get usePostImages();
|
|
38
|
+
private get configurePostImages();
|
|
39
|
+
/**
|
|
40
|
+
* This resolves a pattern, persists the related metadata, and returns
|
|
41
|
+
* the resulting SourceTables.
|
|
42
|
+
*
|
|
43
|
+
* This implicitly checks the collection postImage configuration.
|
|
44
|
+
*/
|
|
45
|
+
resolveQualifiedTableNames(batch: storage.BucketStorageBatch, tablePattern: TablePattern): Promise<storage.SourceTable[]>;
|
|
30
46
|
initSlot(): Promise<InitResult>;
|
|
31
47
|
estimatedCount(table: storage.SourceTable): Promise<string>;
|
|
32
48
|
/**
|
|
@@ -37,16 +53,21 @@ export declare class ChangeStream {
|
|
|
37
53
|
*/
|
|
38
54
|
startInitialReplication(): Promise<void>;
|
|
39
55
|
initialReplication(): Promise<void>;
|
|
56
|
+
private setupCheckpointsCollection;
|
|
40
57
|
private getSourceNamespaceFilters;
|
|
41
58
|
static getQueryData(results: Iterable<DatabaseInputRow>): Generator<SqliteRow>;
|
|
42
59
|
private snapshotTable;
|
|
43
60
|
private getRelation;
|
|
61
|
+
private getCollectionInfo;
|
|
62
|
+
private checkPostImages;
|
|
44
63
|
handleRelation(batch: storage.BucketStorageBatch, descriptor: SourceEntityDescriptor, options: {
|
|
45
64
|
snapshot: boolean;
|
|
65
|
+
collectionInfo: mongo.CollectionInfo | undefined;
|
|
46
66
|
}): Promise<SourceTable>;
|
|
47
67
|
writeChange(batch: storage.BucketStorageBatch, table: storage.SourceTable, change: mongo.ChangeStreamDocument): Promise<storage.FlushedResult | null>;
|
|
48
68
|
replicate(): Promise<void>;
|
|
49
69
|
initReplication(): Promise<void>;
|
|
50
70
|
streamChanges(): Promise<void>;
|
|
71
|
+
streamChangesInternal(): Promise<void>;
|
|
51
72
|
}
|
|
52
73
|
export {};
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { container, logger } from '@powersync/lib-services-framework';
|
|
2
2
|
import { Metrics, SaveOperationTag } from '@powersync/service-core';
|
|
3
|
+
import * as mongo from 'mongodb';
|
|
3
4
|
import { constructAfterRecord, createCheckpoint, getMongoLsn, getMongoRelation, mongoLsnToTimestamp } from './MongoRelation.js';
|
|
4
5
|
import { escapeRegExp } from '../utils.js';
|
|
6
|
+
import { CHECKPOINTS_COLLECTION } from './replication-utils.js';
|
|
7
|
+
import { PostImagesOption } from '../types/types.js';
|
|
5
8
|
export const ZERO_LSN = '0000000000000000';
|
|
6
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when the change stream is not valid anymore, and replication
|
|
11
|
+
* must be restarted.
|
|
12
|
+
*
|
|
13
|
+
* Possible reasons:
|
|
14
|
+
* * Some change stream documents do not have postImages.
|
|
15
|
+
* * startAfter/resumeToken is not valid anymore.
|
|
16
|
+
*/
|
|
17
|
+
export class ChangeStreamInvalidatedError extends Error {
|
|
7
18
|
constructor(message) {
|
|
8
19
|
super(message);
|
|
9
20
|
}
|
|
@@ -28,7 +39,19 @@ export class ChangeStream {
|
|
|
28
39
|
get stopped() {
|
|
29
40
|
return this.abort_signal.aborted;
|
|
30
41
|
}
|
|
31
|
-
|
|
42
|
+
get usePostImages() {
|
|
43
|
+
return this.connections.options.postImages != PostImagesOption.OFF;
|
|
44
|
+
}
|
|
45
|
+
get configurePostImages() {
|
|
46
|
+
return this.connections.options.postImages == PostImagesOption.AUTO_CONFIGURE;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* This resolves a pattern, persists the related metadata, and returns
|
|
50
|
+
* the resulting SourceTables.
|
|
51
|
+
*
|
|
52
|
+
* This implicitly checks the collection postImage configuration.
|
|
53
|
+
*/
|
|
54
|
+
async resolveQualifiedTableNames(batch, tablePattern) {
|
|
32
55
|
const schema = tablePattern.schema;
|
|
33
56
|
if (tablePattern.connectionTag != this.connections.connectionTag) {
|
|
34
57
|
return [];
|
|
@@ -46,8 +69,11 @@ export class ChangeStream {
|
|
|
46
69
|
.db(schema)
|
|
47
70
|
.listCollections({
|
|
48
71
|
name: nameFilter
|
|
49
|
-
}, { nameOnly:
|
|
72
|
+
}, { nameOnly: false })
|
|
50
73
|
.toArray();
|
|
74
|
+
if (!tablePattern.isWildcard && collections.length == 0) {
|
|
75
|
+
logger.warn(`Collection ${schema}.${tablePattern.name} not found`);
|
|
76
|
+
}
|
|
51
77
|
for (let collection of collections) {
|
|
52
78
|
const table = await this.handleRelation(batch, {
|
|
53
79
|
name: collection.name,
|
|
@@ -56,7 +82,7 @@ export class ChangeStream {
|
|
|
56
82
|
replicationColumns: [{ name: '_id' }]
|
|
57
83
|
},
|
|
58
84
|
// This is done as part of the initial setup - snapshot is handled elsewhere
|
|
59
|
-
{ snapshot: false });
|
|
85
|
+
{ snapshot: false, collectionInfo: collection });
|
|
60
86
|
result.push(table);
|
|
61
87
|
}
|
|
62
88
|
return result;
|
|
@@ -87,51 +113,67 @@ export class ChangeStream {
|
|
|
87
113
|
async initialReplication() {
|
|
88
114
|
const sourceTables = this.sync_rules.getSourceTables();
|
|
89
115
|
await this.client.connect();
|
|
116
|
+
// We need to get the snapshot time before taking the initial snapshot.
|
|
90
117
|
const hello = await this.defaultDb.command({ hello: 1 });
|
|
91
|
-
const
|
|
118
|
+
const snapshotTime = hello.lastWrite?.majorityOpTime?.ts;
|
|
92
119
|
if (hello.msg == 'isdbgrid') {
|
|
93
120
|
throw new Error('Sharded MongoDB Clusters are not supported yet (including MongoDB Serverless instances).');
|
|
94
121
|
}
|
|
95
122
|
else if (hello.setName == null) {
|
|
96
123
|
throw new Error('Standalone MongoDB instances are not supported - use a replicaset.');
|
|
97
124
|
}
|
|
98
|
-
else if (
|
|
125
|
+
else if (snapshotTime == null) {
|
|
99
126
|
// Not known where this would happen apart from the above cases
|
|
100
127
|
throw new Error('MongoDB lastWrite timestamp not found.');
|
|
101
128
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
129
|
+
// We previously used {snapshot: true} for the snapshot session.
|
|
130
|
+
// While it gives nice consistency guarantees, it fails when the
|
|
131
|
+
// snapshot takes longer than 5 minutes, due to minSnapshotHistoryWindowInSeconds
|
|
132
|
+
// expiring the snapshot.
|
|
133
|
+
const session = await this.client.startSession();
|
|
105
134
|
try {
|
|
106
|
-
await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName }, async (batch) => {
|
|
135
|
+
await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
|
|
136
|
+
// Start by resolving all tables.
|
|
137
|
+
// This checks postImage configuration, and that should fail as
|
|
138
|
+
// earlier as possible.
|
|
139
|
+
let allSourceTables = [];
|
|
107
140
|
for (let tablePattern of sourceTables) {
|
|
108
|
-
const tables = await this.
|
|
109
|
-
|
|
110
|
-
await this.snapshotTable(batch, table, session);
|
|
111
|
-
await batch.markSnapshotDone([table], ZERO_LSN);
|
|
112
|
-
await touch();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
const snapshotTime = session.clusterTime?.clusterTime ?? startTime;
|
|
116
|
-
if (snapshotTime != null) {
|
|
117
|
-
const lsn = getMongoLsn(snapshotTime);
|
|
118
|
-
logger.info(`Snapshot commit at ${snapshotTime.inspect()} / ${lsn}`);
|
|
119
|
-
// keepalive() does an auto-commit if there is data
|
|
120
|
-
await batch.flush();
|
|
121
|
-
await batch.keepalive(lsn);
|
|
141
|
+
const tables = await this.resolveQualifiedTableNames(batch, tablePattern);
|
|
142
|
+
allSourceTables.push(...tables);
|
|
122
143
|
}
|
|
123
|
-
|
|
124
|
-
|
|
144
|
+
for (let table of allSourceTables) {
|
|
145
|
+
await this.snapshotTable(batch, table, session);
|
|
146
|
+
await batch.markSnapshotDone([table], ZERO_LSN);
|
|
147
|
+
await touch();
|
|
125
148
|
}
|
|
149
|
+
const lsn = getMongoLsn(snapshotTime);
|
|
150
|
+
logger.info(`Snapshot commit at ${snapshotTime.inspect()} / ${lsn}`);
|
|
151
|
+
await batch.commit(lsn);
|
|
126
152
|
});
|
|
127
153
|
}
|
|
128
154
|
finally {
|
|
129
155
|
session.endSession();
|
|
130
156
|
}
|
|
131
157
|
}
|
|
158
|
+
async setupCheckpointsCollection() {
|
|
159
|
+
const collection = await this.getCollectionInfo(this.defaultDb.databaseName, CHECKPOINTS_COLLECTION);
|
|
160
|
+
if (collection == null) {
|
|
161
|
+
await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
|
|
162
|
+
changeStreamPreAndPostImages: { enabled: true }
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else if (this.usePostImages && collection.options?.changeStreamPreAndPostImages?.enabled != true) {
|
|
166
|
+
// Drop + create requires less permissions than collMod,
|
|
167
|
+
// and we don't care about the data in this collection.
|
|
168
|
+
await this.defaultDb.dropCollection(CHECKPOINTS_COLLECTION);
|
|
169
|
+
await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
|
|
170
|
+
changeStreamPreAndPostImages: { enabled: true }
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
132
174
|
getSourceNamespaceFilters() {
|
|
133
175
|
const sourceTables = this.sync_rules.getSourceTables();
|
|
134
|
-
let $inFilters = [{ db: this.defaultDb.databaseName, coll:
|
|
176
|
+
let $inFilters = [{ db: this.defaultDb.databaseName, coll: CHECKPOINTS_COLLECTION }];
|
|
135
177
|
let $refilters = [];
|
|
136
178
|
let multipleDatabases = false;
|
|
137
179
|
for (let tablePattern of sourceTables) {
|
|
@@ -142,7 +184,10 @@ export class ChangeStream {
|
|
|
142
184
|
multipleDatabases = true;
|
|
143
185
|
}
|
|
144
186
|
if (tablePattern.isWildcard) {
|
|
145
|
-
$refilters.push({
|
|
187
|
+
$refilters.push({
|
|
188
|
+
'ns.db': tablePattern.schema,
|
|
189
|
+
'ns.coll': new RegExp('^' + escapeRegExp(tablePattern.tablePrefix))
|
|
190
|
+
});
|
|
146
191
|
}
|
|
147
192
|
else {
|
|
148
193
|
$inFilters.push({
|
|
@@ -167,12 +212,13 @@ export class ChangeStream {
|
|
|
167
212
|
let at = 0;
|
|
168
213
|
const db = this.client.db(table.schema);
|
|
169
214
|
const collection = db.collection(table.table);
|
|
170
|
-
const query = collection.find({}, { session });
|
|
215
|
+
const query = collection.find({}, { session, readConcern: { level: 'majority' } });
|
|
171
216
|
const cursor = query.stream();
|
|
172
217
|
for await (let document of cursor) {
|
|
173
218
|
if (this.abort_signal.aborted) {
|
|
174
219
|
throw new Error(`Aborted initial replication`);
|
|
175
220
|
}
|
|
221
|
+
at += 1;
|
|
176
222
|
const record = constructAfterRecord(document);
|
|
177
223
|
// This auto-flushes when the batch reaches its size limit
|
|
178
224
|
await batch.save({
|
|
@@ -188,15 +234,52 @@ export class ChangeStream {
|
|
|
188
234
|
await touch();
|
|
189
235
|
}
|
|
190
236
|
await batch.flush();
|
|
237
|
+
logger.info(`Replicated ${at} documents for ${table.qualifiedName}`);
|
|
191
238
|
}
|
|
192
239
|
async getRelation(batch, descriptor) {
|
|
193
240
|
const existing = this.relation_cache.get(descriptor.objectId);
|
|
194
241
|
if (existing != null) {
|
|
195
242
|
return existing;
|
|
196
243
|
}
|
|
197
|
-
|
|
244
|
+
// Note: collection may have been dropped at this point, so we handle
|
|
245
|
+
// missing values.
|
|
246
|
+
const collection = await this.getCollectionInfo(descriptor.schema, descriptor.name);
|
|
247
|
+
return this.handleRelation(batch, descriptor, { snapshot: false, collectionInfo: collection });
|
|
248
|
+
}
|
|
249
|
+
async getCollectionInfo(db, name) {
|
|
250
|
+
const collection = (await this.client
|
|
251
|
+
.db(db)
|
|
252
|
+
.listCollections({
|
|
253
|
+
name: name
|
|
254
|
+
}, { nameOnly: false })
|
|
255
|
+
.toArray())[0];
|
|
256
|
+
return collection;
|
|
257
|
+
}
|
|
258
|
+
async checkPostImages(db, collectionInfo) {
|
|
259
|
+
if (!this.usePostImages) {
|
|
260
|
+
// Nothing to check
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const enabled = collectionInfo.options?.changeStreamPreAndPostImages?.enabled == true;
|
|
264
|
+
if (!enabled && this.configurePostImages) {
|
|
265
|
+
await this.client.db(db).command({
|
|
266
|
+
collMod: collectionInfo.name,
|
|
267
|
+
changeStreamPreAndPostImages: { enabled: true }
|
|
268
|
+
});
|
|
269
|
+
logger.info(`Enabled postImages on ${db}.${collectionInfo.name}`);
|
|
270
|
+
}
|
|
271
|
+
else if (!enabled) {
|
|
272
|
+
throw new Error(`postImages not enabled on ${db}.${collectionInfo.name}`);
|
|
273
|
+
}
|
|
198
274
|
}
|
|
199
275
|
async handleRelation(batch, descriptor, options) {
|
|
276
|
+
if (options.collectionInfo != null) {
|
|
277
|
+
await this.checkPostImages(descriptor.schema, options.collectionInfo);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// If collectionInfo is null, the collection may have been dropped.
|
|
281
|
+
// Ignore the postImages check in this case.
|
|
282
|
+
}
|
|
200
283
|
const snapshot = options.snapshot;
|
|
201
284
|
if (!descriptor.objectId && typeof descriptor.objectId != 'string') {
|
|
202
285
|
throw new Error('objectId expected');
|
|
@@ -289,30 +372,54 @@ export class ChangeStream {
|
|
|
289
372
|
}
|
|
290
373
|
async initReplication() {
|
|
291
374
|
const result = await this.initSlot();
|
|
375
|
+
await this.setupCheckpointsCollection();
|
|
292
376
|
if (result.needsInitialSync) {
|
|
293
377
|
await this.startInitialReplication();
|
|
294
378
|
}
|
|
295
379
|
}
|
|
296
380
|
async streamChanges() {
|
|
381
|
+
try {
|
|
382
|
+
await this.streamChangesInternal();
|
|
383
|
+
}
|
|
384
|
+
catch (e) {
|
|
385
|
+
if (e instanceof mongo.MongoServerError &&
|
|
386
|
+
e.codeName == 'NoMatchingDocument' &&
|
|
387
|
+
e.errmsg?.includes('post-image was not found')) {
|
|
388
|
+
throw new ChangeStreamInvalidatedError(e.errmsg);
|
|
389
|
+
}
|
|
390
|
+
throw e;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async streamChangesInternal() {
|
|
297
394
|
// Auto-activate as soon as initial replication is done
|
|
298
395
|
await this.storage.autoActivate();
|
|
299
|
-
await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName }, async (batch) => {
|
|
396
|
+
await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
|
|
300
397
|
const lastLsn = batch.lastCheckpointLsn;
|
|
301
398
|
const startAfter = mongoLsnToTimestamp(lastLsn) ?? undefined;
|
|
302
399
|
logger.info(`Resume streaming at ${startAfter?.inspect()} / ${lastLsn}`);
|
|
303
|
-
// TODO: Use changeStreamSplitLargeEvent
|
|
304
400
|
const filters = this.getSourceNamespaceFilters();
|
|
305
401
|
const pipeline = [
|
|
306
402
|
{
|
|
307
403
|
$match: filters.$match
|
|
308
|
-
}
|
|
404
|
+
},
|
|
405
|
+
{ $changeStreamSplitLargeEvent: {} }
|
|
309
406
|
];
|
|
407
|
+
let fullDocument;
|
|
408
|
+
if (this.usePostImages) {
|
|
409
|
+
// 'read_only' or 'auto_configure'
|
|
410
|
+
// Configuration happens during snapshot, or when we see new
|
|
411
|
+
// collections.
|
|
412
|
+
fullDocument = 'required';
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
fullDocument = 'updateLookup';
|
|
416
|
+
}
|
|
310
417
|
const streamOptions = {
|
|
311
418
|
startAtOperationTime: startAfter,
|
|
312
419
|
showExpandedEvents: true,
|
|
313
420
|
useBigInt64: true,
|
|
314
421
|
maxAwaitTimeMS: 200,
|
|
315
|
-
fullDocument:
|
|
422
|
+
fullDocument: fullDocument
|
|
316
423
|
};
|
|
317
424
|
let stream;
|
|
318
425
|
if (filters.multipleDatabases) {
|
|
@@ -330,30 +437,58 @@ export class ChangeStream {
|
|
|
330
437
|
this.abort_signal.addEventListener('abort', () => {
|
|
331
438
|
stream.close();
|
|
332
439
|
});
|
|
333
|
-
|
|
440
|
+
// Always start with a checkpoint.
|
|
441
|
+
// This helps us to clear erorrs when restarting, even if there is
|
|
442
|
+
// no data to replicate.
|
|
443
|
+
let waitForCheckpointLsn = await createCheckpoint(this.client, this.defaultDb);
|
|
444
|
+
let splitDocument = null;
|
|
334
445
|
while (true) {
|
|
335
446
|
if (this.abort_signal.aborted) {
|
|
336
447
|
break;
|
|
337
448
|
}
|
|
338
|
-
const
|
|
339
|
-
if (
|
|
449
|
+
const originalChangeDocument = await stream.tryNext();
|
|
450
|
+
if (originalChangeDocument == null || this.abort_signal.aborted) {
|
|
340
451
|
continue;
|
|
341
452
|
}
|
|
342
453
|
await touch();
|
|
343
|
-
if (startAfter != null &&
|
|
454
|
+
if (startAfter != null && originalChangeDocument.clusterTime?.lte(startAfter)) {
|
|
344
455
|
continue;
|
|
345
456
|
}
|
|
457
|
+
let changeDocument = originalChangeDocument;
|
|
458
|
+
if (originalChangeDocument?.splitEvent != null) {
|
|
459
|
+
// Handle split events from $changeStreamSplitLargeEvent.
|
|
460
|
+
// This is only relevant for very large update operations.
|
|
461
|
+
const splitEvent = originalChangeDocument?.splitEvent;
|
|
462
|
+
if (splitDocument == null) {
|
|
463
|
+
splitDocument = originalChangeDocument;
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
splitDocument = Object.assign(splitDocument, originalChangeDocument);
|
|
467
|
+
}
|
|
468
|
+
if (splitEvent.fragment == splitEvent.of) {
|
|
469
|
+
// Got all fragments
|
|
470
|
+
changeDocument = splitDocument;
|
|
471
|
+
splitDocument = null;
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
// Wait for more fragments
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else if (splitDocument != null) {
|
|
479
|
+
// We were waiting for fragments, but got a different event
|
|
480
|
+
throw new Error(`Incomplete splitEvent: ${JSON.stringify(splitDocument.splitEvent)}`);
|
|
481
|
+
}
|
|
346
482
|
// console.log('event', changeDocument);
|
|
347
483
|
if ((changeDocument.operationType == 'insert' ||
|
|
348
484
|
changeDocument.operationType == 'update' ||
|
|
349
485
|
changeDocument.operationType == 'replace') &&
|
|
350
|
-
changeDocument.ns.coll ==
|
|
486
|
+
changeDocument.ns.coll == CHECKPOINTS_COLLECTION) {
|
|
351
487
|
const lsn = getMongoLsn(changeDocument.clusterTime);
|
|
352
488
|
if (waitForCheckpointLsn != null && lsn >= waitForCheckpointLsn) {
|
|
353
489
|
waitForCheckpointLsn = null;
|
|
354
490
|
}
|
|
355
|
-
await batch.
|
|
356
|
-
await batch.keepalive(lsn);
|
|
491
|
+
await batch.commit(lsn);
|
|
357
492
|
}
|
|
358
493
|
else if (changeDocument.operationType == 'insert' ||
|
|
359
494
|
changeDocument.operationType == 'update' ||
|
|
@@ -385,7 +520,8 @@ export class ChangeStream {
|
|
|
385
520
|
this.relation_cache.delete(tableFrom.objectId);
|
|
386
521
|
}
|
|
387
522
|
// Here we do need to snapshot the new table
|
|
388
|
-
await this.
|
|
523
|
+
const collection = await this.getCollectionInfo(relTo.schema, relTo.name);
|
|
524
|
+
await this.handleRelation(batch, relTo, { snapshot: true, collectionInfo: collection });
|
|
389
525
|
}
|
|
390
526
|
}
|
|
391
527
|
});
|