@powersync/service-module-mysql 0.15.0 → 0.16.1
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 +42 -0
- package/dist/api/MySQLRouteAPIAdapter.js +3 -3
- package/dist/api/MySQLRouteAPIAdapter.js.map +1 -1
- package/dist/common/ReplicatedGTID.d.ts +16 -9
- package/dist/common/ReplicatedGTID.js +49 -25
- package/dist/common/ReplicatedGTID.js.map +1 -1
- package/dist/common/check-source-configuration.js +11 -0
- package/dist/common/check-source-configuration.js.map +1 -1
- package/dist/common/read-executed-gtid.d.ts +11 -1
- package/dist/common/read-executed-gtid.js +67 -5
- package/dist/common/read-executed-gtid.js.map +1 -1
- package/dist/replication/BinLogReplicationJob.js +3 -1
- package/dist/replication/BinLogReplicationJob.js.map +1 -1
- package/dist/replication/BinLogStream.d.ts +8 -0
- package/dist/replication/BinLogStream.js +58 -18
- package/dist/replication/BinLogStream.js.map +1 -1
- package/dist/replication/MySQLConnectionManager.js +6 -0
- package/dist/replication/MySQLConnectionManager.js.map +1 -1
- package/dist/replication/zongji/BinLogListener.d.ts +41 -2
- package/dist/replication/zongji/BinLogListener.js +104 -30
- package/dist/replication/zongji/BinLogListener.js.map +1 -1
- package/dist/utils/mysql-utils.d.ts +6 -0
- package/dist/utils/mysql-utils.js +10 -0
- package/dist/utils/mysql-utils.js.map +1 -1
- package/package.json +10 -10
- package/src/api/MySQLRouteAPIAdapter.ts +4 -4
- package/src/common/ReplicatedGTID.ts +65 -32
- package/src/common/check-source-configuration.ts +15 -0
- package/src/common/read-executed-gtid.ts +76 -6
- package/src/replication/BinLogReplicationJob.ts +3 -1
- package/src/replication/BinLogStream.ts +63 -18
- package/src/replication/MySQLConnectionManager.ts +6 -0
- package/src/replication/zongji/BinLogListener.ts +131 -30
- package/src/utils/mysql-utils.ts +11 -0
- package/test/src/BinLogListener.test.ts +140 -1
- package/test/src/ReplicatedGTID.test.ts +138 -0
- package/test/src/check-source-configuration.test.ts +70 -0
- package/test/src/mysql-utils.test.ts +19 -1
- package/test/src/read-executed-gtid.test.ts +188 -0
- package/test/src/util.ts +27 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -27,8 +27,10 @@ export class BinLogStream {
|
|
|
27
27
|
connections;
|
|
28
28
|
abortSignal;
|
|
29
29
|
logger;
|
|
30
|
+
activeServerUuid = null;
|
|
30
31
|
tableCache = new Map();
|
|
31
32
|
replicationLag = new ReplicationLagTracker();
|
|
33
|
+
binLogListener = null;
|
|
32
34
|
constructor(options) {
|
|
33
35
|
this.options = options;
|
|
34
36
|
this.logger = options.logger ?? defaultLogger;
|
|
@@ -145,14 +147,18 @@ export class BinLogStream {
|
|
|
145
147
|
if (status.snapshotDone) {
|
|
146
148
|
this.logger.info(`Initial replication already done.`);
|
|
147
149
|
if (lastKnowGTID) {
|
|
148
|
-
// Check if the specific binlog file is still available. If it isn't, we need to snapshot again.
|
|
149
150
|
const connection = await this.connections.getConnection();
|
|
150
151
|
try {
|
|
151
|
-
|
|
152
|
+
// Check if the active server uuid matches the one in the GTID
|
|
153
|
+
if (this.activeServerUuid !== lastKnowGTID.serverUuid) {
|
|
154
|
+
this.logger.info(`The source server uuid has changed. Active server uuid ${this.activeServerUuid} does not match the server uuid from the resume checkpoint: ${lastKnowGTID.serverUuid}, re-snapshotting to ensure consistency.`);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const isAvailable = await common.isGtidPositionStillAvailable(connection, lastKnowGTID);
|
|
152
158
|
if (!isAvailable) {
|
|
153
|
-
this.logger.info(`
|
|
159
|
+
this.logger.info(`Resume GTID ${lastKnowGTID.raw} at ${lastKnowGTID.position.filename}:${lastKnowGTID.position.offset} is no longer present in the executed GTID history or available BinLogs, re-snapshotting to ensure consistency.`);
|
|
160
|
+
return false;
|
|
154
161
|
}
|
|
155
|
-
return isAvailable;
|
|
156
162
|
}
|
|
157
163
|
finally {
|
|
158
164
|
connection.release();
|
|
@@ -184,9 +190,10 @@ export class BinLogStream {
|
|
|
184
190
|
const sourceTables = this.syncRules.getSourceTables();
|
|
185
191
|
const flushResults = await this.storage.startBatch({
|
|
186
192
|
logger: this.logger,
|
|
187
|
-
zeroLSN: common.ReplicatedGTID.ZERO.comparable,
|
|
193
|
+
zeroLSN: common.ReplicatedGTID.ZERO(this.activeServerUuid).comparable,
|
|
188
194
|
defaultSchema: this.defaultSchema,
|
|
189
|
-
storeCurrentData: false
|
|
195
|
+
storeCurrentData: false,
|
|
196
|
+
signal: this.abortSignal
|
|
190
197
|
}, async (batch) => {
|
|
191
198
|
for (let tablePattern of sourceTables) {
|
|
192
199
|
const tables = await this.getQualifiedTableNames(batch, tablePattern);
|
|
@@ -212,8 +219,8 @@ export class BinLogStream {
|
|
|
212
219
|
connection.release();
|
|
213
220
|
}
|
|
214
221
|
if (lastOp != null) {
|
|
215
|
-
//
|
|
216
|
-
await this.storage.
|
|
222
|
+
// Compact storage _after_ initial replication, but _before_ we switch to this replication stream.
|
|
223
|
+
await this.storage.compactInitialReplication({
|
|
217
224
|
// No checkpoint yet, but we do have the opId.
|
|
218
225
|
maxOpId: lastOp,
|
|
219
226
|
signal: this.abortSignal
|
|
@@ -264,7 +271,19 @@ export class BinLogStream {
|
|
|
264
271
|
throw e;
|
|
265
272
|
}
|
|
266
273
|
}
|
|
274
|
+
async ensureActiveServerUuid() {
|
|
275
|
+
if (this.activeServerUuid == null) {
|
|
276
|
+
const connection = await this.connections.getConnection();
|
|
277
|
+
try {
|
|
278
|
+
this.activeServerUuid = await common.readServerUuid(connection);
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
connection.release();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
267
285
|
async initReplication() {
|
|
286
|
+
await this.ensureActiveServerUuid();
|
|
268
287
|
const connection = await this.connections.getConnection();
|
|
269
288
|
const errors = await common.checkSourceConfiguration(connection);
|
|
270
289
|
connection.release();
|
|
@@ -281,9 +300,10 @@ export class BinLogStream {
|
|
|
281
300
|
const sourceTables = this.syncRules.getSourceTables();
|
|
282
301
|
await this.storage.startBatch({
|
|
283
302
|
logger: this.logger,
|
|
284
|
-
zeroLSN: common.ReplicatedGTID.ZERO.comparable,
|
|
303
|
+
zeroLSN: common.ReplicatedGTID.ZERO(this.activeServerUuid).comparable,
|
|
285
304
|
defaultSchema: this.defaultSchema,
|
|
286
|
-
storeCurrentData: false
|
|
305
|
+
storeCurrentData: false,
|
|
306
|
+
signal: this.abortSignal
|
|
287
307
|
}, async (batch) => {
|
|
288
308
|
for (let tablePattern of sourceTables) {
|
|
289
309
|
await this.getQualifiedTableNames(batch, tablePattern);
|
|
@@ -301,18 +321,29 @@ export class BinLogStream {
|
|
|
301
321
|
return tables;
|
|
302
322
|
}
|
|
303
323
|
async streamChanges() {
|
|
324
|
+
await this.ensureActiveServerUuid();
|
|
304
325
|
const serverId = createRandomServerId(this.storage.replicationStreamId);
|
|
305
326
|
const connection = await this.connections.getConnection();
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
327
|
+
let fromGTID;
|
|
328
|
+
try {
|
|
329
|
+
const { resumeLsn: resume_lsn } = await this.storage.getStatus();
|
|
330
|
+
if (resume_lsn) {
|
|
331
|
+
this.logger.info(`Existing resume LSN found: ${resume_lsn}`);
|
|
332
|
+
}
|
|
333
|
+
fromGTID = resume_lsn
|
|
334
|
+
? common.ReplicatedGTID.fromSerialized(resume_lsn)
|
|
335
|
+
: await common.readExecutedGtid(connection);
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
connection.release();
|
|
309
339
|
}
|
|
310
|
-
const fromGTID = resume_lsn
|
|
311
|
-
? common.ReplicatedGTID.fromSerialized(resume_lsn)
|
|
312
|
-
: await common.readExecutedGtid(connection);
|
|
313
|
-
connection.release();
|
|
314
340
|
if (!this.stopped) {
|
|
315
|
-
await this.storage.startBatch({
|
|
341
|
+
await this.storage.startBatch({
|
|
342
|
+
zeroLSN: common.ReplicatedGTID.ZERO(this.activeServerUuid).comparable,
|
|
343
|
+
defaultSchema: this.defaultSchema,
|
|
344
|
+
storeCurrentData: false,
|
|
345
|
+
signal: this.abortSignal
|
|
346
|
+
}, async (batch) => {
|
|
316
347
|
const binlogEventHandler = this.createBinlogEventHandler(batch);
|
|
317
348
|
const binlogListener = new BinLogListener({
|
|
318
349
|
logger: this.logger,
|
|
@@ -320,8 +351,10 @@ export class BinLogStream {
|
|
|
320
351
|
startGTID: fromGTID,
|
|
321
352
|
connectionManager: this.connections,
|
|
322
353
|
serverId: serverId,
|
|
354
|
+
activeServerUuid: this.activeServerUuid,
|
|
323
355
|
eventHandler: binlogEventHandler
|
|
324
356
|
});
|
|
357
|
+
this.binLogListener = binlogListener;
|
|
325
358
|
this.abortSignal.addEventListener('abort', async () => {
|
|
326
359
|
await binlogListener.stop();
|
|
327
360
|
}, { once: true });
|
|
@@ -513,6 +546,13 @@ export class BinLogStream {
|
|
|
513
546
|
getReplicationLagMillis() {
|
|
514
547
|
return this.replicationLag.getLagMillis();
|
|
515
548
|
}
|
|
549
|
+
/**
|
|
550
|
+
* Probe the liveness of the BinLog Listener's control connection. Called from the replication
|
|
551
|
+
* job's keepAlive. Does nothing before streaming starts (during the initial snapshot).
|
|
552
|
+
*/
|
|
553
|
+
probeControlConnection() {
|
|
554
|
+
this.binLogListener?.probeControlConnection();
|
|
555
|
+
}
|
|
516
556
|
async tryRollback(promiseConnection) {
|
|
517
557
|
try {
|
|
518
558
|
await promiseConnection.query('ROLLBACK');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinLogStream.js","sourceRoot":"","sources":["../../src/replication/BinLogStream.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BinLogStream.js","sourceRoot":"","sources":["../../src/replication/BinLogStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,11 +35,17 @@ export class MySQLConnectionManager extends BaseObserver {
|
|
|
35
35
|
* Create a new replication listener
|
|
36
36
|
*/
|
|
37
37
|
createBinlogListener() {
|
|
38
|
+
// These options apply to both the binlog connection and the control connection Zongji creates.
|
|
38
39
|
const listener = new ZongJi({
|
|
39
40
|
host: this.options.hostname,
|
|
40
41
|
port: this.options.port,
|
|
41
42
|
user: this.options.username,
|
|
42
43
|
password: this.options.password,
|
|
44
|
+
// TCP keepalive is disabled by default in @vlasky/mysql. Without it, the idle control
|
|
45
|
+
// connection can be silently dropped by stateful firewalls, freezing replication on the
|
|
46
|
+
// next table metadata query until the TCP retransmission timeout (~950s).
|
|
47
|
+
enableKeepAlive: true,
|
|
48
|
+
keepAliveInitialDelay: mysql_utils.TCP_KEEPALIVE_INITIAL_DELAY,
|
|
43
49
|
// We want to avoid parsing date/time values to Date, because that drops sub-millisecond precision.
|
|
44
50
|
dateStrings: true,
|
|
45
51
|
timeZone: 'Z'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MySQLConnectionManager.js","sourceRoot":"","sources":["../../src/replication/MySQLConnectionManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MySQLConnectionManager.js","sourceRoot":"","sources":["../../src/replication/MySQLConnectionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,16 @@ import { MySQLConnectionManager } from '../MySQLConnectionManager.js';
|
|
|
8
8
|
* Seconds of inactivity after which a keepalive event is sent by the MySQL server.
|
|
9
9
|
*/
|
|
10
10
|
export declare const KEEPALIVE_INACTIVITY_THRESHOLD = 30;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum time in milliseconds to wait for Zongji to stop before force-closing its control connection.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ZONGJI_STOP_TIMEOUT = 5000;
|
|
15
|
+
/**
|
|
16
|
+
* Maximum time in milliseconds a control connection liveness probe may execute before the
|
|
17
|
+
* connection is considered dead. Time the probe spends queued behind other control queries
|
|
18
|
+
* does not count towards this.
|
|
19
|
+
*/
|
|
20
|
+
export declare const CTRL_CONNECTION_PROBE_TIMEOUT = 5000;
|
|
11
21
|
export type Row = Record<string, any>;
|
|
12
22
|
/**
|
|
13
23
|
* Schema changes that are detectable by inspecting query events.
|
|
@@ -49,10 +59,18 @@ export interface BinLogListenerOptions {
|
|
|
49
59
|
connectionManager: MySQLConnectionManager;
|
|
50
60
|
eventHandler: BinLogEventHandler;
|
|
51
61
|
sourceTables: TablePattern[];
|
|
62
|
+
/**
|
|
63
|
+
* Id that identifies this replication client.
|
|
64
|
+
*/
|
|
52
65
|
serverId: number;
|
|
66
|
+
/**
|
|
67
|
+
* The server uuid of the source MySQL server that is being replicated.
|
|
68
|
+
*/
|
|
69
|
+
activeServerUuid: string;
|
|
53
70
|
startGTID: common.ReplicatedGTID;
|
|
54
71
|
logger?: Logger;
|
|
55
72
|
keepAliveInactivitySeconds?: number;
|
|
73
|
+
ctrlConnectionProbeTimeoutMs?: number;
|
|
56
74
|
}
|
|
57
75
|
/**
|
|
58
76
|
* Wrapper class for the Zongji BinLog listener. Internally handles the creation and management of the listener and posts
|
|
@@ -61,8 +79,6 @@ export interface BinLogListenerOptions {
|
|
|
61
79
|
export declare class BinLogListener {
|
|
62
80
|
options: BinLogListenerOptions;
|
|
63
81
|
private sqlParser;
|
|
64
|
-
private connectionManager;
|
|
65
|
-
private eventHandler;
|
|
66
82
|
private binLogPosition;
|
|
67
83
|
private currentGTID;
|
|
68
84
|
private logger;
|
|
@@ -70,6 +86,7 @@ export declare class BinLogListener {
|
|
|
70
86
|
private databaseFilter;
|
|
71
87
|
private isStopped;
|
|
72
88
|
private isStopping;
|
|
89
|
+
private probePending;
|
|
73
90
|
private isTransactionOpen;
|
|
74
91
|
zongji: ZongJi;
|
|
75
92
|
processingQueue: async.QueueObject<BinLogEvent>;
|
|
@@ -78,6 +95,9 @@ export declare class BinLogListener {
|
|
|
78
95
|
*/
|
|
79
96
|
queueMemoryUsage: number;
|
|
80
97
|
constructor(options: BinLogListenerOptions);
|
|
98
|
+
private get connectionManager();
|
|
99
|
+
private get eventHandler();
|
|
100
|
+
private get activeServerUuid();
|
|
81
101
|
/**
|
|
82
102
|
* The queue memory limit in bytes as defined in the connection options.
|
|
83
103
|
* @private
|
|
@@ -88,10 +108,29 @@ export declare class BinLogListener {
|
|
|
88
108
|
private stopZongji;
|
|
89
109
|
stop(): Promise<void>;
|
|
90
110
|
replicateUntilStopped(): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* The binlog connection is kept alive by the MySQL server heartbeat, but the control connection
|
|
113
|
+
* carries no traffic between metadata queries. TCP keepalive stops it from being dropped when idle,
|
|
114
|
+
* but detects an already dead connection slowly, so the replication job's keepAlive additionally
|
|
115
|
+
* probes it with a lightweight query and stops the listener (restarting replication) if the probe
|
|
116
|
+
* does not respond in time.
|
|
117
|
+
*
|
|
118
|
+
* The driver starts the query timeout when the query begins executing, not when it is queued, so a
|
|
119
|
+
* probe waiting behind a legitimately slow metadata query does not produce a false failure. A probe
|
|
120
|
+
* queued on a dead socket is failed together with the queued query by TCP keepalive on the socket.
|
|
121
|
+
*/
|
|
122
|
+
probeControlConnection(): void;
|
|
91
123
|
private createProcessingQueue;
|
|
92
124
|
private createZongjiListener;
|
|
93
125
|
isQueueOverCapacity(): boolean;
|
|
94
126
|
private createQueueWorker;
|
|
127
|
+
/**
|
|
128
|
+
* Advances the binlog position to the end of a committed transaction and updates the currentGTID to match.
|
|
129
|
+
* This ensures subsequent heartbeat keepalives report an LSN that is not behind the last commit LSN,
|
|
130
|
+
* which would otherwise block checkpoint creation until the next transaction arrives.
|
|
131
|
+
* Returns the commit LSN.
|
|
132
|
+
*/
|
|
133
|
+
private advanceCommitPosition;
|
|
95
134
|
private processQueryEvent;
|
|
96
135
|
/**
|
|
97
136
|
* Function that interprets a DDL query for any applicable schema changes.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logger as defaultLogger } from '@powersync/lib-services-framework';
|
|
1
|
+
import { ReplicationAssertionError, logger as defaultLogger } from '@powersync/lib-services-framework';
|
|
2
2
|
import async from 'async';
|
|
3
3
|
import pkg from 'node-sql-parser';
|
|
4
4
|
import timers from 'timers/promises';
|
|
@@ -10,6 +10,16 @@ const { Parser } = pkg;
|
|
|
10
10
|
* Seconds of inactivity after which a keepalive event is sent by the MySQL server.
|
|
11
11
|
*/
|
|
12
12
|
export const KEEPALIVE_INACTIVITY_THRESHOLD = 30;
|
|
13
|
+
/**
|
|
14
|
+
* Maximum time in milliseconds to wait for Zongji to stop before force-closing its control connection.
|
|
15
|
+
*/
|
|
16
|
+
export const ZONGJI_STOP_TIMEOUT = 5_000;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum time in milliseconds a control connection liveness probe may execute before the
|
|
19
|
+
* connection is considered dead. Time the probe spends queued behind other control queries
|
|
20
|
+
* does not count towards this.
|
|
21
|
+
*/
|
|
22
|
+
export const CTRL_CONNECTION_PROBE_TIMEOUT = 5_000;
|
|
13
23
|
/**
|
|
14
24
|
* Schema changes that are detectable by inspecting query events.
|
|
15
25
|
* Create table statements are not included here, since new tables are automatically detected when row events
|
|
@@ -30,8 +40,6 @@ export var SchemaChangeType;
|
|
|
30
40
|
export class BinLogListener {
|
|
31
41
|
options;
|
|
32
42
|
sqlParser;
|
|
33
|
-
connectionManager;
|
|
34
|
-
eventHandler;
|
|
35
43
|
binLogPosition;
|
|
36
44
|
currentGTID;
|
|
37
45
|
logger;
|
|
@@ -39,6 +47,8 @@ export class BinLogListener {
|
|
|
39
47
|
databaseFilter;
|
|
40
48
|
isStopped = false;
|
|
41
49
|
isStopping = false;
|
|
50
|
+
// Set while a control connection probe is awaiting a response, so repeated probes do not pile up behind it.
|
|
51
|
+
probePending = false;
|
|
42
52
|
// Flag to indicate if are currently in a transaction that involves multiple row mutation events.
|
|
43
53
|
isTransactionOpen = false;
|
|
44
54
|
zongji;
|
|
@@ -50,9 +60,8 @@ export class BinLogListener {
|
|
|
50
60
|
constructor(options) {
|
|
51
61
|
this.options = options;
|
|
52
62
|
this.logger = options.logger ?? defaultLogger;
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
this.binLogPosition = options.startGTID.position;
|
|
63
|
+
// Copy the position: the listener mutates it as events are processed, and the caller's startGTID must not change
|
|
64
|
+
this.binLogPosition = { ...options.startGTID.position };
|
|
56
65
|
this.currentGTID = options.startGTID;
|
|
57
66
|
this.sqlParser = new Parser();
|
|
58
67
|
this.processingQueue = this.createProcessingQueue();
|
|
@@ -60,6 +69,15 @@ export class BinLogListener {
|
|
|
60
69
|
this.listenerError = null;
|
|
61
70
|
this.databaseFilter = this.createDatabaseFilter(options.sourceTables);
|
|
62
71
|
}
|
|
72
|
+
get connectionManager() {
|
|
73
|
+
return this.options.connectionManager;
|
|
74
|
+
}
|
|
75
|
+
get eventHandler() {
|
|
76
|
+
return this.options.eventHandler;
|
|
77
|
+
}
|
|
78
|
+
get activeServerUuid() {
|
|
79
|
+
return this.options.activeServerUuid;
|
|
80
|
+
}
|
|
63
81
|
/**
|
|
64
82
|
* The queue memory limit in bytes as defined in the connection options.
|
|
65
83
|
* @private
|
|
@@ -130,12 +148,29 @@ export class BinLogListener {
|
|
|
130
148
|
async stopZongji() {
|
|
131
149
|
if (!this.zongji.stopped) {
|
|
132
150
|
this.logger.info('Stopping BinLog Listener...');
|
|
133
|
-
|
|
151
|
+
const controlConnection = this.zongji.ctrlConnection;
|
|
152
|
+
let stopped = false;
|
|
153
|
+
const stopPromise = new Promise((resolve) => {
|
|
134
154
|
this.zongji.once('stopped', () => {
|
|
155
|
+
stopped = true;
|
|
135
156
|
resolve();
|
|
136
157
|
});
|
|
137
158
|
this.zongji.stop();
|
|
138
159
|
});
|
|
160
|
+
// Zongji only emits 'stopped' once the KILL query on its control connection has completed.
|
|
161
|
+
// If that connection has been dead for a while, the query can block on TCP retransmissions
|
|
162
|
+
// for many minutes, so we destroy the socket after a timeout to unblock the stop.
|
|
163
|
+
const timeout = timers.setTimeout(ZONGJI_STOP_TIMEOUT, undefined, { ref: false }).then(() => {
|
|
164
|
+
if (!stopped) {
|
|
165
|
+
this.logger.warn('Timed out waiting for the BinLog Listener to stop. Closing the control connection.');
|
|
166
|
+
controlConnection._socket?.destroy();
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
await Promise.race([stopPromise, timeout]);
|
|
170
|
+
// Zongji destroys the control connection when it stops, which drops pending query callbacks:
|
|
171
|
+
// a probe waiting on this connection would otherwise stay pending forever and disable
|
|
172
|
+
// probing after a restart.
|
|
173
|
+
this.probePending = false;
|
|
139
174
|
this.logger.info('BinLog Listener stopped.');
|
|
140
175
|
}
|
|
141
176
|
}
|
|
@@ -156,6 +191,38 @@ export class BinLogListener {
|
|
|
156
191
|
throw this.listenerError;
|
|
157
192
|
}
|
|
158
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* The binlog connection is kept alive by the MySQL server heartbeat, but the control connection
|
|
196
|
+
* carries no traffic between metadata queries. TCP keepalive stops it from being dropped when idle,
|
|
197
|
+
* but detects an already dead connection slowly, so the replication job's keepAlive additionally
|
|
198
|
+
* probes it with a lightweight query and stops the listener (restarting replication) if the probe
|
|
199
|
+
* does not respond in time.
|
|
200
|
+
*
|
|
201
|
+
* The driver starts the query timeout when the query begins executing, not when it is queued, so a
|
|
202
|
+
* probe waiting behind a legitimately slow metadata query does not produce a false failure. A probe
|
|
203
|
+
* queued on a dead socket is failed together with the queued query by TCP keepalive on the socket.
|
|
204
|
+
*/
|
|
205
|
+
probeControlConnection() {
|
|
206
|
+
if (this.probePending || this.zongji.stopped || this.isStopped || this.isStopping) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this.probePending = true;
|
|
210
|
+
const controlConnection = this.zongji.ctrlConnection;
|
|
211
|
+
const timeout = this.options.ctrlConnectionProbeTimeoutMs ?? CTRL_CONNECTION_PROBE_TIMEOUT;
|
|
212
|
+
controlConnection.query({ sql: 'SELECT 1', timeout }, (error) => {
|
|
213
|
+
this.probePending = false;
|
|
214
|
+
// Only act if the probe failed on a connection that is still supposed to be alive.
|
|
215
|
+
if (error != null &&
|
|
216
|
+
this.zongji.ctrlConnection === controlConnection &&
|
|
217
|
+
!this.zongji.stopped &&
|
|
218
|
+
!(this.isStopped || this.isStopping)) {
|
|
219
|
+
this.logger.warn('MySQL control connection is unresponsive. Stopping the BinLog Listener...');
|
|
220
|
+
this.listenerError = new Error('MySQL control connection is unresponsive.');
|
|
221
|
+
controlConnection._socket?.destroy();
|
|
222
|
+
this.stop();
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
159
226
|
createProcessingQueue() {
|
|
160
227
|
const queue = async.queue(this.createQueueWorker(), 1);
|
|
161
228
|
queue.error((error) => {
|
|
@@ -202,28 +269,33 @@ export class BinLogListener {
|
|
|
202
269
|
return async (evt) => {
|
|
203
270
|
switch (true) {
|
|
204
271
|
case zongji_utils.eventIsGTIDLog(evt):
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
272
|
+
const transactionGTID = common.ReplicatedGTID.fromBinLogEvent({
|
|
273
|
+
rawGtid: {
|
|
274
|
+
serverUuid: evt.serverId, // The server uuid this transaction originated from
|
|
275
|
+
transactionId: evt.transactionRange
|
|
209
276
|
},
|
|
210
277
|
position: {
|
|
211
278
|
filename: this.binLogPosition.filename,
|
|
212
279
|
offset: evt.nextPosition
|
|
213
280
|
}
|
|
214
281
|
});
|
|
282
|
+
if (transactionGTID.serverUuid !== this.activeServerUuid) {
|
|
283
|
+
throw new ReplicationAssertionError(`Detected a transaction from a different MySQL server UUID: ${transactionGTID.serverUuid} than the server that is currently being replicated from: ${this.activeServerUuid}. ` +
|
|
284
|
+
`A re-snapshot is required to ensure consistency.`);
|
|
285
|
+
}
|
|
286
|
+
this.currentGTID = transactionGTID;
|
|
215
287
|
this.binLogPosition.offset = evt.nextPosition;
|
|
216
288
|
await this.eventHandler.onTransactionStart({ timestamp: new Date(evt.timestamp) });
|
|
217
289
|
this.logger.info(`Processed GTID event: ${this.currentGTID.comparable}`);
|
|
218
290
|
break;
|
|
219
291
|
case zongji_utils.eventIsRotation(evt):
|
|
220
292
|
// The first event when starting replication is a synthetic Rotate event
|
|
221
|
-
// It describes the
|
|
293
|
+
// It describes the the position and file that the replica requested to start from
|
|
294
|
+
const isNewFile = this.binLogPosition.filename !== evt.binlogName;
|
|
222
295
|
this.binLogPosition.filename = evt.binlogName;
|
|
223
|
-
this.binLogPosition.offset = evt.
|
|
296
|
+
this.binLogPosition.offset = evt.position;
|
|
224
297
|
await this.eventHandler.onRotate();
|
|
225
|
-
|
|
226
|
-
if (newFile) {
|
|
298
|
+
if (isNewFile) {
|
|
227
299
|
this.logger.info(`Processed Rotate event. New BinLog file is: ${this.binLogPosition.filename}:${this.binLogPosition.offset}`);
|
|
228
300
|
}
|
|
229
301
|
break;
|
|
@@ -255,11 +327,7 @@ export class BinLogListener {
|
|
|
255
327
|
break;
|
|
256
328
|
case zongji_utils.eventIsXid(evt):
|
|
257
329
|
this.isTransactionOpen = false;
|
|
258
|
-
|
|
259
|
-
const LSN = new common.ReplicatedGTID({
|
|
260
|
-
raw_gtid: this.currentGTID.raw,
|
|
261
|
-
position: this.binLogPosition
|
|
262
|
-
}).comparable;
|
|
330
|
+
const LSN = this.advanceCommitPosition(evt.nextPosition);
|
|
263
331
|
await this.eventHandler.onCommit(LSN);
|
|
264
332
|
this.logger.info(`Processed Xid event - transaction complete. LSN: ${LSN}.`);
|
|
265
333
|
break;
|
|
@@ -270,6 +338,20 @@ export class BinLogListener {
|
|
|
270
338
|
this.queueMemoryUsage -= evt.size;
|
|
271
339
|
};
|
|
272
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* Advances the binlog position to the end of a committed transaction and updates the currentGTID to match.
|
|
343
|
+
* This ensures subsequent heartbeat keepalives report an LSN that is not behind the last commit LSN,
|
|
344
|
+
* which would otherwise block checkpoint creation until the next transaction arrives.
|
|
345
|
+
* Returns the commit LSN.
|
|
346
|
+
*/
|
|
347
|
+
advanceCommitPosition(nextPosition) {
|
|
348
|
+
this.binLogPosition.offset = nextPosition;
|
|
349
|
+
this.currentGTID = new common.ReplicatedGTID({
|
|
350
|
+
rawGtid: this.currentGTID.raw,
|
|
351
|
+
position: { ...this.binLogPosition }
|
|
352
|
+
});
|
|
353
|
+
return this.currentGTID.comparable;
|
|
354
|
+
}
|
|
273
355
|
async processQueryEvent(event) {
|
|
274
356
|
const { query, nextPosition } = event;
|
|
275
357
|
// BEGIN query events mark the start of a transaction before any row events. They are not schema changes so no further parsing is necessary.
|
|
@@ -288,11 +370,7 @@ export class BinLogListener {
|
|
|
288
370
|
// DDL queries are auto commited, but do not come with a corresponding Xid event, in those cases we trigger a manual commit if we are not already in a transaction.
|
|
289
371
|
// Some DDL queries include row events, and in those cases will include a Xid event.
|
|
290
372
|
if (!this.isTransactionOpen) {
|
|
291
|
-
|
|
292
|
-
const LSN = new common.ReplicatedGTID({
|
|
293
|
-
raw_gtid: this.currentGTID.raw,
|
|
294
|
-
position: this.binLogPosition
|
|
295
|
-
}).comparable;
|
|
373
|
+
const LSN = this.advanceCommitPosition(nextPosition);
|
|
296
374
|
await this.eventHandler.onCommit(LSN);
|
|
297
375
|
}
|
|
298
376
|
this.logger.info(`Successfully processed ${schemaChanges.length} schema change(s).`);
|
|
@@ -309,11 +387,7 @@ export class BinLogListener {
|
|
|
309
387
|
}
|
|
310
388
|
}
|
|
311
389
|
else if (!this.isTransactionOpen) {
|
|
312
|
-
|
|
313
|
-
const LSN = new common.ReplicatedGTID({
|
|
314
|
-
raw_gtid: this.currentGTID.raw,
|
|
315
|
-
position: this.binLogPosition
|
|
316
|
-
}).comparable;
|
|
390
|
+
const LSN = this.advanceCommitPosition(nextPosition);
|
|
317
391
|
await this.eventHandler.onCommit(LSN);
|
|
318
392
|
}
|
|
319
393
|
}
|