pgpool2.git / summary / log / commit / refs
commit 9c54a289313fa902fd7b9cf2e4409a655e2f44bd
Author: Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date: Fri Sep 07 09:08:16 2007 +0000
Improve performance.
- Reuse parser memory space in free_parser().
- Check node type before comparing with "show pool_status()".
parser/parser.c | 5 +++--
parser/pool_memory.c | 33 +++++++++++++++++++++++++++++----
parser/pool_memory.h | 2 +-
pool_process_query.c | 13 ++++++++-----
4 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/parser/parser.c b/parser/parser.c
index 096901715..f777abdbe 100644
--- a/parser/parser.c
+++ b/parser/parser.c
@@ -42,7 +42,8 @@ raw_parser(const char *str)
{
int yyresult;
- pool_memory = pool_memory_create();
+ if (pool_memory == NULL)
+ pool_memory = pool_memory_create();
parsetree = NIL; /* in case grammar forgets to set it */
have_lookahead = false;
@@ -107,6 +108,6 @@ sql_yylex(void)
void free_parser(void)
{
- pool_memory_delete(pool_memory);
+ pool_memory_delete(pool_memory, 1);
}
diff --git a/parser/pool_memory.c b/parser/pool_memory.c
index 2ece55de8..9039c0fc1 100644
--- a/parser/pool_memory.c
+++ b/parser/pool_memory.c
@@ -32,7 +32,7 @@
#define ALIGN 3
#define POOL_HEADER_SIZE (sizeof (POOL_CHUNK_HEADER))
-POOL_MEMORY_POOL *pool_memory;
+POOL_MEMORY_POOL *pool_memory = NULL;
static int get_free_index(unsigned int size);
@@ -248,11 +248,17 @@ POOL_MEMORY_POOL *pool_memory_create(void)
* pool_memory_delete:
* Frees all memory which is allocated in the memory pool.
*/
-void pool_memory_delete(POOL_MEMORY_POOL *pool_memory)
+void pool_memory_delete(POOL_MEMORY_POOL *pool_memory, int reuse)
{
POOL_BLOCK *block, *ptr;
- for (block = pool_memory->blocks; block;)
+ /* Reuse the first memory block */
+ if (reuse && pool_memory->blocks)
+ block = pool_memory->blocks->next;
+ else
+ block = pool_memory->blocks;
+
+ while (block)
{
ptr = block->next;
free(block->block);
@@ -268,7 +274,26 @@ void pool_memory_delete(POOL_MEMORY_POOL *pool_memory)
block = ptr;
}
- free(pool_memory);
+ if (reuse)
+ {
+ int i;
+
+ if (pool_memory->blocks)
+ {
+ pool_memory->blocks->allocsize = 0;
+ pool_memory->blocks->freepoint = pool_memory->blocks->block;
+ }
+ pool_memory->largeblocks = NULL;
+ for (i = 0; i < SLOT_NUM; i++)
+ {
+ pool_memory->freelist[i] = NULL;
+ }
+ }
+ else
+ {
+ free(pool_memory);
+ pool_memory = NULL;
+ }
}
/*
diff --git a/parser/pool_memory.h b/parser/pool_memory.h
index 7f1755c7d..3ef73663c 100644
--- a/parser/pool_memory.h
+++ b/parser/pool_memory.h
@@ -58,7 +58,7 @@ extern void *pool_memory_alloc(POOL_MEMORY_POOL *pool, unsigned int size);
extern void pool_memory_free(POOL_MEMORY_POOL *pool, void *ptr);
extern void *pool_memory_realloc(POOL_MEMORY_POOL *pool, void *ptr, unsigned int size);
extern POOL_MEMORY_POOL *pool_memory_create(void);
-extern void pool_memory_delete(POOL_MEMORY_POOL *pool_memory);
+extern void pool_memory_delete(POOL_MEMORY_POOL *pool_memory, int reuse);
extern char *pool_memory_strdup(POOL_MEMORY_POOL *pool_memory, const char *string);
extern void *pool_memory_alloc_zero(POOL_MEMORY_POOL *pool_memory, unsigned int size);
diff --git a/pool_process_query.c b/pool_process_query.c
index bfe6b5483..43028c4de 100644
--- a/pool_process_query.c
+++ b/pool_process_query.c
@@ -572,7 +572,7 @@ POOL_STATUS pool_parallel_exec(POOL_CONNECTION *frontend,
}
/* process status reporting? */
- if (strncasecmp(sq, string, strlen(sq)) == 0)
+ if (IsA(node, VariableShowStmt) && strncasecmp(sq, string, strlen(sq)) == 0)
{
pool_debug("process reporting");
process_reporting(frontend, backend);
@@ -939,7 +939,7 @@ static POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend,
}
/* process status reporting? */
- if (strncasecmp(sq, string, strlen(sq)) == 0)
+ if (IsA(node, VariableShowStmt) && strncasecmp(sq, string, strlen(sq)) == 0)
{
StartupPacket *sp;
char psbuf[1024];
@@ -1227,9 +1227,11 @@ static POOL_STATUS Execute(POOL_CONNECTION *frontend,
/* load balance trick */
if (portal)
{
+ POOL_MEMORY_POOL *pool_mem;
+
p_stmt = (PrepareStmt *)portal->stmt;
- pool_memory = pool_memory_create();
+ pool_mem = pool_memory_create();
string1 = nodeToString(p_stmt->query);
if (load_balance_enabled(backend, (Node *)p_stmt->query, string1))
@@ -1254,7 +1256,7 @@ static POOL_STATUS Execute(POOL_CONNECTION *frontend,
*/
commit = is_commit_query((Node *)p_stmt->query);
- pool_memory_delete(pool_memory);
+ pool_memory_delete(pool_mem, 0);
}
else if (MASTER_SLAVE)
{
@@ -3259,6 +3261,7 @@ static void process_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *b
/* data row */
for (i=0;i<nrows;i++)
{
+ pool_debug("XXX %d", i);
pool_write(frontend, "D", 1);
len = sizeof(len) + sizeof(nrows);
len += sizeof(int) + strlen(status[i].name);
@@ -4744,7 +4747,7 @@ static void reset_prepared_list(PreparedStatementList *p)
free(p->portal_list[i]->portal_name);
free(p->portal_list[i]);
}
- pool_memory_delete(prepare_memory_context);
+ pool_memory_delete(prepare_memory_context, 0);
prepare_memory_context = NULL;
free(unnamed_statement);
unnamed_portal = NULL;
[parent: 6064f3bbdf90]