Fix possible crash by using unset pool_memory.
authorToshihiro Kitagawa <kitagawa at sraoss.co.jp>
Mon, 2 Aug 2010 09:13:26 +0000 (09:13 +0000)
committerToshihiro Kitagawa <kitagawa at sraoss.co.jp>
Mon, 2 Aug 2010 09:13:26 +0000 (09:13 +0000)
pool_process_query.c
pool_proto_modules.c
pool_query_context.c

index 1ffceb11ac8dc75a6f78775188000cfc6ed1b452..d54e6e20a47bf7a797a70143d4b37cd270511c4c 100644 (file)
@@ -1231,6 +1231,12 @@ POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend,
        if (mismatch_ntuples)
        {
                char msgbuf[128];
+               POOL_MEMORY_POOL *old_context = pool_memory;
+
+               if (session_context->query_context)
+                       pool_memory = session_context->query_context->memory_context;
+               else
+                       pool_memory = session_context->memory_context;
 
                String *msg = init_string("pgpool detected difference of the number of inserted, updated or deleted tuples. Possible last query was: \"");
                string_append_char(msg, query_string_buffer);
@@ -1251,6 +1257,8 @@ POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend,
                pool_log("%s", msg->data);
                free_string(msg);
 
+               pool_memory = old_context;
+
                /*
                 * Remember that we have different number of UPDATE/DELETE
                 * affcted tuples in backends.
@@ -3240,8 +3248,22 @@ bool is_partition_table(POOL_CONNECTION_POOL *backend, Node *node)
  */
 static char *get_insert_command_table_name(InsertStmt *node)
 {
+       POOL_SESSION_CONTEXT *session_context;
+       POOL_MEMORY_POOL *old_context = pool_memory;
+
+       session_context = pool_get_session_context();
+       if (!session_context)
+               return NULL;
+
+       if (session_context->query_context)
+               pool_memory = session_context->query_context->memory_context;
+       else
+               pool_memory = session_context->memory_context;
+
        char *table = nodeToString(node->relation);
 
+       pool_memory = old_context;
+
        pool_debug("get_insert_command_table_name: extracted table name: %s", table);
        return table;
 }
index cca80c9cb3068be9a0b1571e981d6f52e3893117..78579d33426f2e9fd2e9435c997a7455f74ba363 100644 (file)
@@ -1231,8 +1231,16 @@ POOL_STATUS ReadyForQuery(POOL_CONNECTION *frontend,
                                                                                         MASTER_NODE_ID, &number_of_nodes);
                        if (victim_nodes)
                        {
-                               String *msg = init_string("ReadyForQuery: Degenerate backends:");
                                int i;
+                               String *msg;
+                               POOL_MEMORY_POOL *old_context = pool_memory;
+
+                               if (session_context->query_context)
+                                       pool_memory = session_context->query_context->memory_context;
+                               else
+                                       pool_memory = session_context->memory_context;
+
+                               msg = init_string("ReadyForQuery: Degenerate backends:");
 
                                for (i=0;i<number_of_nodes;i++)
                                {
@@ -1252,6 +1260,8 @@ POOL_STATUS ReadyForQuery(POOL_CONNECTION *frontend,
                                pool_log("%s", msg->data);
                                free_string(msg);
 
+                               pool_memory = old_context;
+
                                degenerate_backend_set(victim_nodes, number_of_nodes);
                                child_exit(1);
                        }
@@ -2470,6 +2480,13 @@ static int check_errors(POOL_CONNECTION_POOL *backend, int backend_id)
 
 static void generate_error_message(char *prefix, int specific_error, char *query)
 {
+       POOL_SESSION_CONTEXT *session_context;
+       POOL_MEMORY_POOL *old_context = pool_memory;
+
+       session_context = pool_get_session_context();
+       if (!session_context)
+               return;
+
        static char *error_messages[] = {
                "received deadlock error message from master node. query: %s",
                "received serialization failure error message from master node. query: %s",
@@ -2487,10 +2504,17 @@ static void generate_error_message(char *prefix, int specific_error, char *query
 
        specific_error--;
 
+       if (session_context->query_context)
+               pool_memory = session_context->query_context->memory_context;
+       else
+               pool_memory = session_context->memory_context;
+
        msg = init_string(prefix);
        string_append_char(msg, error_messages[specific_error]);
        pool_error(msg->data, query);
        free_string(msg);
+
+       pool_memory = old_context;
 }
 
 /*
index 3fcf890e9bb9f3968b789e6b7c06a3cfe9613309..4865e07378b4c10ac8a984884d61d1e555768679 100644 (file)
@@ -314,8 +314,12 @@ void pool_where_to_send(POOL_QUERY_CONTEXT *query_context, char *query, Node *no
                if (!strcmp(pool_config->master_slave_sub_mode, MODE_STREAMREP))
                {
                        POOL_DEST dest;
+                       POOL_MEMORY_POOL *old_context = pool_memory;
 
+                       pool_memory = query_context->memory_context;
                        dest = send_to_where(node, query);
+                       pool_memory = old_context;
+
                        pool_debug("send_to_where: %d query: %s", dest, query);
 
                        /* Should be sent to primary only? */