Test: enhance regression 001.load_balance.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Sun, 12 Feb 2023 11:08:08 +0000 (20:08 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Wed, 15 Feb 2023 08:08:28 +0000 (17:08 +0900)
src/test/regression/tests/001.load_balance/expected/expected1-r
src/test/regression/tests/001.load_balance/expected/expected1-s
src/test/regression/tests/001.load_balance/expected/expected2-r
src/test/regression/tests/001.load_balance/expected/expected2-s
src/test/regression/tests/001.load_balance/expected/expected4-r
src/test/regression/tests/001.load_balance/expected/expected5-r
src/test/regression/tests/001.load_balance/expected/expected7-r [new file with mode: 0644]
src/test/regression/tests/001.load_balance/expected/expected7-s [new file with mode: 0644]
src/test/regression/tests/001.load_balance/expected/expected8-s [new file with mode: 0644]
src/test/regression/tests/001.load_balance/sql/7.sql [new file with mode: 0644]
src/test/regression/tests/001.load_balance/test.sh

index 01c4c4d90741ae704304edc4c9c0006bd5d4c337..f9bc840aef984c65eac06397153f833d4da25b0c 100644 (file)
@@ -1,26 +1,22 @@
 CREATE TABLE t1(i INTEGER);
 NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INTEGER);
 NOTICE:  DB node id: 1 statement: CREATE TABLE t1(i INTEGER);
-CREATE TABLE
 CREATE TABLE t2(i INTEGER);
 NOTICE:  DB node id: 0 statement: CREATE TABLE t2(i INTEGER);
 NOTICE:  DB node id: 1 statement: CREATE TABLE t2(i INTEGER);
-CREATE TABLE
 CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 0 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 1 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
 CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 0 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 1 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
-SELECT * FROM t1;
+SELECT * FROM t1;              -- this load balances
 NOTICE:  DB node id: 1 statement: SELECT * FROM t1;
  i 
 ---
 (0 rows)
 
-SELECT f1(1);
+SELECT f1(1);                  -- this does not load balance
 NOTICE:  DB node id: 0 statement: SELECT f1(1);
 NOTICE:  DB node id: 1 statement: SELECT f1(1);
  f1 
@@ -28,7 +24,7 @@ NOTICE:  DB node id: 1 statement: SELECT f1(1);
   1
 (1 row)
 
-SELECT public.f2(1);
+SELECT public.f2(1);   -- this does not load balance
 NOTICE:  DB node id: 0 statement: SELECT public.f2(1);
 NOTICE:  DB node id: 1 statement: SELECT public.f2(1);
  f2 
index 4ac8eb99e85ee150bce718225ecd9d4982e65217..029f2a25fc5387376d2a2bde719ecc6f65915d1f 100644 (file)
@@ -1,29 +1,25 @@
 CREATE TABLE t1(i INTEGER);
 NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INTEGER);
-CREATE TABLE
 CREATE TABLE t2(i INTEGER);
 NOTICE:  DB node id: 0 statement: CREATE TABLE t2(i INTEGER);
-CREATE TABLE
 CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 0 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
 CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
 NOTICE:  DB node id: 0 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
-SELECT * FROM t1;
+SELECT * FROM t1;              -- this load balances
 NOTICE:  DB node id: 1 statement: SELECT * FROM t1;
  i 
 ---
 (0 rows)
 
-SELECT f1(1);
+SELECT f1(1);                  -- this does not load balance
 NOTICE:  DB node id: 0 statement: SELECT f1(1);
  f1 
 ----
   1
 (1 row)
 
-SELECT public.f2(1);
+SELECT public.f2(1);   -- this does not load balance
 NOTICE:  DB node id: 0 statement: SELECT public.f2(1);
  f2 
 ----
index fb7aa48f94c8a8f42b62005e994df1a5e97724ee..922c4cb3b64836794a48b1bf477bb4b1eaccf790 100644 (file)
@@ -1,11 +1,11 @@
-SELECT f1(1);
+SELECT f1(1);                  -- this does load balance
 NOTICE:  DB node id: 1 statement: SELECT f1(1);
  f1 
 ----
   1
 (1 row)
 
