Merge pull request #1661 from citusdata/fix_crash

Trim trailing characters & copy the message returned by `PQerrorMessage()`
pull/1580/head
Önder Kalacı 2017-09-22 23:10:56 +03:00 committed by GitHub
commit fb70400b61
10 changed files with 52 additions and 47 deletions

View File

@ -1205,17 +1205,8 @@ ReportCopyError(MultiConnection *connection, PGresult *result)
} }
else else
{ {
/* probably a connection problem, get the message from the connection */ /* trim the trailing characters */
char *lastNewlineIndex = NULL; remoteMessage = pchomp(PQerrorMessage(connection->pgConn));
remoteMessage = PQerrorMessage(connection->pgConn);
lastNewlineIndex = strrchr(remoteMessage, '\n');
/* trim trailing newline, if any */
if (lastNewlineIndex != NULL)
{
*lastNewlineIndex = '\0';
}
ereport(ERROR, (errcode(ERRCODE_IO_ERROR), ereport(ERROR, (errcode(ERRCODE_IO_ERROR),
errmsg("failed to complete COPY on %s:%d", connection->hostname, errmsg("failed to complete COPY on %s:%d", connection->hostname,

View File

@ -18,6 +18,7 @@
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "storage/latch.h" #include "storage/latch.h"
#include "utils/palloc.h"
/* GUC, determining whether statements sent to remote nodes are logged */ /* GUC, determining whether statements sent to remote nodes are logged */
@ -191,7 +192,7 @@ ReportConnectionError(MultiConnection *connection, int elevel)
int nodePort = connection->port; int nodePort = connection->port;
ereport(elevel, (errmsg("connection error: %s:%d", nodeName, nodePort), ereport(elevel, (errmsg("connection error: %s:%d", nodeName, nodePort),
errdetail("%s", PQerrorMessage(connection->pgConn)))); errdetail("%s", pchomp(PQerrorMessage(connection->pgConn)))));
} }
@ -229,16 +230,7 @@ ReportResultError(MultiConnection *connection, PGresult *result, int elevel)
*/ */
if (messagePrimary == NULL) if (messagePrimary == NULL)
{ {
char *lastNewlineIndex = NULL; messagePrimary = pchomp(PQerrorMessage(connection->pgConn));
messagePrimary = PQerrorMessage(connection->pgConn);
lastNewlineIndex = strrchr(messagePrimary, '\n');
/* trim trailing newline, if any */
if (lastNewlineIndex != NULL)
{
*lastNewlineIndex = '\0';
}
} }
ereport(elevel, (errcode(sqlState), errmsg("%s", messagePrimary), ereport(elevel, (errcode(sqlState), errmsg("%s", messagePrimary),
@ -257,6 +249,28 @@ ReportResultError(MultiConnection *connection, PGresult *result, int elevel)
} }
/* *INDENT-OFF* */
#if (PG_VERSION_NUM < 100000)
/*
* Make copy of string with all trailing newline characters removed.
*/
char *
pchomp(const char *in)
{
size_t n;
n = strlen(in);
while (n > 0 && in[n - 1] == '\n')
n--;
return pnstrdup(in, n);
}
#endif
/* *INDENT-ON* */
/* /*
* LogRemoteCommand logs commands send to remote nodes if * LogRemoteCommand logs commands send to remote nodes if
* citus.log_remote_commands wants us to do so. * citus.log_remote_commands wants us to do so.

View File

@ -305,7 +305,7 @@ MultiClientSendQuery(int32 connectionId, const char *query)
querySent = PQsendQuery(connection->pgConn, query); querySent = PQsendQuery(connection->pgConn, query);
if (querySent == 0) if (querySent == 0)
{ {
char *errorMessage = PQerrorMessage(connection->pgConn); char *errorMessage = pchomp(PQerrorMessage(connection->pgConn));
ereport(WARNING, (errmsg("could not send remote query \"%s\"", query), ereport(WARNING, (errmsg("could not send remote query \"%s\"", query),
errdetail("Client error: %s", errorMessage))); errdetail("Client error: %s", errorMessage)));

View File

@ -444,7 +444,12 @@ StoreErrorMessage(MultiConnection *connection, StringInfo queryResultString)
char *errorMessage = PQerrorMessage(connection->pgConn); char *errorMessage = PQerrorMessage(connection->pgConn);
if (errorMessage != NULL) if (errorMessage != NULL)
{ {
char *firstNewlineIndex = strchr(errorMessage, '\n'); char *firstNewlineIndex = NULL;
/* copy the error message to a writable memory */
errorMessage = pnstrdup(errorMessage, strlen(errorMessage));
firstNewlineIndex = strchr(errorMessage, '\n');
/* trim the error message at the line break */ /* trim the error message at the line break */
if (firstNewlineIndex != NULL) if (firstNewlineIndex != NULL)

View File

@ -112,6 +112,9 @@ get_colocated_shard_array(PG_FUNCTION_ARGS)
Oid arrayTypeId = OIDOID; Oid arrayTypeId = OIDOID;
int colocatedShardIndex = 0; int colocatedShardIndex = 0;
/* sort to get consistent output */
colocatedShardList = SortList(colocatedShardList, CompareShardIntervalsById);
foreach(colocatedShardCell, colocatedShardList) foreach(colocatedShardCell, colocatedShardList)
{ {
ShardInterval *colocatedShardInterval = (ShardInterval *) lfirst( ShardInterval *colocatedShardInterval = (ShardInterval *) lfirst(

View File

@ -33,6 +33,7 @@ extern bool SqlStateMatchesCategory(char *sqlStateString, int category);
extern void ReportConnectionError(MultiConnection *connection, int elevel); extern void ReportConnectionError(MultiConnection *connection, int elevel);
extern void ReportResultError(MultiConnection *connection, struct pg_result *result, extern void ReportResultError(MultiConnection *connection, struct pg_result *result,
int elevel); int elevel);
extern char * pchomp(const char *in);
extern void LogRemoteCommand(MultiConnection *connection, const char *command); extern void LogRemoteCommand(MultiConnection *connection, const char *command);
/* wrappers around libpq functions, with command logging support */ /* wrappers around libpq functions, with command logging support */

View File

@ -266,39 +266,39 @@ SELECT shards_colocated(1300000, 1300020);
(1 row) (1 row)
-- check co-located table list -- check co-located table list
SELECT UNNEST(get_colocated_table_array('table1_group1'))::regclass; SELECT UNNEST(get_colocated_table_array('table1_group1'))::regclass ORDER BY 1;
unnest unnest
--------------- ---------------
table2_group1
table1_group1 table1_group1
table2_group1
(2 rows) (2 rows)
SELECT UNNEST(get_colocated_table_array('table5_groupX'))::regclass; SELECT UNNEST(get_colocated_table_array('table5_groupX'))::regclass ORDER BY 1;
unnest unnest
--------------- ---------------
table5_groupx table5_groupx
(1 row) (1 row)
SELECT UNNEST(get_colocated_table_array('table6_append'))::regclass; SELECT UNNEST(get_colocated_table_array('table6_append'))::regclass ORDER BY 1;
unnest unnest
--------------- ---------------
table6_append table6_append
(1 row) (1 row)
-- check co-located shard list -- check co-located shard list
SELECT get_colocated_shard_array(1300000); SELECT get_colocated_shard_array(1300000) ORDER BY 1;
get_colocated_shard_array get_colocated_shard_array
--------------------------- ---------------------------
{1300004,1300000} {1300000,1300004}
(1 row) (1 row)
SELECT get_colocated_shard_array(1300016); SELECT get_colocated_shard_array(1300016) ORDER BY 1;
get_colocated_shard_array get_colocated_shard_array
--------------------------- ---------------------------
{1300016} {1300016}
(1 row) (1 row)
SELECT get_colocated_shard_array(1300020); SELECT get_colocated_shard_array(1300020) ORDER BY 1;
get_colocated_shard_array get_colocated_shard_array
--------------------------- ---------------------------
{1300020} {1300020}

View File

@ -2152,7 +2152,6 @@ BEGIN;
INSERT INTO failure_test VALUES (1, 1); INSERT INTO failure_test VALUES (1, 1);
WARNING: connection error: localhost:57638 WARNING: connection error: localhost:57638
DETAIL: no connection to the server DETAIL: no connection to the server
SELECT shardid, shardstate, nodename, nodeport FROM pg_dist_shard_placement SELECT shardid, shardstate, nodename, nodeport FROM pg_dist_shard_placement
WHERE shardid IN ( WHERE shardid IN (
SELECT shardid FROM pg_dist_shard SELECT shardid FROM pg_dist_shard
@ -2171,7 +2170,6 @@ ROLLBACK;
INSERT INTO failure_test VALUES (2, 1); INSERT INTO failure_test VALUES (2, 1);
WARNING: connection error: localhost:57638 WARNING: connection error: localhost:57638
DETAIL: no connection to the server DETAIL: no connection to the server
SELECT shardid, shardstate, nodename, nodeport FROM pg_dist_shard_placement SELECT shardid, shardstate, nodename, nodeport FROM pg_dist_shard_placement
WHERE shardid IN ( WHERE shardid IN (
SELECT shardid FROM pg_dist_shard SELECT shardid FROM pg_dist_shard

View File

@ -881,19 +881,15 @@ ALTER USER test_user WITH nologin;
COPY numbers_hash FROM STDIN WITH (FORMAT 'csv'); COPY numbers_hash FROM STDIN WITH (FORMAT 'csv');
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash, line 1: "1,1" CONTEXT: COPY numbers_hash, line 1: "1,1"
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash, line 2: "2,2" CONTEXT: COPY numbers_hash, line 2: "2,2"
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash, line 3: "3,3" CONTEXT: COPY numbers_hash, line 3: "3,3"
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash, line 6: "6,6" CONTEXT: COPY numbers_hash, line 6: "6,6"
-- verify shards in the first worker as marked invalid -- verify shards in the first worker as marked invalid
SELECT shardid, shardstate, nodename, nodeport SELECT shardid, shardstate, nodename, nodeport
@ -915,7 +911,6 @@ SELECT shardid, shardstate, nodename, nodeport
COPY numbers_reference FROM STDIN WITH (FORMAT 'csv'); COPY numbers_reference FROM STDIN WITH (FORMAT 'csv');
ERROR: connection error: localhost:57637 ERROR: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_reference, line 1: "3,1" CONTEXT: COPY numbers_reference, line 1: "3,1"
-- verify shards for reference table are still valid -- verify shards for reference table are still valid
SELECT shardid, shardstate, nodename, nodeport SELECT shardid, shardstate, nodename, nodeport
@ -933,11 +928,9 @@ SELECT shardid, shardstate, nodename, nodeport
COPY numbers_hash_other FROM STDIN WITH (FORMAT 'csv'); COPY numbers_hash_other FROM STDIN WITH (FORMAT 'csv');
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash_other, line 1: "1,1" CONTEXT: COPY numbers_hash_other, line 1: "1,1"
WARNING: connection error: localhost:57637 WARNING: connection error: localhost:57637
DETAIL: FATAL: role "test_user" is not permitted to log in DETAIL: FATAL: role "test_user" is not permitted to log in
CONTEXT: COPY numbers_hash_other, line 1: "1,1" CONTEXT: COPY numbers_hash_other, line 1: "1,1"
ERROR: could not connect to any active placements ERROR: could not connect to any active placements
CONTEXT: COPY numbers_hash_other, line 1: "1,1" CONTEXT: COPY numbers_hash_other, line 1: "1,1"

View File

@ -134,14 +134,14 @@ SELECT shards_colocated(1300000, 1300016);
SELECT shards_colocated(1300000, 1300020); SELECT shards_colocated(1300000, 1300020);
-- check co-located table list -- check co-located table list
SELECT UNNEST(get_colocated_table_array('table1_group1'))::regclass; SELECT UNNEST(get_colocated_table_array('table1_group1'))::regclass ORDER BY 1;
SELECT UNNEST(get_colocated_table_array('table5_groupX'))::regclass; SELECT UNNEST(get_colocated_table_array('table5_groupX'))::regclass ORDER BY 1;
SELECT UNNEST(get_colocated_table_array('table6_append'))::regclass; SELECT UNNEST(get_colocated_table_array('table6_append'))::regclass ORDER BY 1;
-- check co-located shard list -- check co-located shard list
SELECT get_colocated_shard_array(1300000); SELECT get_colocated_shard_array(1300000) ORDER BY 1;
SELECT get_colocated_shard_array(1300016); SELECT get_colocated_shard_array(1300016) ORDER BY 1;
SELECT get_colocated_shard_array(1300020); SELECT get_colocated_shard_array(1300020) ORDER BY 1;
-- check FindShardIntervalIndex function -- check FindShardIntervalIndex function
SELECT find_shard_interval_index(1300000); SELECT find_shard_interval_index(1300000);