pgpool2.git / summary / log / commit / refs

commit    170ee46ffe46b78af613a2c14cf692f52571e81a
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Wed Jan 18 23:24:34 2017 +0000

    Fix query cache bug reported in pgpool-general-jp:1441.
    
    In streaming replication mode with query cache enabled, SELECT hangs
    in the following scenario:
    
    1) a SELECT hits query cache and returns rows from the query cache.
    2) following SELECT needs to search meta data and it hangs.
    
    In #1, while returning the cached result, it misses to call
    pool_unset_pending_response(), which leave the pending_response flag
    be set. In #2, do_query() checks the flag and tries to read pending
    response from backend. Since there's no pending data in backend, it
    hangs in reading data from backend.
    
    Fix is, just call pool_unset_pending_response() in #1 to reset the
    flag.
    
    Bug report and fix provided by Nobuyuki Nagai.
    
    New regression test item (068) added by me.


src/protocol/pool_proto_modules.c | 1 + .../regression/tests/068.memqcache_bug/Sample.java | 50 ++++++++++++++++++++++ .../regression/tests/068.memqcache_bug/test.sh | 38 ++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c index d9bbca41f..9d05d82e7 100644 --- a/src/protocol/pool_proto_modules.c +++ b/src/protocol/pool_proto_modules.c @@ -814,6 +814,7 @@ POOL_STATUS Execute(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, pool_set_skip_reading_from_backends(); pool_stats_count_up_num_cache_hits(); pool_unset_query_in_progress(); + pool_unset_pending_response(); return POOL_CONTINUE; } } diff --git a/src/test/regression/tests/068.memqcache_bug/Sample.java b/src/test/regression/tests/068.memqcache_bug/Sample.java new file mode 100644 index 000000000..a73154b7d --- /dev/null +++ b/src/test/regression/tests/068.memqcache_bug/Sample.java @@ -0,0 +1,50 @@ +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Properties; + +import org.postgresql.Driver; + +public class Sample { + public Sample() { + } + + public static void main(String[] args) throws Exception { + ResultSet rs; + Properties props = new Properties(); + props.setProperty("user", "t-ishii"); + props.setProperty("password", ""); + props.setProperty("protocolVersion", "3"); + DriverManager.setLogWriter(new PrintWriter(System.out)); + Driver.setLogLevel(2); + Connection conn = DriverManager.getConnection( + "jdbc:postgresql://localhost:11000/test", props); + conn.setAutoCommit(true); + Statement st = conn.createStatement(); + st.setFetchSize(100); + // Does not hit cache + rs = st.executeQuery("SELECT 1"); + while (rs.next()) { + System.out.println(rs.getString(1)); + } + rs.close(); + + // Does hit cache + rs = st.executeQuery("SELECT 1"); + while (rs.next()) { + System.out.println(rs.getString(1)); + } + rs.close(); + + // To call do_query() + rs = st.executeQuery("SELECT * FROM t1"); + while (rs.next()) { + System.out.println(rs.getString(1)); + } + rs.close(); + + conn.close(); + } +} diff --git a/src/test/regression/tests/068.memqcache_bug/test.sh b/src/test/regression/tests/068.memqcache_bug/test.sh new file mode 100755 index 000000000..273075cf3 --- /dev/null +++ b/src/test/regression/tests/068.memqcache_bug/test.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +#------------------------------------------------------------------- +# test script for a memqcache bug reported in pgpool-general-jp:1441. +# (do_query() hangs in certain condition) +# requires Java PostgreSQL JDBC driver. + +source $TESTLIBS +TESTDIR=testdir +export CLASSPATH=.:/usr/local/pgsql/share/postgresql-9.2-1003.jdbc4.jar + +rm -fr $TESTDIR +mkdir $TESTDIR +cd $TESTDIR + +# create test environment +echo -n "creating test environment..." +$PGPOOL_SETUP -m s -n 2 || exit 1 +echo "done." + +source ./bashrc.ports + +export PGPORT=$PGPOOL_PORT + +echo "memory_cache_enabled = on" >> etc/pgpool.conf +sh startall +wait_for_pgpool_startup + +cd .. +psql test <<EOF +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(i int); +EOF +javac Sample.java +java Sample # hang here if the bug bites you... +cd $TESTDIR +sh shutdownall +exit 0 + [parent: 075297a96a2c]