-SELECT public.f2(1);
+SELECT public.f2(1);   -- this does load balance
 NOTICE:  DB node id: 1 statement: SELECT public.f2(1);
  f2 
 ----
index fb7aa48f94c8a8f42b62005e994df1a5e97724ee..922c4cb3b64836794a48b1bf477bb4b1eaccf790 100644 (file)
@@ -1,11 +1,11 @@
-SELECT f1(1);
+SELECT f1(1);                  -- this does load balance
 NOTICE:  DB node id: 1 statement: SELECT f1(1);
  f1 
 ----
   1
 (1 row)
 
-SELECT public.f2(1);
+SELECT public.f2(1);   -- this does load balance
 NOTICE:  DB node id: 1 statement: SELECT public.f2(1);
  f2 
 ----
index 25e0a800500e4b983b85bffe44b1c71f8d8459ae..54194344c2997dec922734d9c0f3cbe561cfe2c3 100644 (file)
@@ -1,7 +1,6 @@
 BEGIN;
 NOTICE:  DB node id: 0 statement: BEGIN;
 NOTICE:  DB node id: 1 statement: BEGIN;
-BEGIN
 SELECT 1;
 NOTICE:  DB node id: 0 statement: SELECT 1;
  ?column? 
@@ -12,4 +11,3 @@ NOTICE:  DB node id: 0 statement: SELECT 1;
 END;
 NOTICE:  DB node id: 1 statement: END;
 NOTICE:  DB node id: 0 statement: END;
-COMMIT
index f2e355922e9ed8e1eb2340fc0b32ccc56bc8d1ac..bee2b5b8e33a668e8b474e4ce8b9e892ff8df51e 100644 (file)
@@ -1,4 +1,4 @@
-SELECT f1(2);
+SELECT f1(2);          -- this should be sent to all the nodes
 NOTICE:  DB node id: 0 statement: SELECT f1(2);
 NOTICE:  DB node id: 1 statement: SELECT f1(2);
  f1 
diff --git a/src/test/regression/tests/001.load_balance/expected/expected7-r b/src/test/regression/tests/001.load_balance/expected/expected7-r
new file mode 100644 (file)
index 0000000..4f8963f
--- /dev/null
@@ -0,0 +1,99 @@
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE:  DB node id: 1 statement: SELECT 2;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;ROLLBACK;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;FOO;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;FOO;
+ERROR:  syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+                       ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
diff --git a/src/test/regression/tests/001.load_balance/expected/expected7-s b/src/test/regression/tests/001.load_balance/expected/expected7-s
new file mode 100644 (file)
index 0000000..30510b4
--- /dev/null
@@ -0,0 +1,88 @@
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE:  DB node id: 1 statement: SELECT 2;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE:  DB node id: 0 statement: BEGIN;SELECT 1;FOO;
+ERROR:  syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+                       ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 1 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
diff --git a/src/test/regression/tests/001.load_balance/expected/expected8-s b/src/test/regression/tests/001.load_balance/expected/expected8-s
new file mode 100644 (file)
index 0000000..43af8a8
--- /dev/null
@@ -0,0 +1,88 @@
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 0 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE:  DB node id: 0 statement: SELECT 2;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+-- multi-statement query including BEGIN and ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 0 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE:  DB node id: 1 statement: BEGIN;SELECT 1;FOO;
+ERROR:  syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+                       ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE:  DB node id: 0 statement: SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
diff --git a/src/test/regression/tests/001.load_balance/sql/7.sql b/src/test/regression/tests/001.load_balance/sql/7.sql
new file mode 100644 (file)
index 0000000..9e39d27
--- /dev/null
@@ -0,0 +1,30 @@
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+-- tx started by multi-statement query ends
+END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+-- SAVEPOINT
+SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+-- DEALLOCATE
+DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+-- multi-statement query including BEGIN and ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
index 4edd5ff58d365aac3e14c4dc3ecfdbb0a05ea65c..29b0a5c05eada667c8846e8f3698a5c15ced99ef 100755 (executable)
@@ -5,6 +5,9 @@
 source $TESTLIBS
 TESTDIR=testdir
 PSQL=$PGBIN/psql
+PSQLOPTS="-a -q -X"
+PGPOOLBIN=$PGPOOL_INSTALL_DIR/bin
+export PGDATABASE=test
 
 # sleep time after reload in seconds
 st=10
