[Pgpool-general] pgpool-II hanging

Tatsuo Ishii ishii at sraoss.co.jp
Fri Dec 21 23:43:20 UTC 2007


Hi,

I could not reproduce your problem here. Can you confirm that my test
case reproduces the problem on your system? 

Here is the test case:

... connect to pgpool
test=# create table t1(i int);
CREATE TABLE
test=# insert into t1 values(1);
INSERT 0 1
test=# insert into t1 values(2);
INSERT 0 1
test=# insert into t2 values(1);
ERROR:  relation "t2" does not exist
test=# create table t2(i int);
CREATE TABLE
test=# insert into t2 values(1);
INSERT 0 1
test=# insert into t2 values(2);
INSERT 0 1
disconnect to pgpool

... connect to pgpool again
test=# SELECT 'DBD::Pg ping test';
     ?column?
-------------------
 DBD::Pg ping test
(1 row)

test=# BEGIN;
BEGIN
test=# select *  from t1;
 i
---
 1
 2
(2 rows)

test=# COMMIT;
COMMIT
test=# select * from t2;
 i
---
 1
 2
(2 rows)

pgpool.conf:

#
# pgpool-II configuration file sample
# $Header: /cvsroot/pgpool/pgpool-II/pgpool.conf.sample,v 1.15 2007/10/31 10:45:52 y-asaba Exp $

# Host name or IP address to listen on: '*' for all, '' for no TCP/IP
# connections
listen_addresses = 'localhost'

# Port number for pgpool
port = 9999

# Port number for pgpool communication manager
pcp_port = 9898

# Unix domain socket path.  (The Debian package defaults to
# /var/run/postgresql.)
socket_dir = '/tmp'

# Unix domain socket path for pgpool communication manager.
# (Debian package defaults to /var/run/postgresql)
pcp_socket_dir = '/tmp'

# Unix domain socket path for the backend. Debian package defaults to /var/run/postgresql!
backend_socket_dir = '/tmp'

# pgpool communication manager timeout. 0 means no timeout, but strongly not recommended!
pcp_timeout = 3600

# number of pre-forked child process
num_init_children = 32

# Number of connection pools allowed for a child process
max_pool = 4

# If idle for this many seconds, child exits.  0 means no timeout.
child_life_time = 300

# If idle for this many seconds, connection to PostgreSQL closes.
# 0 means no timeout.
connection_life_time = 0

# If child_max_connections connections were received, child exits.
# 0 means no exit.
child_max_connections = 0

# If client_idle_limit is n (n > 0), the client is forced to be
# disconnected whenever after n seconds idle (even inside an explicit
# transactions!)
# 0 means no disconnect.
client_idle_limit = 0

# Maximum time in seconds to complete client authentication.
# 0 means no timeout.
authentication_timeout = 60

# Logging directory
logdir = '/tmp'

# Replication mode
replication_mode = true

# Set this to nonzero (in milliseconds) to detect this situation and
# resolve the deadlock by aborting current session.
replication_timeout = 5000

# Load balancing mode, i.e., all SELECTs except in a transaction block
# are load balanced.  This is ignored if replication_mode is false.
load_balance_mode = true

# if there's a data mismatch between master and secondary
# start degeneration to stop replication mode
replication_stop_on_mismatch = false

# If true, replicate SELECT statement when load balancing is disabled.
# If false, it is only sent to the master node.
replicate_select = false

# Semicolon separated list of queries to be issued at the end of a session
reset_query_list = 'RESET ALL; SET SESSION AUTHORIZATION DEFAULT'

# If true print timestamp on each log line.
print_timestamp = true

# If true, operate in master/slave mode.
master_slave_mode = false

# If true, cache connection pool.
connection_cache = true

# Health check timeout.  0 means no timeout.
health_check_timeout = 20

# Health check period.  0 means no health check.
health_check_period = 5

# Health check user
health_check_user = 'nobody'

