Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4b71181

Browse files
committed
volkswagen_mode
1 parent 5a72566 commit 4b71181

File tree

2 files changed

+30
-65
lines changed

2 files changed

+30
-65
lines changed

multimaster.c

Lines changed: 29 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ static TransactionManager MtmTM = {
179179
MtmGetTransactionStateSize,
180180
MtmSerializeTransactionState,
181181
MtmDeserializeTransactionState,
182-
// MtmInitializeSequence
183-
PgInitializeSequence
182+
MtmInitializeSequence
184183
};
185184

186185
char const* const MtmNodeStatusMnem[] =
@@ -197,7 +196,6 @@ char const* const MtmNodeStatusMnem[] =
197196
bool MtmDoReplication;
198197
char* MtmDatabaseName;
199198
char* MtmDatabaseUser;
200-
char* MtmUtilityStmt = NULL;
201199

202200
int MtmNodes;
203201
int MtmNodeId;
@@ -213,6 +211,7 @@ int MtmHeartbeatSendTimeout;
213211
int MtmHeartbeatRecvTimeout;
214212
bool MtmUseRaftable;
215213
bool MtmUseDtm;
214+
bool MtmVolksWagenMode;
216215

217216
static char* MtmConnStrs;
218217
static int MtmQueueSize;
@@ -235,9 +234,6 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
235234
ProcessUtilityContext context, ParamListInfo params,
236235
DestReceiver *dest, char *completionTag);
237236

238-
// static StringInfo MtmGUCBuffer;
239-
// static bool MtmGUCBufferAllocated = false;
240-
241237
/*
242238
* -------------------------------------------
243239
* Synchronize access to MTM structures.
@@ -370,8 +366,16 @@ MtmDeserializeTransactionState(void* ctx)
370366
static void
371367
MtmInitializeSequence(int64* start, int64* step)
372368
{
373-
*start = MtmNodeId;
374-
*step = MtmMaxNodes;
369+
if (MtmVolksWagenMode)
370+
{
371+
*start = 1;
372+
*step = 1;
373+
}
374+
else
375+
{
376+
*start = MtmNodeId;
377+
*step = MtmMaxNodes;
378+
}
375379
}
376380

377381

@@ -704,10 +708,6 @@ static const char* const isoLevelStr[] =
704708
static void
705709
MtmBeginTransaction(MtmCurrentTrans* x)
706710
{
707-
if (MtmUtilityStmt)
708-
pfree(MtmUtilityStmt);
709-
MtmUtilityStmt = NULL;
710-
711711
if (x->snapshot == INVALID_CSN) {
712712
TransactionId xmin = (Mtm->gcCount >= MtmGcPeriod) ? PgGetOldestXmin(NULL, false) : InvalidTransactionId; /* Get oldest xmin outside critical section */
713713

@@ -2218,6 +2218,19 @@ _PG_init(void)
22182218
NULL
22192219
);
22202220

2221+
DefineCustomBoolVariable(
2222+
"multimaster.volkswagen_mode",
2223+
"Pretend to be normal postgres. This means skip some NOTICE's and use local sequences. Default false.",
2224+
NULL,
2225+
&MtmVolksWagenMode,
2226+
false,
2227+
PGC_BACKEND,
2228+
0,
2229+
NULL,
2230+
NULL,
2231+
NULL
2232+
);
2233+
22212234
DefineCustomIntVariable(
22222235
"multimaster.workers",
22232236
"Number of multimaster executor workers per node",
@@ -3128,13 +3141,6 @@ static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError)
31283141
{
31293142
if (conns[i])
31303143
{
3131-
// if (MtmGUCBufferAllocated && !MtmRunUtilityStmt(conns[i], MtmGUCBuffer->data, &utility_errmsg) && !ignoreError)
3132-
// {
3133-
// errorMsg = "Failed to set GUC variables at node %d";
3134-
// elog(WARNING, "%s", utility_errmsg);
3135-
// failedNode = i;
3136-
// break;
3137-
// }
31383144
if (!MtmRunUtilityStmt(conns[i], "BEGIN TRANSACTION", &utility_errmsg) && !ignoreError)
31393145
{
31403146
errorMsg = "Failed to start transaction at node %d";
@@ -3188,38 +3194,6 @@ static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError)
31883194
}
31893195
}
31903196

