From 2e607c5ad56eb5a886cfc36378966bb0c8d46821 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Mon, 16 Sep 2019 09:24:08 +0900 Subject: [PATCH] Fix occasional query hang while processing DEALLOCATE. When DEALLOCATE tries to remove a named statement, it inherits where_to_send map of the named statement in where_to_send_deallocate(). However it forgot to copy the load balance node id in the query context of the named statement. This made sending query to backend not happen: if the target node id is different from query_context->load_balance_node_id nor primary node id, pool_virtual_master_db_node_id (it is called as MASTER_NODE_ID) returns primary node id, and pool_send_and_wait(MASTER_NODE_ID) ignores the request because VALID_BACKEND returns false in this case (MASTER_NODE_ID = primary node id is not in the where_to_send map). As a result, following check_error() waits for response from backend in vain. Fix is, let where_to_send_deallocate() copy load balance node id from the query context of the previous named statement. Per bug 546. --- src/context/pool_query_context.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/context/pool_query_context.c b/src/context/pool_query_context.c index 082ff5ac5..6fe6576a9 100644 --- a/src/context/pool_query_context.c +++ b/src/context/pool_query_context.c @@ -1491,10 +1491,13 @@ where_to_send_deallocate(POOL_QUERY_CONTEXT * query_context, Node *node) /* Inherit same map from PREPARE or PARSE */ pool_copy_prep_where(msg->query_context->where_to_send, query_context->where_to_send); - return; + + /* copy load balance node id as well */ + query_context->load_balance_node_id = msg->query_context->load_balance_node_id; } - /* prepared statement was not found */ - pool_setall_node_to_be_sent(query_context); + else + /* prepared statement was not found */ + pool_setall_node_to_be_sent(query_context); } } -- 2.39.5