# Execute command by failover.
# special values:  %d = node id
#                  %h = host name
#                  %p = port number
#                  %D = database cluster path
#                  %% = '%' character
#
#failover_command = 'ls'

# Execute command by failback.
# special values:  %d = node id
#                  %h = host name
#                  %p = port number
#                  %D = database cluster path
#                  %% = '%' character
#
#failback_command = 'ls'

# If true, automatically lock table with INSERT statements to keep SERIAL
# data consistency.  An /*INSERT LOCK*/ comment has the same effect.  A
# /NO INSERT LOCK*/ comment disables the effect.
insert_lock = false

# If true, ignore leading white spaces of each query while pgpool judges
# whether the query is a SELECT so that it can be load balanced.  This
# is useful for certain APIs such as DBI/DBD which is known to adding an
# extra leading white space.
ignore_leading_white_space = true

# If true, print all statements to the log.  Like the log_statement option
# to PostgreSQL, this allows for observing queries without engaging in full
# debugging.
log_statement = false

# If true, incoming connections will be printed to the log.
log_connections = false

# If true, hostname will be shown in ps status. Also shown in
# connection log if log_connections = true.
# Be warned that this feature will add overhead to look up hostname.
log_hostname = false

# if non 0, run in parallel query mode
parallel_mode = false

# if non 0, use query cache
enable_query_cache = false

#set pgpool2 hostname 
pgpool2_hostname = ''

# system DB info
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = ''

# backend_hostname, backend_port, backend_weight
# here are examples

# - HBA -

# If true, use pool_hba.conf for client authentication. In pgpool-II
# 1.1, the default value is false. The default value will be true in
# 1.2.
enable_pool_hba = false

# - online recovery -
# online recovery user
recovery_user = 't-ishii'

# online recovery password
recovery_password = 't-ishii'

# execute a command in first stage.
recovery_1st_stage_command = 'copy_base_backup'

# execute a command in second stage.
recovery_2nd_stage_command = 'pgpool_recovery_pitr'
replication_strict = true
failover_command = ''
failback_command = ''
backend_hostname0 = ''
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/usr/local/pgsql/data'
backend_hostname1 = ''
backend_port1 = 5433
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data.repli'

> Hello,
> 
> we are testing pgpool-II for data replication in our PostgreSQL-Cluster.
> pgpool is hanging during the combinations of select and update/insert 
> statements
> within a transaction. We have reduced all to the following script:
> 
> ---- begin sql ---
> SELECT 'DBD::Pg ping test';
> BEGIN;
> select *  from sometable;
> COMMIT 
> select * from anothertable;
> --- end sql ----
> 
> pgpool is hanging after the commit-Statement.
> 
> 
> #---pgpool.conf --------------
> listen_addresses = '*'
> port = 5432
> pcp_port = 9898
> socket_dir = '/var/run/postgresql'
> ...
> replication_mode = true
> replication_timeout = 5000
> load_balance_mode = true
> replicate_select = false
> replication_stop_on_mismatch = true
> reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'
> print_timestamp = true
> connection_cache = true
> health_check_timeout = 20
> health_check_period = 60
> health_check_user = 'nobody'
> insert_lock = true
> ignore_leading_white_space = true
> ...
> parallel_mode = false
> enable_query_cache = false
> backend_hostname0 = 'dbfs2'
> backend_port0 = 5435
> backend_weight0 = 1
> backend_data_directory0 = '/pgpool/dbfs2'
> backend_hostname1 = 'dbfs3'
> backend_port1 = 5435
> backend_weight1 = 1
> backend_data_directory1 = '/pgpool/dbfs3'
> enable_pool_hba = false
> #--- end pgpool.conf
> 
> After setting 
> replicate_select = true
> 
> all is working fine. 
> 
> ----
> Best Regards / Mit freundlichen Grüßen 
> 
> Dr. R. Rohmfeld 
> IT und Software Development
> 
> e-mail: Rainer.Rohmfeld at emuge.de
> 


More information about the Pgpool-general mailing list