8000 do not replicate temp tables; return fixed error message · postgrespro/postgres_cluster@810ca68 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

< 8000 /qbsearch-input>
Appearance settings

Commit 810ca68

Browse files
committed
do not replicate temp tables; return fixed error message
1 parent dd8675f commit 810ca68

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

contrib/mmts/multimaster.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ static void MtmAddSubtransactions(MtmTransState* ts, TransactionId *subxids, int
127127
static void MtmShmemStartup(void);
128128

129129
static BgwPool* MtmPoolConstructor(void);
130-
static bool MtmRunUtilityStmt(PGconn* conn, char const* sql);
130+
static bool MtmRunUtilityStmt(PGconn* conn, char const* sql, char **errmsg);
131131
static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError);
132132

133133
MtmState* Mtm;
@@ -1793,14 +1793,24 @@ mtm_get_cluster_state(PG_FUNCTION_ARGS)
17931793
/*
17941794
* Execute statement with specified parameters and check its result
17951795
*/
1796-
static bool MtmRunUtilityStmt(PGconn* conn, char const* sql)
1796+
static bool MtmRunUtilityStmt(PGconn* conn, char const* sql, char **errmsg)
17971797
{
17981798
PGresult *result = PQexec(conn, sql);
17991799
int status = PQresultStatus(result);
1800+
char *errstr;
1801+
18001802
bool ret = status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK;
1801-
if (!ret) {
1802-
elog(WARNING, "Command '%s' failed with status %d", sql, status);
1803+
1804+
if (!ret) {
1805+
char *errstr = PQresultErrorMessage(result);
1806+
int errlen = strlen(errstr);
1807+
1808+
*errmsg = palloc0(errlen);
1809+
1810+
/* Strip "ERROR:\t" from beginning and "\n" from end of error string */
1811+
strncpy(*errmsg, errstr + 7, errlen - 1 - 7);
18031812
}
1813+
18041814
PQclear(result);
18051815
return ret;
18061816
}
@@ -1814,6 +1824,7 @@ static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError)
18141824
int failedNode = -1;
18151825
char const* errorMsg = NULL;
18161826
PGconn **conns = palloc0(sizeof(PGconn*)*MtmNodes);
1827+
char* utility_errmsg;
18171828

18181829
while (conn_str < conn_str_end)
18191830
{
@@ -1849,15 +1860,18 @@ static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError)
18491860
{
18501861
if (conns[i])
18511862
{
1852-
if (!MtmRunUtilityStmt(conns[i], "BEGIN TRANSACTION") && !ignoreError)
1863+
if (!MtmRunUtilityStmt(conns[i], "BEGIN TRANSACTION", &utility_errmsg) && !ignoreError)
18531864
{
18541865
errorMsg = "Failed to start transaction at node %d";
18551866
failedNode = i;
18561867
break;
18571868
}
1858-
if (!MtmRunUtilityStmt(conns[i], sql) && !ignoreError)
1869+
if (!MtmRunUtilityStmt(conns[i], sql, &utility_errmsg) && !ignoreError)
18591870
{
1860-
errorMsg = "Failed to run command at node %d";
1871+
// errorMsg = "Failed to run command at node %d";
1872+
// XXX: add check for our node
1873+
errorMsg = utility_errmsg;
1874+
18611875
failedNode = i;
18621876
break;
18631877
}
@@ -1869,13 +1883,13 @@ static void MtmBroadcastUtilityStmt(char const* sql, bool ignoreError)
18691883
{
18701884
if (conns[i])
18711885
{
1872-
MtmRunUtilityStmt(conns[i], "ROLLBACK TRANSACTION");
1886+
MtmRunUtilityStmt(conns[i], "ROLLBACK TRANSACTION", &utility_errmsg);
18731887
}
18741888
}
18751889
} else {
18761890
for (i = 0; i < MtmNodes; i++)
18771891
{
1878-
if (conns[i] && !MtmRunUtilityStmt(conns[i], "COMMIT TRANSACTION") && !ignoreError)
1892+
if (conns[i] && !MtmRunUtilityStmt(conns[i], "COMMIT TRANSACTION", &utility_errmsg) && !ignoreError)
18791893
{
18801894
errorMsg = "Commit failed at node %d";
18811895
failedNode = i;
@@ -1958,7 +1972,7 @@ static bool MtmTwoPhaseCommit(MtmCurrentTrans* x)
19581972
if (!x->isReplicated && (x->isDistributed && x->containsDML)) {
19591973
MtmGenerateGid(x->gid);
19601974
if (!x->isTransactionBlock) {
1961-
elog(WARNING, "Start transaction block for %s", x->gid);
1975+
/* elog(WARNING, "Start transaction block for %s", x->gid); */
19621976
BeginTransactionBlock();
19631977
x->isTransactionBlock = true;
19641978
CommitTransactionCommand();
@@ -2054,6 +2068,13 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
20542068
case T_ReindexStmt:
20552069
skipCommand = true;
20562070
break;
2071+
case T_CreateStmt:
2072+
{
2073+
/* Do not replicate temp tables */
2074+
CreateStmt *stmt = (CreateStmt *) parsetree;
2075+
skipCommand = stmt->relation->relpersistence == RELPERSISTENCE_TEMP;
2076+
}
2077+
break;
20572078
default:
20582079
skipCommand = false;
20592080
break;

0 commit comments

Comments
 (0)
0