@@ -58,7 +61,7 @@ do
 
        wait_for_pgpool_startup
 
-       $PSQL -ae test > result1 2>&1 <<EOF
+       $PSQL $PSQLOPTS > result1 2>&1 <<EOF
 CREATE TABLE t1(i INTEGER);
 CREATE TABLE t2(i INTEGER);
 CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT \$1' LANGUAGE SQL;
@@ -77,7 +80,7 @@ EOF
        ./pgpool_reload
        sleep $st
 
-       $PSQL -ae test > result2 2>&1 <<EOF
+       $PSQL $PSQLOPTS > result2 2>&1 <<EOF
 SELECT f1(1);                  -- this does load balance
 SELECT public.f2(1);   -- this does load balance
 EOF
@@ -90,7 +93,7 @@ EOF
        ./startall
        wait_for_pgpool_startup
 
-       $PSQL -ae test > result3 2>&1 <<EOF
+       $PSQL $PSQLOPTS > result3 2>&1 <<EOF
 SELECT * FROM t1;
 SELECT 'a';
 SELECT 1;
@@ -138,7 +141,7 @@ EOF
            ./startall
            wait_for_pgpool_startup
 
-           $PSQL -ae test > result4 2>&1 <<EOF
+           $PSQL $PSQLOPTS > result4 2>&1 <<EOF
 BEGIN;
 SELECT 1;
 END;
@@ -154,7 +157,7 @@ EOF
            echo "read_only_function_list = ''" >> etc/pgpool.conf
            ./pgpool_reload
            sleep $st
-           $PSQL -ae test > result5 2>&1 <<EOF
+           $PSQL $PSQLOPTS > result5 2>&1 <<EOF
 SELECT f1(2);          -- this should be sent to all the nodes
 EOF
            check_result 5
@@ -174,16 +177,60 @@ EOF
        ./pgpool_reload
        sleep $st
 
-       $PSQL -ae test > result6 2>&1 <<EOF
+       $PSQL $PSQLOPTS > result6 2>&1 <<EOF
 SELECT f1(1);
 SELECT public.f2(1);
 EOF
        check_result 6
 
+       echo "=== test7 started ==="
+# -------------------------------------------------------------------------------
+# multi statement queries
+# -------------------------------------------------------------------------------
+       echo "statement_level_load_balance = off" >> etc/pgpool.conf
+       # XXX primary_routing_query_pattern_list does not allow to overwritten.
+       # So following does not work.
+       #echo "primary_routing_query_pattern_list = ''" >> etc/pgpool.conf
+       sed -i '/^primary_routing_query_pattern_list/d' etc/pgpool.conf
+       #echo "log_min_messages = debug5" >> etc/pgpool.conf
+
        ./shutdownall
+       ./startall
+       wait_for_pgpool_startup
+       $PSQL -c "SHOW POOL_NODES;" test
 
-       cd ..
+       $PSQL $PSQLOPTS < ../sql/7.sql > result7 2>&1
+       check_result 7
+
+       echo "=== test8 started ==="
+# -------------------------------------------------------------------------------
+# multi statement queries (swapping primary and standby)
+# -------------------------------------------------------------------------------
+       if [ $mode = 's' ];then
+           echo $PGPOOLBIN/pcp_promote_node -w -p $PCP_PORT --switchover 1
+           $PGPOOLBIN/pcp_promote_node -w -p $PCP_PORT --switchover 1
+           while :
+           do
+               wait_for_pgpool_startup
+               $PSQL -c "SHOW POOL_NODES;" test | grep down
+               if [ $? != 0 ];then
+                   break
+               fi
+               sleep 1
+           done
+
+           # Swap the weights. Now backend 0 is the load balance node
+           echo "backend_weight0 = 1" >> etc/pgpool.conf
+           echo "backend_weight1 = 0" >> etc/pgpool.conf
+           ./shutdownall
+           ./startall
+           wait_for_pgpool_startup
+           $PSQL $PSQLOPTS < ../sql/7.sql > result8 2>&1
+           check_result 8
+       fi
+       ./shutdownall
 
+       cd ..
 done
 
 exit 0