Skip to content

Commit 11a14de

Browse files
committed
filter XLOG records produced by DLL statements fixes #16
1 parent 89a8d27 commit 11a14de

File tree

4 files changed

+109
-65
lines changed

4 files changed

+109
-65
lines changed

contrib/mmts/multimaster.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3747,6 +3747,11 @@ static bool MtmProcessDDLCommand(char const* queryString)
37473747
return false;
37483748
}
37493749

3750+
static void MtmFinishDDLCommand()
3751+
{
3752+
LogLogicalMessage("E", "", 1, true);
3753+
}
3754+
37503755
void MtmUpdateLockGraph(int nodeId, void const* messageBody, int messageSize)
37513756
{
37523757
int allocated;
@@ -3768,6 +3773,7 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
37683773
DestReceiver *dest, char *completionTag)
37693774
{
37703775
bool skipCommand = false;
3776+
bool executed = false;
37713777

37723778
MTM_LOG3("%d: Process utility statement %s", MyProcPid, queryString);
37733779
switch (nodeTag(parsetree))
@@ -3912,6 +3918,7 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
39123918
if (!skipCommand && !MtmTx.isReplicated && (MtmUtilityProcessedInXid == InvalidTransactionId)) {
39133919
MtmUtilityProcessedInXid = GetCurrentTransactionId();
39143920
MtmProcessDDLCommand(queryString);
3921+
executed = true;
39153922
}
39163923
}
39173924

@@ -3933,6 +3940,10 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
39333940
MtmTx.snapshot = INVALID_CSN;
39343941
}
39353942

3943+
if (executed)
3944+
{
3945+
MtmFinishDDLCommand();
3946+
}
39363947
}
39373948

39383949

@@ -3967,12 +3978,6 @@ MtmExecutorFinish(QueryDesc *queryDesc)
39673978
}
39683979
}
39693980

3970-
// if (MyXactAccessedRel)
3971-
// {
3972-
// MTM_LOG1("MtmTx.containsDML = true");
3973-
// MtmTx.containsDML = true;
3974-
// }
3975-
39763981
if (PreviousExecutorFinishHook != NULL)
39773982
{
39783983
PreviousExecutorFinishHook(queryDesc);

contrib/mmts/pglogical_apply.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ typedef struct TupleData
5959
bool changed[MaxTupleAttributeNumber];
6060
} TupleData;
6161

62-
static bool inside_tx = false;
63-
6462
static Relation read_rel(StringInfo s, LOCKMODE mode);
6563
static void read_tuple_parts(StringInfo s, Relation rel, TupleData *tup);
6664
static EState* create_rel_estate(Relation rel);
@@ -353,8 +351,6 @@ process_remote_begin(StringInfo s)
353351
StartTransactionCommand();
354352
MtmJoinTransaction(&gtid, snapshot);
355353

356-
inside_tx = true;
357-
358354
return true;
359355
}
360356

@@ -364,11 +360,6 @@ process_remote_transactional_message(StringInfo s)
364360
int rc;
365361
int messageSize = pq_getmsgint(s, 4);
366362
char const* stmt = pq_getmsgbytes(s, messageSize);
367-
if (!inside_tx)
368-
{
369-
MTM_LOG1("%d: Ignoring utility statement %s", MyProcPid, stmt);
370-
return;
371-
}
372363

373364
MTM_LOG1("%d: Executing utility statement %s", MyProcPid, stmt);
374365
SPI_connect();
@@ -667,7 +658,6 @@ process_remote_commit(StringInfo in)
667658
if (flags & PGLOGICAL_CAUGHT_UP) {
668659
MtmRecoveryCompleted();
669660
}
670-
inside_tx = false;
671661
}
672662

