1
+ /*----------------------------------------------------------------------------
2
+ *
3
+ * commit.c
4
+ * Replace ordinary commit with 3PC.
5
+ *
6
+ * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ *----------------------------------------------------------------------------
10
+ */
11
+
1
12
#include "postgres.h"
2
13
#include "multimaster.h"
3
14
#include "storage/proc.h"
4
15
#include "utils/guc.h"
5
16
#include "miscadmin.h"
6
17
#include "commands/dbcommands.h"
7
18
19
+ #include "logger.h"
20
+
8
21
static Oid MtmDatabaseId ;
9
22
static bool DmqSubscribed ;
10
23
static int sender_to_node [MTM_MAX_NODES ];
@@ -19,9 +32,6 @@ static bool GatherPrepares(MtmCurrentTrans* x, nodemask_t participantsMask,
19
32
static void GatherPrecommits (MtmCurrentTrans * x , nodemask_t participantsMask );
20
33
21
34
22
-
23
-
24
-
25
35
void
26
36
MtmXactCallback2 (XactEvent event , void * arg )
27
37
{
@@ -77,7 +87,7 @@ MtmPrePrepareTransaction(MtmCurrentTrans* x)
77
87
MtmDatabaseId = get_database_oid (MtmDatabaseName , false);
78
88
79
89
if (MtmDatabaseId != MyDatabaseId )
80
- MTM_ELOG (ERROR ,
90
+ mtm_log (ERROR ,
81
91
"Refusing to work. Multimaster configured to work with database '%s'" ,
82
92
MtmDatabaseName );
83
93
@@ -132,7 +142,8 @@ MtmTwoPhaseCommit(MtmCurrentTrans* x)
132
142
ret = PrepareTransactionBlock (gid );
133
143
if (!ret )
134
144
{
135
- MTM_ELOG (WARNING , "Failed to prepare transaction %s (%llu)" , gid , (long64 )x -> xid );
145
+ mtm_log (MtmTxFinish , "%s prepared" , gid );
146
+ mtm_log (WARNING , "Failed to prepare transaction %s" , gid );
136
147
return false;
137
148
}
138
149
CommitTransactionCommand ();
@@ -142,15 +153,18 @@ MtmTwoPhaseCommit(MtmCurrentTrans* x)
142
153
{
143
154
dmq_stream_unsubscribe (stream );
144
155
FinishPreparedTransaction (gid , false, false);
145
- MTM_ELOG (ERROR , "Failed to prepare transaction %s at node %d" ,
156
+ mtm_log (MtmTxFinish , "%s aborted" , gid );
157
+ mtm_log (ERROR , "Failed to prepare transaction %s at node %d" ,
146
158
gid , failed_at );
147
159
}
148
160
149
161
SetPreparedTransactionState (gid , MULTIMASTER_PRECOMMITTED );
162
+ mtm_log (MtmTxFinish , "%s precommittted" , gid );
150
163
GatherPrecommits (x , participantsMask );
151
164
152
165
StartTransactionCommand ();
153
166
FinishPreparedTransaction (gid , true, false);
167
+ mtm_log (MtmTxFinish , "%s committted" , gid );
154
168
155
169
dmq_stream_unsubscribe (stream );
156
170
@@ -173,17 +187,16 @@ GatherPrepares(MtmCurrentTrans* x, nodemask_t participantsMask, int *failed_at)
173
187
dmq_pop (& sender_id , & buffer , participantsMask );
174
188
msg = (MtmArbiterMessage * ) buffer .data ;
175
189
176
- // elog(LOG, "GatherPrepares: got %s from node%d", msg->gid, sender_to_node[sender_id]);
177
- // ereport(LOG,
178
- // (errmsg("GatherPrepares: got %s from node%d",
179
- // msg->gid, sender_to_node[sender_id]),
180
- // errhidestmt(true)));
181
-
182
190
Assert (msg -> node == sender_to_node [sender_id ]);
183
191
Assert (msg -> code == MSG_PREPARED || msg -> code == MSG_ABORTED );
184
192
Assert (msg -> dxid == x -> xid );
185
193
Assert (BIT_CHECK (participantsMask , sender_to_node [sender_id ] - 1 ));
186
194
195
+ mtm_log (MtmTxTrace ,
196
+ "GatherPrepares: got '%s' for %s from node%d" ,
197
+ msg -> code == MSG_PREPARED ? "ok" : "failed" ,
198
+ msg -> gid , sender_to_node [sender_id ]);
199
+
187
200
BIT_CLEAR (participantsMask , sender_to_node [sender_id ] - 1 );
188
201
189
202
if (msg -> code == MSG_ABORTED )
@@ -210,13 +223,15 @@ GatherPrecommits(MtmCurrentTrans* x, nodemask_t participantsMask)
210
223
dmq_pop (& sender_id , & buffer , participantsMask );
211
224
msg = (MtmArbiterMessage * ) buffer .data ;
212
225
213
- // elog(LOG, "GatherPrecommits: got %s from node%d", msg->gid, sender_to_node[sender_id]);
214
-
215
226
Assert (msg -> node == sender_to_node [sender_id ]);
216
227
Assert (msg -> code == MSG_PRECOMMITTED );
217
228
Assert (msg -> dxid == x -> xid );
218
229
Assert (BIT_CHECK (participantsMask , sender_to_node [sender_id ] - 1 ));
219
230
231
+ mtm_log (MtmTxTrace ,
232
+ "GatherPrecommits: got 'ok' for %s from node%d" ,
233
+ msg -> gid , sender_to_node [sender_id ]);
234
+
220
235
BIT_CLEAR (participantsMask , sender_to_node [sender_id ] - 1 );
221
236
}
222
237
}
0 commit comments