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]