From 9acfc15c73b0739513f7d80ffab637ecb078eb3a Mon Sep 17 00:00:00 2001 From: Brian Cloutier Date: Mon, 23 Jan 2017 16:27:02 +0300 Subject: [PATCH] Don't update shard statistics if all placements failed --- .../distributed/master/master_stage_protocol.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/master/master_stage_protocol.c b/src/backend/distributed/master/master_stage_protocol.c index 8ee677e61..c6e250210 100644 --- a/src/backend/distributed/master/master_stage_protocol.c +++ b/src/backend/distributed/master/master_stage_protocol.c @@ -267,7 +267,7 @@ master_append_table_to_shard(PG_FUNCTION_ARGS) MultiConnection *connection = GetPlacementConnection(FOR_DML, shardPlacement, NULL); PGresult *queryResult = NULL; - int executeCommand = 0; + int executeResult = 0; StringInfo workerAppendQuery = makeStringInfo(); appendStringInfo(workerAppendQuery, WORKER_APPEND_TABLE_TO_SHARD, @@ -275,17 +275,25 @@ master_append_table_to_shard(PG_FUNCTION_ARGS) quote_literal_cstr(sourceTableName), quote_literal_cstr(sourceNodeName), sourceNodePort); - executeCommand = ExecuteOptionalRemoteCommand(connection, workerAppendQuery->data, - &queryResult); + executeResult = ExecuteOptionalRemoteCommand(connection, workerAppendQuery->data, + &queryResult); PQclear(queryResult); ForgetResults(connection); - if (executeCommand != 0) + if (executeResult != 0) { MarkRemoteTransactionFailed(connection, false); } } + /* + * Abort if all placements failed, mark placements invalid if only some failed. By + * doing this UpdateShardStatistics never works on failed placements. + * + * (Pass false for using2PC arbitrarily, the parameter is not used) + */ + CheckForFailedPlacements(true, false); + /* update shard statistics and get new shard size */ newShardSize = UpdateShardStatistics(shardId);