673663
static void
@@ -992,7 +982,7 @@ void MtmExecutor(void* work, size_t size)
992982
{
993983
while (true) {
994984
char action = pq_getmsgbyte(&s);
995-
MTM_LOG3("%d: REMOTE process action %c", MyProcPid, action);
985+
MTM_LOG1("%d: REMOTE process action %c", MyProcPid, action);
996986
#if 0
997987
if (Mtm->status == MTM_RECOVERY) {
998988
MTM_LOG1("Replay action %c[%x]", action, s.data[s.cursor]);
@@ -1054,6 +1044,7 @@ void MtmExecutor(void* work, size_t size)
10541044
continue;
10551045
}
10561046
case 'G':
1047+
case 'E':
10571048
{
10581049
process_remote_transactional_message(&s);
10591050
continue;

contrib/mmts/pglogical_proto.c

Lines changed: 94 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@
3838
#include "multimaster.h"
3939
#include "pglogical_relid_map.h"
4040

41-
static bool MtmIsFilteredTxn;
42-
static int MtmTransactionRecords;
41+
static int MtmTransactionRecords;
42+
static TransactionId MtmCurrentXid;
43+
static bool DDLInProress = false;
4344

4445
static void pglogical_write_rel(StringInfo out, PGLogicalOutputData *data, Relation rel);
4546

@@ -74,10 +75,17 @@ pglogical_write_rel(StringInfo out, PGLogicalOutputData *data, Relation rel)
7475
const char *relname;
7576
uint8 relnamelen;
7677
Oid relid;
77-
if (MtmIsFilteredTxn) {
78+
79+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN) {
80+
MTM_LOG1("%d: pglogical_write_message filtered", MyProcPid);
7881
return;
7982
}
80-
83+
84+
if (DDLInProress) {
85+
MTM_LOG1("%d: pglogical_write_message filtered DDLInProress", MyProcPid);
86+
return;
87+
}
88+
8189
relid = RelationGetRelid(rel);
8290
pq_sendbyte(out, 'R'); /* sending RELATION */
8391
pq_sendint(out, relid, sizeof relid); /* use Oid as relation identifier */
@@ -107,36 +115,42 @@ pglogical_write_begin(StringInfo out, PGLogicalOutputData *data,
107115
{
108116
bool isRecovery = MtmIsRecoveredNode(MtmReplicationNodeId);
109117
csn_t csn = MtmTransactionSnapshot(txn->xid);
118+
119+
MtmCurrentXid = txn->xid;
120+
110121
MTM_LOG3("%d: pglogical_write_begin XID=%d node=%d CSN=%ld recovery=%d restart_decoding_lsn=%lx first_lsn=%lx end_lsn=%lx confirmed_flush=%lx",
111122
MyProcPid, txn->xid, MtmReplicationNodeId, csn, isRecovery, txn->restart_decoding_lsn, txn->first_lsn, txn->end_lsn, MyReplicationSlot->data.confirmed_flush);
112-
113-
if (!isRecovery && csn == INVALID_CSN) {
114-
MtmIsFilteredTxn = true;
115-
MTM_LOG3("%d: pglogical_write_begin XID=%d filtered", MyProcPid, txn->xid);
116-
} else {
117-
MTM_LOG3("%d: pglogical_write_begin XID=%d sent", MyProcPid, txn->xid);
118-
MtmIsFilteredTxn = false;
119-
pq_sendbyte(out, 'B'); /* BEGIN */
120-
pq_sendint(out, MtmNodeId, 4);
121-
pq_sendint(out, isRecovery ? InvalidTransactionId : txn->xid, 4);
122-
pq_sendint64(out, csn);
123-
MtmTransactionRecords = 0;
124-
}
123+
124+
MTM_LOG3("%d: pglogical_write_begin XID=%d sent", MyProcPid, txn->xid);
125+
pq_sendbyte(out, 'B'); /* BEGIN */
126+
pq_sendint(out, MtmNodeId, 4);
127+
pq_sendint(out, isRecovery ? InvalidTransactionId : txn->xid, 4);
128+
pq_sendint64(out, csn);
129+
MtmTransactionRecords = 0;
125130
}
126131

127132
static void
128133
pglogical_write_message(StringInfo out,
129134
const char *prefix, Size sz, const char *message)
130135
{
131-
if (*prefix == 'L') {
136+
if (*prefix == 'L')
137+
{
132138
MTM_LOG1("Send deadlock message to node %d", MtmReplicationNodeId);
133-
} else {
134-
if (MtmIsFilteredTxn)
139+
}
140+
else if (*prefix == 'G')
141+
{
142+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN)
135143
{
136-
MTM_LOG3("%d: pglogical_write_message filtered", MyProcPid);
144+
MTM_LOG1("%d: pglogical_write_message filtered", MyProcPid);
137145
return;
138146
}
147+
DDLInProress = true;
139148
}
149+
else if (*prefix == 'E')
150+
{
151+
DDLInProress = false;
152+
}
153+
140154
pq_sendbyte(out, *prefix);
141155
pq_sendint(out, sz, 4);
142156
pq_sendbytes(out, message, sz);
@@ -169,10 +183,10 @@ pglogical_write_commit(StringInfo out, PGLogicalOutputData *data,
169183
Assert(flags != PGLOGICAL_COMMIT_PREPARED || txn->xid < 1000 || MtmTransactionRecords != 1);
170184

171185
if (flags == PGLOGICAL_COMMIT || flags == PGLOGICAL_PREPARE) {
172-
if (MtmIsFilteredTxn) {
173-
Assert(MtmTransactionRecords == 0);
174-
return;
175-
}
186+
// if (MtmIsFilteredTxn) {
187+
// Assert(MtmTransactionRecords == 0);
188+
// return;
189+
// }
176190
} else {
177191
csn_t csn = MtmTransactionSnapshot(txn->xid);
178192
bool isRecovery = MtmIsRecoveredNode(MtmReplicationNodeId);
@@ -242,11 +256,20 @@ static void
242256
pglogical_write_insert(StringInfo out, PGLogicalOutputData *data,
243257
Relation rel, HeapTuple newtuple)
244258
{
245-
if (!MtmIsFilteredTxn) {
246-
MtmTransactionRecords += 1;
247-
pq_sendbyte(out, 'I'); /* action INSERT */
248-
pglogical_write_tuple(out, data, rel, newtuple);
259+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN){
260+
MTM_LOG1("%d: pglogical_write_insert filtered", MyProcPid);
261+
return;
262+
}
263+
264+
if (DDLInProress) {
265+
MTM_LOG1("%d: pglogical_write_insert filtered DDLInProress", MyProcPid);
266+
return;
249267
}
268+
269+
MtmTransactionRecords += 1;
270+
pq_sendbyte(out, 'I'); /* action INSERT */
271+
pglogical_write_tuple(out, data, rel, newtuple);
272+
250273
}
251274

252275
/*
@@ -256,23 +279,30 @@ static void
256279
pglogical_write_update(StringInfo out, PGLogicalOutputData *data,
257280
Relation rel, HeapTuple oldtuple, HeapTuple newtuple)
258281
{
259-
if (!MtmIsFilteredTxn) {
260-
MtmTransactionRecords += 1;
282+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN){
283+
MTM_LOG1("%d: pglogical_write_update filtered", MyProcPid);
284+
return;
285+
}
261286

262-
MTM_LOG3("%d: pglogical_write_update confirmed_flush=%lx", MyProcPid, MyReplicationSlot->data.confirmed_flush);
287+
if (DDLInProress) {
288+
MTM_LOG1("%d: pglogical_write_update filtered DDLInProress", MyProcPid);
289+
return;
290+
}
263291

292+
MtmTransactionRecords += 1;
264293

265-
pq_sendbyte(out, 'U'); /* action UPDATE */
266-
/* FIXME support whole tuple (O tuple type) */
267-
if (oldtuple != NULL)
268-
{
269-
pq_sendbyte(out, 'K'); /* old key follows */
270-
pglogical_write_tuple(out, data, rel, oldtuple);
271-
}
272-
273-
pq_sendbyte(out, 'N'); /* new tuple follows */
274-
pglogical_write_tuple(out, data, rel, newtuple);
294+
MTM_LOG3("%d: pglogical_write_update confirmed_flush=%lx", MyProcPid, MyReplicationSlot->data.confirmed_flush);
295+
296+
pq_sendbyte(out, 'U'); /* action UPDATE */
297+
/* FIXME support whole tuple (O tuple type) */
298+
if (oldtuple != NULL)
299+
{
300+
pq_sendbyte(out, 'K'); /* old key follows */
301+
pglogical_write_tuple(out, data, rel, oldtuple);
275302
}
303+
304+
pq_sendbyte(out, 'N'); /* new tuple follows */
305+
pglogical_write_tuple(out, data, rel, newtuple);
276306
}
277307

278308
/*
@@ -282,11 +312,19 @@ static void
282312
pglogical_write_delete(StringInfo out, PGLogicalOutputData *data,
283313
Relation rel, HeapTuple oldtuple)
284314
{
285-
if (!MtmIsFilteredTxn) {
286-
MtmTransactionRecords += 1;
287-
pq_sendbyte(out, 'D'); /* action DELETE */
288-
pglogical_write_tuple(out, data, rel, oldtuple);
315+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN){
316+
MTM_LOG1("%d: pglogical_write_delete filtered", MyProcPid);
317+
return;
318+
}
319+
320+
if (DDLInProress) {
321+
MTM_LOG1("%d: pglogical_write_delete filtered DDLInProress", MyProcPid);
322+
return;
289323
}
324+
325+
MtmTransactionRecords += 1;
326+
pq_sendbyte(out, 'D'); /* action DELETE */
327+
pglogical_write_tuple(out, data, rel, oldtuple);
290328
}
291329

292330
/*
@@ -311,6 +349,16 @@ pglogical_write_tuple(StringInfo out, PGLogicalOutputData *data,
311349
int i;
312350
uint16 nliveatts = 0;
313351

352+
if (MtmTransactionSnapshot(MtmCurrentXid) == INVALID_CSN){
353+
MTM_LOG1("%d: pglogical_write_tuple filtered", MyProcPid);
354+
return;
355+
}
356+
357+
if (DDLInProress) {
358+
MTM_LOG1("%d: pglogical_write_tuple filtered DDLInProress", MyProcPid);
359+
return;
360+
}
361+
314362
desc = RelationGetDescr(rel);
315363

316364
pq_sendbyte(out, 'T'); /* sending TUPLE */

src/test/regress/serial_schedule

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ test: oidjoins
5050
test: type_sanity
5151
test: opr_sanity
5252
test: insert
53-
# test: insert_conflict # issue#17
53+
# test: insert_conflict
5454
test: create_function_1
5555
test: create_type
5656
test: create_table
@@ -108,7 +108,7 @@ test: privileges
108108
test: init_privs
109109
test: security_label
110110
test: collate
111-
# test: matview
111+
test: matview
112112
test: lock
113113
test: replica_identity
114114
# test: rowsecurity # issue#20

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy