Fix temp table trace modules.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Thu, 15 Aug 2019 00:32:17 +0000 (09:32 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Thu, 15 Aug 2019 00:32:17 +0000 (09:32 +0900)
CLOBBER_FREED_MEMORY revealed bug with usage of list package.

src/context/pool_session_context.c
src/include/context/pool_session_context.h

index 752bd4d52a23129f4b8cd6ebe9e5689348941db0..a73d83fd15eba467e08dc43cce5e857fd050c883 100644 (file)
@@ -1965,6 +1965,9 @@ pool_temp_tables_commit_pending(void)
 
        old_context = MemoryContextSwitchTo(session_context->memory_context);
 
+       pool_temp_tables_dump();
+
+Retry:
        foreach(cell, session_context->temp_tables)
        {
                POOL_TEMP_TABLE * table = (POOL_TEMP_TABLE *)lfirst(cell);
@@ -1981,6 +1984,8 @@ pool_temp_tables_commit_pending(void)
                        ereport(DEBUG1,
                                        (errmsg("pool_temp_tables_commit_pending: remove: %s", table->tablename)));
                        session_context->temp_tables = list_delete_ptr(session_context->temp_tables, table);
+                       pool_temp_tables_dump();
+                       goto Retry;
                }
        }
 
@@ -2003,6 +2008,9 @@ pool_temp_tables_remove_pending(void)
 
        old_context = MemoryContextSwitchTo(session_context->memory_context);
 
+       pool_temp_tables_dump();
+
+Retry:
        foreach(cell, session_context->temp_tables)
        {
                POOL_TEMP_TABLE * table = (POOL_TEMP_TABLE *)lfirst(cell);
@@ -2013,8 +2021,30 @@ pool_temp_tables_remove_pending(void)
                                        (errmsg("pool_temp_tables_remove_pending: remove: %s", table->tablename)));
 
                        session_context->temp_tables = list_delete_ptr(session_context->temp_tables, table);
+                       pool_temp_tables_dump();
+                       goto Retry;
                }
        }
 
        MemoryContextSwitchTo(old_context);
 }
+
+void
+pool_temp_tables_dump(void)
+{
+#ifdef TEMP_TABLES_DEBUG
+       ListCell   *cell;
+
+       if (!session_context)
+               ereport(ERROR,
+                               (errmsg("pool_temp_tables_dump: session context is not initialized")));
+
+       foreach(cell, session_context->temp_tables)
+       {
+               POOL_TEMP_TABLE * table = (POOL_TEMP_TABLE *)lfirst(cell);
+               ereport(DEBUG1,
+                               (errmsg("pool_temp_tables_dump: table %s state: %d",
+                                               table->tablename, table->state)));
+       }
+#endif
+}
index e0cc2617dc3e92621eb3ea949e990d3b10db30db..1d03e48844b19af2b6ba092bd446c5a83f388055 100644 (file)
@@ -363,6 +363,7 @@ extern POOL_TEMP_TABLE * pool_temp_tables_find(char * tablename);
 extern void pool_temp_tables_delete(char * tablename, POOL_TEMP_TABLE_STATE state);
 extern void    pool_temp_tables_commit_pending(void);
 extern void    pool_temp_tables_remove_pending(void);
+extern void    pool_temp_tables_dump(void);
 
 #ifdef NOT_USED
 extern void pool_set_preferred_master_node_id(int node_id);