pgpool2.git / summary / log / commit / refs
commit 70f383da97d22529c8af994f166a9ef34e083761
Author: Tatsuo Ishii <ishii at sraoss.co.jp>
Date: Thu Aug 05 03:07:04 2010 +0000
Fix ConnectionInfo data on shem.
Add new API to ConnectionInfo pool_coninfo_pid().
Add call to pool_init_process_context to pcp_child.
Add backend pid to pcp_proc_info.
doc/pgpool-ja.html | 5 +--
pcp/pcp.c | 4 +++
pcp/pcp_proc_info.c | 5 +--
pcp_child.c | 91 ++++++++++++++++++++++++++++++--------------------
pool_auth.c | 12 +++++--
pool_connection_pool.c | 12 ++++---
pool_process_context.c | 47 ++++++++++++++++++++++++++
pool_process_context.h | 1 +
8 files changed, 130 insertions(+), 47 deletions(-)
diff --git a/doc/pgpool-ja.html b/doc/pgpool-ja.html
index 0504c8a33..691f16306 100644
--- a/doc/pgpool-ja.html
+++ b/doc/pgpool-ja.html
@@ -8,7 +8,7 @@
<body>
<!-- hhmts start -->
-Last modified: Sun Aug 1 17:11:12 JST 2010
+Last modified: Thu Aug 5 11:40:10 JST 2010
<!-- hhmts end -->
<body bgcolor="#ffffff">
@@ -3018,7 +3018,7 @@ configure $B$K<:GT$7$^$9!#I,$:(B libpq 3.0 (PostgreSQL 7.4) $B$r%j%s%/$9$k$h
<pre>
ex)
$ pcp_proc_info 10 localhost 9898 postgres hogehoge 3815
- postgres_db postgres 1150769932 1150767351 3 0 1
+ postgres_db postgres 1150769932 1150767351 3 0 1 14067
$B7k2L$O0J2<$N=g$NDL$j$G$9!#(B
1. $B@\B3$7$F$$$k%G!<%?%Y!<%9L>(B
@@ -3028,6 +3028,7 @@ configure $B$K<:GT$7$^$9!#I,$:(B libpq 3.0 (PostgreSQL 7.4) $B$r%j%s%/$9$k$h
5. $B%W%m%H%3%k%a%8%c!<%P!<%8%g%s(B
6. $B%W%m%H%3%k%^%$%J!<%P!<%8%g%s(B
7. $B%3%M%/%7%g%s;HMQ2s?t(B
+ 8. PostgreSQL$B%P%C%/%(%s%I%W%m%;%9(BID
$B%3%M%/%7%g%s$,%P%C%/%(%s%I$KBP$7$FD%$i$l$F$$$J$$>l9g!"%G!<%?$OI=<($5$l$^$;$s!#(B
$B%3%M%/%7%g%s>pJs$,J#?t$"$k>l9g!"J#?t9T$K(B1$B9T(B1$B%3%M%/%7%g%s>pJs$GI=<($5$l$^$9!#(B
diff --git a/pcp/pcp.c b/pcp/pcp.c
index de83b4b71..49bbb845d 100644
--- a/pcp/pcp.c
+++ b/pcp/pcp.c
@@ -727,6 +727,10 @@ pcp_process_info(int pid, int *array_size)
if (index != NULL)
process_info->connection_info[offset].counter = atoi(index);
+ index = (char *) memchr(index, '\0', rsize) + 1;
+ if (index != NULL)
+ process_info->connection_info[offset].pid = atoi(index);
+
offset++;
}
else if (strcmp(buf, "CommandComplete") == 0)
diff --git a/pcp/pcp_proc_info.c b/pcp/pcp_proc_info.c
index 285454960..ac851dd99 100644
--- a/pcp/pcp_proc_info.c
+++ b/pcp/pcp_proc_info.c
@@ -141,14 +141,15 @@ main(int argc, char **argv)
if (process_info->connection_info[i].database[0] == '\0')
continue;
- printf("%s %s %ld %ld %d %d %d\n",
+ printf("%s %s %ld %ld %d %d %d %d\n",
process_info->connection_info[i].database,
process_info->connection_info[i].user,
process_info->start_time,
process_info->connection_info[i].create_time,
process_info->connection_info[i].major,
process_info->connection_info[i].minor,
- process_info->connection_info[i].counter);
+ process_info->connection_info[i].counter,
+ process_info->connection_info[i].pid);
}
free(process_info);
}
diff --git a/pcp_child.c b/pcp_child.c
index 97b90bd4a..8c4291733 100644
--- a/pcp_child.c
+++ b/pcp_child.c
@@ -54,6 +54,7 @@
#include "pcp/pcp.h"
#include "md5.h"
#include "pool_config.h"
+#include "pool_process_context.h"
#define MAX_FILE_LINE_LEN 512
#define MAX_USER_PASSWD_LEN 128
@@ -109,6 +110,9 @@ pcp_do_child(int unix_fd, int inet_fd, char *pcp_conf_file)
signal(SIGPIPE, SIG_IGN);
signal(SIGALRM, SIG_IGN);
+ /* Initialize process context */
+ pool_init_process_context();
+
for(;;)
{
errno = 0;
@@ -433,7 +437,7 @@ pcp_do_child(int unix_fd, int inet_fd, char *pcp_conf_file)
/* Finally, indicate that all data is sent */
char fin_code[] = "CommandComplete";
- snprintf(con_info_size, sizeof(con_info_size), "%d", pool_config->max_pool);
+ snprintf(con_info_size, sizeof(con_info_size), "%d", pool_config->max_pool*NUM_BACKENDS);
pcp_write(frontend, "p", 1);
wsize = htonl(sizeof(arr_code) +
@@ -449,45 +453,58 @@ pcp_do_child(int unix_fd, int inet_fd, char *pcp_conf_file)
}
/* Second, send process information for all connection_info */
-
for (i = 0; i < pool_config->max_pool; i++)
{
- char code[] = "ProcessInfo";
- char proc_start_time[20];
- char proc_create_time[20];
- char majorversion[5];
- char minorversion[5];
- char pool_counter[16];
-
- snprintf(proc_start_time, sizeof(proc_start_time), "%ld", pi->start_time);
- snprintf(proc_create_time, sizeof(proc_create_time), "%ld", pi->connection_info[i].create_time);
- snprintf(majorversion, sizeof(majorversion), "%d", pi->connection_info[i].major);
- snprintf(minorversion, sizeof(minorversion), "%d", pi->connection_info[i].minor);
- snprintf(pool_counter, sizeof(pool_counter), "%d", pi->connection_info[i].counter);
-
- pcp_write(frontend, "p", 1);
- wsize = htonl(sizeof(code) +
- strlen(pi->connection_info[i].database)+1 +
- strlen(pi->connection_info[i].user)+1 +
- strlen(proc_start_time)+1 +
- strlen(proc_create_time)+1 +
- strlen(majorversion)+1 +
- strlen(minorversion)+1 +
- strlen(pool_counter)+1 +
- sizeof(int));
- pcp_write(frontend, &wsize, sizeof(int));
- pcp_write(frontend, code, sizeof(code));
- pcp_write(frontend, pi->connection_info[i].database, strlen(pi->connection_info[i].database)+1);
- pcp_write(frontend, pi->connection_info[i].user, strlen(pi->connection_info[i].user)+1);
- pcp_write(frontend, proc_start_time, strlen(proc_start_time)+1);
- pcp_write(frontend, proc_create_time, strlen(proc_create_time)+1);
- pcp_write(frontend, majorversion, strlen(majorversion)+1);
- pcp_write(frontend, minorversion, strlen(minorversion)+1);
- pcp_write(frontend, pool_counter, strlen(pool_counter)+1);
- if (pcp_flush(frontend) < 0)
+ int j;
+
+ for (j=0;j<NUM_BACKENDS;j++)
{
- pool_error("pcp_child: pcp_flush() failed. reason: %s", strerror(errno));
- exit(1);
+ char code[] = "ProcessInfo";
+ char proc_start_time[20];
+ char proc_create_time[20];
+ char majorversion[5];
+ char minorversion[5];
+ char pool_counter[16];
+ char backend_pid[16];
+ ConnectionInfo *connection_info;
+
+ connection_info = pool_coninfo_pid(proc_id, i, j);
+
+ pool_debug("pcp_child: i:%d j:%d connection_info:%x", i, j, connection_info);
+
+ snprintf(proc_start_time, sizeof(proc_start_time), "%ld", pi->start_time);
+ snprintf(proc_create_time, sizeof(proc_create_time), "%ld", connection_info->create_time);
+ snprintf(majorversion, sizeof(majorversion), "%d", connection_info->major);
+ snprintf(minorversion, sizeof(minorversion), "%d", connection_info->minor);
+ snprintf(pool_counter, sizeof(pool_counter), "%d", connection_info->counter);
+ snprintf(backend_pid, sizeof(backend_pid), "%d", ntohl(connection_info->pid));
+
+ pcp_write(frontend, "p", 1);
+ wsize = htonl(sizeof(code) +
+ strlen(connection_info->database)+1 +
+ strlen(connection_info->user)+1 +
+ strlen(proc_start_time)+1 +
+ strlen(proc_create_time)+1 +
+ strlen(majorversion)+1 +
+ strlen(minorversion)+1 +
+ strlen(pool_counter)+1 +
+ strlen(backend_pid)+1 +
+ sizeof(int));
+ pcp_write(frontend, &wsize, sizeof(int));
+ pcp_write(frontend, code, sizeof(code));
+ pcp_write(frontend, connection_info->database, strlen(connection_info->database)+1);
+ pcp_write(frontend, connection_info->user, strlen(connection_info->user)+1);
+ pcp_write(frontend, proc_start_time, strlen(proc_start_time)+1);
+ pcp_write(frontend, proc_create_time, strlen(proc_create_time)+1);
+ pcp_write(frontend, majorversion, strlen(majorversion)+1);
+ pcp_write(frontend, minorversion, strlen(minorversion)+1);
+ pcp_write(frontend, pool_counter, strlen(pool_counter)+1);
+ pcp_write(frontend, backend_pid, strlen(backend_pid)+1);
+ if (pcp_flush(frontend) < 0)
+ {
+ pool_error("pcp_child: pcp_flush() failed. reason: %s", strerror(errno));
+ exit(1);
+ }
}
}
diff --git a/pool_auth.c b/pool_auth.c
index 21554913c..db3d6ce77 100644
--- a/pool_auth.c
+++ b/pool_auth.c
@@ -334,6 +334,8 @@ from pool_read_message_length and recheck the pg_hba.conf settings.");
/*
* OK, read pid and secret key
*/
+ sp = MASTER_CONNECTION(cp)->sp;
+
for (i=0;i<NUM_BACKENDS;i++)
{
if (VALID_BACKEND(i))
@@ -345,7 +347,7 @@ from pool_read_message_length and recheck the pg_hba.conf settings.");
return -1;
}
- pool_debug("pool_do_auth: cp->info[i]:%x pid:%d", &cp->info[i], ntohl(pid));
+ pool_debug("pool_do_auth: cp->info[i]:%x pid:%u", &cp->info[i], ntohl(pid));
CONNECTION_SLOT(cp, i)->pid = cp->info[i].pid = pid;
@@ -357,16 +359,22 @@ from pool_read_message_length and recheck the pg_hba.conf settings.");
}
CONNECTION_SLOT(cp, i)->key = cp->info[i].key = key;
+ cp->info[i].major = sp->major;
+ cp->info[i].minor = sp->minor;
+ strncpy(cp->info[i].database, sp->database, sizeof(cp->info[i].database) - 1);
+ strncpy(cp->info[i].user, sp->user, sizeof(cp->info[i].user) - 1);
+ cp->info[i].counter = 1;
}
}
+#ifdef NOT_USED
sp = MASTER_CONNECTION(cp)->sp;
cp->info->major = sp->major;
cp->info->minor = sp->minor;
strncpy(cp->info->database, sp->database, sizeof(cp->info->database) - 1);
strncpy(cp->info->user, sp->user, sizeof(cp->info->user) - 1);
cp->info->counter = 1;
-
+#endif
return pool_send_backend_key_data(frontend, pid, key, protoMajor);
}
diff --git a/pool_connection_pool.c b/pool_connection_pool.c
index 8498635c0..f43d2779d 100644
--- a/pool_connection_pool.c
+++ b/pool_connection_pool.c
@@ -71,7 +71,7 @@ int pool_init_cp(void)
for (i = 0; i < pool_config->max_pool; i++)
{
- pool_connection_pool[i].info = &(pool_get_my_process_info()->connection_info[i]);
+ pool_connection_pool[i].info = pool_coninfo(pool_get_process_context()->proc_id, i, 0);
memset(pool_connection_pool[i].info, 0, sizeof(ConnectionInfo) * MAX_NUM_BACKENDS);
}
return 0;
@@ -88,7 +88,7 @@ POOL_CONNECTION_POOL *pool_get_cp(char *user, char *database, int protoMajor, in
int oldmask;
#endif
- int i, j, freed = 0;
+ int i, freed = 0;
ConnectionInfo *info;
POOL_CONNECTION_POOL *p = pool_connection_pool;
@@ -111,10 +111,14 @@ POOL_CONNECTION_POOL *pool_get_cp(char *user, char *database, int protoMajor, in
strcmp(MASTER_CONNECTION(p)->sp->database, database) == 0)
{
int sock_broken = 0;
+ int j;
/* mark this connection is under use */
MASTER_CONNECTION(p)->closetime = 0;
- p->info->counter++;
+ for (j=0;j<NUM_BACKENDS;j++)
+ {
+ p->info[j].counter++;
+ }
POOL_SETMASK(&oldmask);
if (check_socket)
@@ -633,6 +637,7 @@ static POOL_CONNECTION_POOL *new_connection(POOL_CONNECTION_POOL *p)
child_exit(1);
}
+ p->info[i].create_time = time(NULL);
p->slots[i] = s;
if (pool_init_params(&s->con->params))
@@ -646,7 +651,6 @@ static POOL_CONNECTION_POOL *new_connection(POOL_CONNECTION_POOL *p)
if (active_backend_count > 0)
{
- p->info->create_time = time(NULL);
return p;
}
diff --git a/pool_process_context.c b/pool_process_context.c
index 354365532..8efd170d6 100644
--- a/pool_process_context.c
+++ b/pool_process_context.c
@@ -150,3 +150,50 @@ ConnectionInfo *pool_coninfo(int child, int connection_pool, int backend)
connection_pool*MAX_NUM_BACKENDS+
backend];
}
+
+/*
+ * Return pointer to child which has OS process id pid, j th connection
+ * pool and k th backend of connection info on shmem.
+ */
+ConnectionInfo *pool_coninfo_pid(int pid, int connection_pool, int backend)
+{
+ int child = -1;
+ int i;
+
+ for (i = 0; i < pool_config->num_init_children; i++)
+ {
+ if (process_info[i].pid == pid)
+ {
+ child = i;
+ break;
+ }
+ }
+
+ if (child < 0)
+ {
+ pool_error("pool_coninfo_pid: invalid child pid: %d", pid);
+ return NULL;
+ }
+
+ if (child < 0 || child >= pool_config->num_init_children)
+ {
+ pool_error("pool_coninfo_pid: invalid child number: %d", child);
+ return NULL;
+ }
+
+ if (connection_pool < 0 || connection_pool >= pool_config->max_pool)
+ {
+ pool_error("pool_coninfo_pid: invalid connection_pool number: %d", connection_pool);
+ return NULL;
+ }
+
+ if (backend < 0 || backend >= MAX_NUM_BACKENDS)
+ {
+ pool_error("pool_coninfo: invalid backend number: %d", backend);
+ return NULL;
+ }
+
+ return &con_info[child*pool_config->max_pool*MAX_NUM_BACKENDS+
+ connection_pool*MAX_NUM_BACKENDS+
+ backend];
+}
diff --git a/pool_process_context.h b/pool_process_context.h
index 7b304c756..728f96ba4 100644
--- a/pool_process_context.h
+++ b/pool_process_context.h
@@ -55,5 +55,6 @@ extern void pool_incremnet_local_session_id(void);
extern int pool_coninfo_size(void);
extern int pool_coninfo_num(void);
extern ConnectionInfo *pool_coninfo(int child, int connection_pool, int backend);
+extern ConnectionInfo *pool_coninfo_pid(int pid, int connection_pool, int backend);
#endif /* POOL_PROCESS_CONTEXT_H */
[parent: e932294d4d94]