3191-
// static void MtmGUCBufferAppend(const char *gucQueryString){
3192-
3193-
// if (!MtmGUCBufferAllocated)
3194-
// {
3195-
// MemoryContext oldcontext;
3196-
// oldcontext = MemoryContextSwitchTo(TopMemoryContext);
3197-
// MtmGUCBuffer = makeStringInfo();
3198-
// MemoryContextSwitchTo(oldcontext);
3199-
// MtmGUCBufferAllocated = true;
3200-
// appendStringInfoString(MtmGUCBuffer, "RESET SESSION AUTHORIZATION; reset all;");
3201-
// }
3202-
3203-
// appendStringInfoString(MtmGUCBuffer, gucQueryString);
3204-
// /* sometimes there is no ';' char at the end. */
3205-
// // appendStringInfoString(MtmGUCBuffer, ";");
3206-
// }
3207-
3208-
// static char * MtmGUCBufferGet(void){
3209-
// if (!MtmGUCBufferAllocated)
3210-
// MtmGUCBufferAppend("");
3211-
// return MtmGUCBuffer->data;
3212-
// }
3213-
3214-
// static void MtmGUCBufferClear(void)
3215-
// {
3216-
// if (MtmGUCBufferAllocated)
3217-
// {
3218-
// resetStringInfo(MtmGUCBuffer);
3219-
// MtmGUCBufferAppend("");
3220-
// }
3221-
// }
3222-
32233197
/*
32243198
* Genenerate global transaction identifier for two-pahse commit.
32253199
* It should be unique for all nodes
@@ -3237,11 +3211,12 @@ static bool MtmTwoPhaseCommit(MtmCurrentTrans* x)
32373211
{
32383212
/*
32393213
* XXX: this tx anyway goes to subscribers later, but without
3240-
* surrounding begin/commit. Probably there is more clever way
3241-
* to do that.
3214+
* surrounding begin/commit. Now it will be filtered out on receiver side.
3215+
* Probably there is more clever way to do that.
32423216
*/
32433217
x->isDistributed = false;
3244-
x->csn = NULL;
3218+
if (!MtmVolksWagenMode)
3219+
elog(NOTICE, "MTM: Transaction was not replicated as it accesed temporary relation");
32453220
return false;
32463221
}
32473222

@@ -3438,8 +3413,6 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
34383413
{
34393414
bool skipCommand = false;
34403415

3441-
// skipCommand = MyXactAccessedTempRel;
3442-
34433416
MTM_LOG3("%d: Process utility statement %s", MyProcPid, queryString);
34443417
switch (nodeTag(parsetree))
34453418
{
@@ -3492,19 +3465,10 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
34923465
skipCommand = true;
34933466
break;
34943467

3495-
// /* Do not skip following unless temp object was accessed */
3496-
// case T_CreateTableAsStmt:
3497-
// case T_CreateStmt:
3498-
// case T_ViewStmt:
3499-
// case T_IndexStmt:
3500-
// case T_DropStmt:
3501-
// break;
3502-
35033468
/* Save GUC context for consequent DDL execution */
35043469
case T_DiscardStmt:
35053470
{
35063471
DiscardStmt *stmt = (DiscardStmt *) parsetree;
3507-
skipCommand = stmt->target == DISCARD_TEMP; // XXX
35083472

35093473
if (!IsTransactionBlock())
35103474
{

tests/reinit-mm.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ do
5555
multimaster.heartbeat_recv_timeout = 1000
5656
multimaster.heartbeat_send_timeout = 250
5757
multimaster.twopc_min_timeout = 400000
58+
multimaster.volkswagen_mode = 1
5859
5960
multimaster.conn_strings = '$conn_str'
6061
multimaster.node_id = $i

0 commit comments

Comments
 (0)