Can you try CVS HEAD?
After 3.1 released, I have committed some fixes regarding memory handling.
For your convenience I have attached patches.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
> Hallo,
>
> we have a Java application that is executing a larger sequence of SQL
> operations including table manipulations and content modifications within one
> connection. When we are running these operations through pgpool-II, the
> pgpool child process handling it always dies with a segmentation fault. But
> it's not always the same SQL Statement that is causing the segfault.
>
> Our setup is as follows:
> - pgpool-II-3.1 on a Linux-x86_64 server. We also encountered the
> segmentation fault with pgpool-II-3.0.4 before trying out version 3.1.
> - the pgpool configuration is reduced to a minimum, that is the connection
> cache, the master slave and the load balance mode are off. The replication
> mode is enabled but only one backend is defined.
> - PostgreSQL server version is 9.0.4
> - the Java application uses the postgreSQL JDBC driver in version 9.0.801
>
> Do you have an idea what might be causing this behavior?
>
> For some additional details I attached a backtrace. I can also provide the
> debug messages of the child process, if you want to have look at them.
>
> Thanks in advance.
>
> Ronny
? .deps
? .libs
? Makefile
? autom4te.cache
? config.h
? config.log
? config.status
? libtool
? m4
? pg_md5
? pgpool
? pgpool.8
? pool_hashfn.c
? pool_hashfunc.c
? stamp-h1
? test.c
? parser/.deps
? parser/Makefile
? pcp/.deps
? pcp/.libs
? pcp/Makefile
? pcp/libpcp.la
? pcp/md5.lo
? pcp/pcp.lo
? pcp/pcp_attach_node
? pcp/pcp_detach_node
? pcp/pcp_error.lo
? pcp/pcp_node_count
? pcp/pcp_node_info
? pcp/pcp_pool_status
? pcp/pcp_proc_count
? pcp/pcp_proc_info
? pcp/pcp_promote_node
? pcp/pcp_recovery_node
? pcp/pcp_stop_pgpool
? pcp/pcp_stream.lo
? pcp/pcp_systemdb_info
? sql/pgpool-regclass/pgpool-regclass.sql
? sql/pgpool-walrecrunning/pgpool-walrecrunning.sql
Index: Makefile.am
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/Makefile.am,v
retrieving revision 1.60
diff -c -r1.60 Makefile.am
*** Makefile.am 11 Sep 2011 12:45:43 -0000 1.60
--- Makefile.am 13 Oct 2011 06:00:14 -0000
***************
*** 31,37 ****
pool_error.c \
pool_signal.h pool_signal.c \
pool_passwd.c pool_passwd.h \
! pool_globals.c
DEFS = @DEFS@ \
-DDEFAULT_CONFIGDIR=\"$(sysconfdir)\"
--- 31,37 ----
pool_error.c \
pool_signal.h pool_signal.c \
pool_passwd.c pool_passwd.h \
! pool_globals.c strlcpy.c
DEFS = @DEFS@ \
-DDEFAULT_CONFIGDIR=\"$(sysconfdir)\"
Index: Makefile.in
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/Makefile.in,v
retrieving revision 1.64
diff -c -r1.64 Makefile.in
*** Makefile.in 11 Sep 2011 12:45:43 -0000 1.64
--- Makefile.in 13 Oct 2011 06:00:15 -0000
***************
*** 61,67 ****
am_pg_md5_OBJECTS = pg_md5.$(OBJEXT) md5.$(OBJEXT) \
pool_config_md5.$(OBJEXT) pool_error.$(OBJEXT) \
pool_signal.$(OBJEXT) pool_passwd.$(OBJEXT) \
! pool_globals.$(OBJEXT)
pg_md5_OBJECTS = $(am_pg_md5_OBJECTS)
pg_md5_LDADD = $(LDADD)
am_pgpool_OBJECTS = main.$(OBJEXT) child.$(OBJEXT) pool_auth.$(OBJEXT) \
--- 61,67 ----
am_pg_md5_OBJECTS = pg_md5.$(OBJEXT) md5.$(OBJEXT) \
pool_config_md5.$(OBJEXT) pool_error.$(OBJEXT) \
pool_signal.$(OBJEXT) pool_passwd.$(OBJEXT) \
! pool_globals.$(OBJEXT) strlcpy.$(OBJEXT)
pg_md5_OBJECTS = $(am_pg_md5_OBJECTS)
pg_md5_LDADD = $(LDADD)
am_pgpool_OBJECTS = main.$(OBJEXT) child.$(OBJEXT) pool_auth.$(OBJEXT) \
***************
*** 339,345 ****
pool_error.c \
pool_signal.h pool_signal.c \
pool_passwd.c pool_passwd.h \
! pool_globals.c
sysconf_DATA = pgpool.conf.sample pcp.conf.sample pool_hba.conf.sample \
pgpool.conf.sample-replication pgpool.conf.sample-master-slave \
--- 339,345 ----
pool_error.c \
pool_signal.h pool_signal.c \
pool_passwd.c pool_passwd.h \
! pool_globals.c strlcpy.c
sysconf_DATA = pgpool.conf.sample pcp.conf.sample pool_hba.conf.sample \
pgpool.conf.sample-replication pgpool.conf.sample-master-slave \
Index: main.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/main.c,v
retrieving revision 1.114
diff -c -r1.114 main.c
*** main.c 3 Oct 2011 06:22:49 -0000 1.114
--- main.c 13 Oct 2011 06:00:16 -0000
***************
*** 230,236 ****
usage();
exit(1);
}
! strncpy(hba_file, optarg, sizeof(hba_file));
break;
case 'c': /* clear cache option */
--- 230,236 ----
usage();
exit(1);
}
! strlcpy(hba_file, optarg, sizeof(hba_file));
break;
case 'c': /* clear cache option */
***************
*** 247,253 ****
usage();
exit(1);
}
! strncpy(conf_file, optarg, sizeof(conf_file));
break;
case 'F': /* specify PCP password file */
--- 247,253 ----
usage();
exit(1);
}
! strlcpy(conf_file, optarg, sizeof(conf_file));
break;
case 'F': /* specify PCP password file */
***************
*** 256,262 ****
usage();
exit(1);
}
! strncpy(pcp_conf_file, optarg, sizeof(pcp_conf_file));
break;
case 'h':
--- 256,262 ----
usage();
exit(1);
}
! strlcpy(pcp_conf_file, optarg, sizeof(pcp_conf_file));
break;
case 'h':
***************
*** 426,432 ****
char dirnamebuf[POOLMAXPATHLEN+1];
char *dirp;
! strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
dirp = dirname(dirnamebuf);
snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
dirp, pool_config->pool_passwd);
--- 426,432 ----
char dirnamebuf[POOLMAXPATHLEN+1];
char *dirp;
! strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
dirp = dirname(dirnamebuf);
snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
dirp, pool_config->pool_passwd);
Index: pg_md5.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pg_md5.c,v
retrieving revision 1.12
diff -c -r1.12 pg_md5.c
*** pg_md5.c 12 Jun 2011 09:20:33 -0000 1.12
--- pg_md5.c 13 Oct 2011 06:00:16 -0000
***************
*** 92,98 ****
{
PRINT_USAGE(EXIT_SUCCESS);
}
! strncpy(conf_file, optarg, sizeof(conf_file));
break;
case 'u':
--- 92,98 ----
{
PRINT_USAGE(EXIT_SUCCESS);
}
! strlcpy(conf_file, optarg, sizeof(conf_file));
break;
case 'u':
***************
*** 106,112 ****
fprintf(stderr, "Error: input exceeds maximum username length!\n\n");
exit(EXIT_FAILURE);
}
! strncpy(username, optarg, sizeof(username));
break;
default:
--- 106,112 ----
fprintf(stderr, "Error: input exceeds maximum username length!\n\n");
exit(EXIT_FAILURE);
}
! strlcpy(username, optarg, sizeof(username));
break;
default:
***************
*** 206,212 ****
exit(EXIT_FAILURE);
}
! strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
dirp = dirname(dirnamebuf);
snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
dirp, pool_config->pool_passwd);
--- 206,212 ----
exit(EXIT_FAILURE);
}
! strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
dirp = dirname(dirnamebuf);
snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
dirp, pool_config->pool_passwd);
Index: pool_auth.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_auth.c,v
retrieving revision 1.30
diff -c -r1.30 pool_auth.c
*** pool_auth.c 8 Jun 2011 11:14:26 -0000 1.30
--- pool_auth.c 13 Oct 2011 06:00:17 -0000
***************
*** 5,11 ****
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
*
! * Copyright (c) 2003-2010 PgPool Global Development Group
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby
--- 5,11 ----
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
*
! * Copyright (c) 2003-2011 PgPool Global Development Group
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby
***************
*** 373,380 ****
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;
}
}
--- 373,380 ----
cp->info[i].major = sp->major;
cp->info[i].minor = sp->minor;
! strlcpy(cp->info[i].database, sp->database, sizeof(cp->info[i].database));
! strlcpy(cp->info[i].user, sp->user, sizeof(cp->info[i].user));
cp->info[i].counter = 1;
}
}
Index: pool_config.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_config.c,v
retrieving revision 1.67
diff -c -r1.67 pool_config.c
*** pool_config.c 3 Oct 2011 06:22:50 -0000 1.67
--- pool_config.c 13 Oct 2011 06:00:19 -0000
***************
*** 485,491 ****
/* -*-pgsql-c-*- */
/*
*
! * $Header: /cvsroot/pgpool/pgpool-II/pool_config.c,v 1.67 2011/10/03 06:22:50 t-ishii Exp $
*
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
--- 485,491 ----
/* -*-pgsql-c-*- */
/*
*
! * $Header: /cvsroot/pgpool/pgpool-II/pool_config.l,v 1.61 2011/10/03 06:22:50 t-ishii Exp $
*
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
***************
*** 2109,2115 ****
return(-1);
}
! strncpy(key, yytext, sizeof(key));
pool_debug("key: %s", key);
--- 2109,2115 ----
return(-1);
}
! strlcpy(key, yytext, sizeof(key));
pool_debug("key: %s", key);
***************
*** 3271,3277 ****
}
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! strncpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
}
else if (!strncmp(key, "backend_port", 12) &&
--- 3271,3277 ----
}
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
}
else if (!strncmp(key, "backend_port", 12) &&
***************
*** 3369,3375 ****
status = BACKEND_INFO(slot).backend_status;
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! strncpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
}
else if (!strncmp(key, "backend_flag", 12) &&
CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
--- 3369,3375 ----
status = BACKEND_INFO(slot).backend_status;
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! strlcpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
}
else if (!strncmp(key, "backend_flag", 12) &&
CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
***************
*** 3806,3817 ****
if (pool_config->backend_socket_dir == NULL)
{
pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! strncpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
}
else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/
{
pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
}
}
}
--- 3806,3817 ----
if (pool_config->backend_socket_dir == NULL)
{
pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! strlcpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
}
else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/
{
pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
}
}
}
Index: pool_config.l
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_config.l,v
retrieving revision 1.61
diff -c -r1.61 pool_config.l
*** pool_config.l 3 Oct 2011 06:22:50 -0000 1.61
--- pool_config.l 13 Oct 2011 06:00:20 -0000
***************
*** 384,390 ****
return(-1);
}
! strncpy(key, yytext, sizeof(key));
pool_debug("key: %s", key);
--- 384,390 ----
return(-1);
}
! strlcpy(key, yytext, sizeof(key));
pool_debug("key: %s", key);
***************
*** 1546,1552 ****
}
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! strncpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
}
else if (!strncmp(key, "backend_port", 12) &&
--- 1546,1552 ----
}
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
}
else if (!strncmp(key, "backend_port", 12) &&
***************
*** 1644,1650 ****
status = BACKEND_INFO(slot).backend_status;
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! strncpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
}
else if (!strncmp(key, "backend_flag", 12) &&
CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
--- 1644,1650 ----
status = BACKEND_INFO(slot).backend_status;
if (context == INIT_CONFIG ||
(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! strlcpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
}
else if (!strncmp(key, "backend_flag", 12) &&
CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
***************
*** 2081,2092 ****
if (pool_config->backend_socket_dir == NULL)
{
pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! strncpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
}
else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/
{
pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
}
}
}
--- 2081,2092 ----
if (pool_config->backend_socket_dir == NULL)
{
pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! strlcpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
}
else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/
{
pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
}
}
}
Index: pool_proto_modules.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_proto_modules.c,v
retrieving revision 1.110
diff -c -r1.110 pool_proto_modules.c
*** pool_proto_modules.c 14 Sep 2011 13:15:38 -0000 1.110
--- pool_proto_modules.c 13 Oct 2011 06:00:21 -0000
***************
*** 127,133 ****
}
/* save last query string for logging purpose */
! strncpy(query_string_buffer, contents, sizeof(query_string_buffer));
/* show ps status */
query_ps_status(contents, backend);
--- 127,133 ----
}
/* save last query string for logging purpose */
! strlcpy(query_string_buffer, contents, sizeof(query_string_buffer));
/* show ps status */
query_ps_status(contents, backend);
***************
*** 590,596 ****
node = msg->query_context->parse_tree;
query = msg->query_context->original_query;
pool_debug("Execute: query: %s", query);
! strncpy(query_string_buffer, query, sizeof(query_string_buffer));
pool_debug("Execute: query string = <%s>", query);
--- 590,596 ----
node = msg->query_context->parse_tree;
query = msg->query_context->original_query;
pool_debug("Execute: query: %s", query);
! strlcpy(query_string_buffer, query, sizeof(query_string_buffer));
pool_debug("Execute: query string = <%s>", query);
***************
*** 2635,2641 ****
return POOL_END;
#ifdef DEBUG
! strncpy(buf, string, len);
pool_debug("copy line %d %d bytes :%s:", j++, len, buf);
#endif
--- 2635,2641 ----
return POOL_END;
#ifdef DEBUG
! strlcpy(buf, string, sizeof(buf));
pool_debug("copy line %d %d bytes :%s:", j++, len, buf);
#endif
Index: pool_relcache.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_relcache.c,v
retrieving revision 1.14
diff -c -r1.14 pool_relcache.c
*** pool_relcache.c 30 Aug 2011 11:02:11 -0000 1.14
--- pool_relcache.c 13 Oct 2011 06:00:23 -0000
***************
*** 63,69 ****
}
p->num = cachesize;
! strncpy(p->sql, sql, sizeof(p->sql)-1);
p->register_func = register_func;
p->unregister_func = unregister_func;
p->cache_is_session_local = issessionlocal;
--- 63,69 ----
}
p->num = cachesize;
! strlcpy(p->sql, sql, sizeof(p->sql));
p->register_func = register_func;
p->unregister_func = unregister_func;
p->cache_is_session_local = issessionlocal;
***************
*** 207,214 ****
}
/* Register cache */
! strncpy(relcache->cache[index].dbname, dbname, MAX_ITEM_LENGTH);
! strncpy(relcache->cache[index].relname, rel, MAX_ITEM_LENGTH);
relcache->cache[index].refcnt = 1;
relcache->cache[index].session_id = local_session_id;
if (pool_config->relcache_expire > 0)
--- 207,214 ----
}
/* Register cache */
! strlcpy(relcache->cache[index].dbname, dbname, MAX_ITEM_LENGTH);
! strlcpy(relcache->cache[index].relname, rel, MAX_ITEM_LENGTH);
relcache->cache[index].refcnt = 1;
relcache->cache[index].session_id = local_session_id;
if (pool_config->relcache_expire > 0)
_______________________________________________
Pgpool-general mailing list
[email protected]
http://pgfoundry.org/mailman/listinfo/pgpool-general