prestogres 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +20 -0
- data/LICENSE +202 -0
- data/NOTICE +22 -0
- data/README.md +217 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/bin/prestogres +254 -0
- data/config/pcp.conf.sample +28 -0
- data/config/pgpool.conf +678 -0
- data/config/pool_hba.conf +84 -0
- data/config/pool_passwd +0 -0
- data/config/postgresql.conf +2 -0
- data/ext/.gitignore +6 -0
- data/ext/depend +26 -0
- data/ext/extconf.rb +4 -0
- data/ext/prestogres_config.c +12 -0
- data/pgpool2/.gitignore +36 -0
- data/pgpool2/AUTHORS +4 -0
- data/pgpool2/COPYING +12 -0
- data/pgpool2/ChangeLog +1 -0
- data/pgpool2/INSTALL +1 -0
- data/pgpool2/Makefile.am +159 -0
- data/pgpool2/Makefile.in +1187 -0
- data/pgpool2/NEWS +4960 -0
- data/pgpool2/README +1 -0
- data/pgpool2/README.euc_jp +1 -0
- data/pgpool2/README.online-recovery +62 -0
- data/pgpool2/TODO +103 -0
- data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
- data/pgpool2/aclocal.m4 +1088 -0
- data/pgpool2/c-compiler.m4 +134 -0
- data/pgpool2/c-library.m4 +325 -0
- data/pgpool2/child.c +2097 -0
- data/pgpool2/config.guess +1532 -0
- data/pgpool2/config.h.in +332 -0
- data/pgpool2/config.sub +1640 -0
- data/pgpool2/configure +15752 -0
- data/pgpool2/configure.in +392 -0
- data/pgpool2/depcomp +522 -0
- data/pgpool2/doc/basebackup.sh +17 -0
- data/pgpool2/doc/pgpool-de.html +4220 -0
- data/pgpool2/doc/pgpool-en.html +5738 -0
- data/pgpool2/doc/pgpool-fr.html +4118 -0
- data/pgpool2/doc/pgpool-ja.css +198 -0
- data/pgpool2/doc/pgpool-ja.html +11279 -0
- data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
- data/pgpool2/doc/pgpool.css +280 -0
- data/pgpool2/doc/pgpool_remote_start +13 -0
- data/pgpool2/doc/recovery.conf.sample +117 -0
- data/pgpool2/doc/tutorial-en.html +707 -0
- data/pgpool2/doc/tutorial-ja.html +422 -0
- data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
- data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
- data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
- data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
- data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
- data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
- data/pgpool2/doc/tutorial-zh_cn.html +537 -0
- data/pgpool2/doc/watchdog.png +0 -0
- data/pgpool2/doc/wd-en.html +236 -0
- data/pgpool2/doc/wd-en.jpg +0 -0
- data/pgpool2/doc/wd-ja.html +219 -0
- data/pgpool2/doc/wd-ja.jpg +0 -0
- data/pgpool2/doc/wd-zh_cn.html +201 -0
- data/pgpool2/doc/where_to_send_queries.odg +0 -0
- data/pgpool2/doc/where_to_send_queries.pdf +0 -0
- data/pgpool2/general.m4 +166 -0
- data/pgpool2/getopt_long.c +200 -0
- data/pgpool2/getopt_long.h +44 -0
- data/pgpool2/install-sh +251 -0
- data/pgpool2/ltmain.sh +8406 -0
- data/pgpool2/m4/libtool.m4 +7360 -0
- data/pgpool2/m4/ltoptions.m4 +368 -0
- data/pgpool2/m4/ltsugar.m4 +123 -0
- data/pgpool2/m4/ltversion.m4 +23 -0
- data/pgpool2/m4/lt~obsolete.m4 +92 -0
- data/pgpool2/main.c +2971 -0
- data/pgpool2/md5.c +444 -0
- data/pgpool2/md5.h +28 -0
- data/pgpool2/missing +360 -0
- data/pgpool2/mkinstalldirs +40 -0
- data/pgpool2/parser/Makefile.am +50 -0
- data/pgpool2/parser/Makefile.in +559 -0
- data/pgpool2/parser/copyfuncs.c +3310 -0
- data/pgpool2/parser/gram.c +39100 -0
- data/pgpool2/parser/gram.h +940 -0
- data/pgpool2/parser/gram.y +13408 -0
- data/pgpool2/parser/gramparse.h +74 -0
- data/pgpool2/parser/keywords.c +32 -0
- data/pgpool2/parser/keywords.h +39 -0
- data/pgpool2/parser/kwlist.h +425 -0
- data/pgpool2/parser/kwlookup.c +88 -0
- data/pgpool2/parser/list.c +1156 -0
- data/pgpool2/parser/makefuncs.c +518 -0
- data/pgpool2/parser/makefuncs.h +83 -0
- data/pgpool2/parser/memnodes.h +79 -0
- data/pgpool2/parser/nodes.c +29 -0
- data/pgpool2/parser/nodes.h +609 -0
- data/pgpool2/parser/outfuncs.c +5790 -0
- data/pgpool2/parser/parsenodes.h +2615 -0
- data/pgpool2/parser/parser.c +262 -0
- data/pgpool2/parser/parser.h +46 -0
- data/pgpool2/parser/pg_class.h +158 -0
- data/pgpool2/parser/pg_config_manual.h +273 -0
- data/pgpool2/parser/pg_list.h +352 -0
- data/pgpool2/parser/pg_trigger.h +147 -0
- data/pgpool2/parser/pg_wchar.h +492 -0
- data/pgpool2/parser/pool_memory.c +342 -0
- data/pgpool2/parser/pool_memory.h +77 -0
- data/pgpool2/parser/pool_parser.h +222 -0
- data/pgpool2/parser/pool_string.c +121 -0
- data/pgpool2/parser/pool_string.h +37 -0
- data/pgpool2/parser/primnodes.h +1280 -0
- data/pgpool2/parser/scan.c +4094 -0
- data/pgpool2/parser/scan.l +1451 -0
- data/pgpool2/parser/scanner.h +120 -0
- data/pgpool2/parser/scansup.c +221 -0
- data/pgpool2/parser/scansup.h +28 -0
- data/pgpool2/parser/snprintf.c +1102 -0
- data/pgpool2/parser/stringinfo.c +294 -0
- data/pgpool2/parser/stringinfo.h +178 -0
- data/pgpool2/parser/value.c +78 -0
- data/pgpool2/parser/value.h +62 -0
- data/pgpool2/parser/wchar.c +2048 -0
- data/pgpool2/pcp.conf.sample +28 -0
- data/pgpool2/pcp/Makefile.am +40 -0
- data/pgpool2/pcp/Makefile.in +771 -0
- data/pgpool2/pcp/libpcp_ext.h +250 -0
- data/pgpool2/pcp/md5.c +444 -0
- data/pgpool2/pcp/md5.h +28 -0
- data/pgpool2/pcp/pcp.c +1652 -0
- data/pgpool2/pcp/pcp.h +61 -0
- data/pgpool2/pcp/pcp_attach_node.c +172 -0
- data/pgpool2/pcp/pcp_detach_node.c +185 -0
- data/pgpool2/pcp/pcp_error.c +87 -0
- data/pgpool2/pcp/pcp_node_count.c +160 -0
- data/pgpool2/pcp/pcp_node_info.c +198 -0
- data/pgpool2/pcp/pcp_pool_status.c +166 -0
- data/pgpool2/pcp/pcp_proc_count.c +166 -0
- data/pgpool2/pcp/pcp_proc_info.c +261 -0
- data/pgpool2/pcp/pcp_promote_node.c +185 -0
- data/pgpool2/pcp/pcp_recovery_node.c +172 -0
- data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
- data/pgpool2/pcp/pcp_stream.c +385 -0
- data/pgpool2/pcp/pcp_stream.h +52 -0
- data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
- data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
- data/pgpool2/pcp_child.c +1493 -0
- data/pgpool2/pg_md5.c +305 -0
- data/pgpool2/pgpool.8.in +121 -0
- data/pgpool2/pgpool.conf +553 -0
- data/pgpool2/pgpool.conf.sample +666 -0
- data/pgpool2/pgpool.conf.sample-master-slave +665 -0
- data/pgpool2/pgpool.conf.sample-replication +664 -0
- data/pgpool2/pgpool.conf.sample-stream +664 -0
- data/pgpool2/pgpool.spec +264 -0
- data/pgpool2/pgpool_adm/TODO +7 -0
- data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
- data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
- data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
- data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
- data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
- data/pgpool2/pool.h +655 -0
- data/pgpool2/pool_auth.c +1390 -0
- data/pgpool2/pool_config.c +5007 -0
- data/pgpool2/pool_config.h +284 -0
- data/pgpool2/pool_config.l +3281 -0
- data/pgpool2/pool_config_md5.c +29 -0
- data/pgpool2/pool_connection_pool.c +812 -0
- data/pgpool2/pool_error.c +242 -0
- data/pgpool2/pool_globals.c +27 -0
- data/pgpool2/pool_hba.c +1723 -0
- data/pgpool2/pool_hba.conf.sample +67 -0
- data/pgpool2/pool_ip.c +567 -0
- data/pgpool2/pool_ip.h +65 -0
- data/pgpool2/pool_ipc.h +38 -0
- data/pgpool2/pool_lobj.c +242 -0
- data/pgpool2/pool_lobj.h +32 -0
- data/pgpool2/pool_memqcache.c +3818 -0
- data/pgpool2/pool_memqcache.h +268 -0
- data/pgpool2/pool_params.c +163 -0
- data/pgpool2/pool_passwd.c +249 -0
- data/pgpool2/pool_passwd.h +41 -0
- data/pgpool2/pool_path.c +193 -0
- data/pgpool2/pool_path.h +81 -0
- data/pgpool2/pool_process_context.c +247 -0
- data/pgpool2/pool_process_context.h +62 -0
- data/pgpool2/pool_process_query.c +5001 -0
- data/pgpool2/pool_process_reporting.c +1671 -0
- data/pgpool2/pool_process_reporting.h +44 -0
- data/pgpool2/pool_proto2.c +671 -0
- data/pgpool2/pool_proto_modules.c +3524 -0
- data/pgpool2/pool_proto_modules.h +185 -0
- data/pgpool2/pool_query_cache.c +1020 -0
- data/pgpool2/pool_query_context.c +1871 -0
- data/pgpool2/pool_query_context.h +105 -0
- data/pgpool2/pool_relcache.c +284 -0
- data/pgpool2/pool_relcache.h +78 -0
- data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
- data/pgpool2/pool_rewrite_query.c +715 -0
- data/pgpool2/pool_rewrite_query.h +192 -0
- data/pgpool2/pool_select_walker.c +1150 -0
- data/pgpool2/pool_select_walker.h +68 -0
- data/pgpool2/pool_sema.c +161 -0
- data/pgpool2/pool_session_context.c +952 -0
- data/pgpool2/pool_session_context.h +203 -0
- data/pgpool2/pool_shmem.c +185 -0
- data/pgpool2/pool_signal.c +158 -0
- data/pgpool2/pool_signal.h +61 -0
- data/pgpool2/pool_ssl.c +339 -0
- data/pgpool2/pool_stream.c +962 -0
- data/pgpool2/pool_stream.h +61 -0
- data/pgpool2/pool_system.c +659 -0
- data/pgpool2/pool_timestamp.c +1215 -0
- data/pgpool2/pool_timestamp.h +38 -0
- data/pgpool2/pool_type.h +171 -0
- data/pgpool2/pool_worker_child.c +384 -0
- data/pgpool2/ps_status.c +404 -0
- data/pgpool2/recovery.c +435 -0
- data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
- data/pgpool2/redhat/pgpool.init +201 -0
- data/pgpool2/redhat/pgpool.sysconfig +7 -0
- data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
- data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
- data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
- data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
- data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
- data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
- data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
- data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
- data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
- data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
- data/pgpool2/sample/dist_def_pgbench.sql +73 -0
- data/pgpool2/sample/pgpool.pam +3 -0
- data/pgpool2/sample/pgpool_recovery +20 -0
- data/pgpool2/sample/pgpool_recovery_pitr +19 -0
- data/pgpool2/sample/pgpool_remote_start +13 -0
- data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
- data/pgpool2/sql/insert_lock.sql +15 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
- data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
- data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
- data/pgpool2/sql/system_db.sql +38 -0
- data/pgpool2/strlcpy.c +85 -0
- data/pgpool2/test/C/test_extended.c +98 -0
- data/pgpool2/test/jdbc/.cvsignore +2 -0
- data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
- data/pgpool2/test/jdbc/BatchTest.java +55 -0
- data/pgpool2/test/jdbc/ColumnTest.java +60 -0
- data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
- data/pgpool2/test/jdbc/InsertTest.java +34 -0
- data/pgpool2/test/jdbc/LockTest.java +36 -0
- data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
- data/pgpool2/test/jdbc/README.euc_jp +73 -0
- data/pgpool2/test/jdbc/RunTest.java +83 -0
- data/pgpool2/test/jdbc/SelectTest.java +37 -0
- data/pgpool2/test/jdbc/UpdateTest.java +32 -0
- data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
- data/pgpool2/test/jdbc/expected/autocommit +10 -0
- data/pgpool2/test/jdbc/expected/batch +1 -0
- data/pgpool2/test/jdbc/expected/column +100 -0
- data/pgpool2/test/jdbc/expected/insert +1 -0
- data/pgpool2/test/jdbc/expected/lock +100 -0
- data/pgpool2/test/jdbc/expected/select +2 -0
- data/pgpool2/test/jdbc/expected/update +1 -0
- data/pgpool2/test/jdbc/pgpool.properties +7 -0
- data/pgpool2/test/jdbc/prepare.sql +54 -0
- data/pgpool2/test/jdbc/run.sh +6 -0
- data/pgpool2/test/parser/.cvsignore +6 -0
- data/pgpool2/test/parser/README +32 -0
- data/pgpool2/test/parser/expected/copy.out +17 -0
- data/pgpool2/test/parser/expected/create.out +64 -0
- data/pgpool2/test/parser/expected/cursor.out +37 -0
- data/pgpool2/test/parser/expected/delete.out +10 -0
- data/pgpool2/test/parser/expected/drop.out +12 -0
- data/pgpool2/test/parser/expected/insert.out +13 -0
- data/pgpool2/test/parser/expected/misc.out +28 -0
- data/pgpool2/test/parser/expected/prepare.out +4 -0
- data/pgpool2/test/parser/expected/privileges.out +31 -0
- data/pgpool2/test/parser/expected/scanner.out +30 -0
- data/pgpool2/test/parser/expected/select.out +89 -0
- data/pgpool2/test/parser/expected/transaction.out +38 -0
- data/pgpool2/test/parser/expected/update.out +11 -0
- data/pgpool2/test/parser/expected/v84.out +37 -0
- data/pgpool2/test/parser/expected/v90.out +25 -0
- data/pgpool2/test/parser/expected/var.out +22 -0
- data/pgpool2/test/parser/input/alter.sql +2 -0
- data/pgpool2/test/parser/input/copy.sql +17 -0
- data/pgpool2/test/parser/input/create.sql +64 -0
- data/pgpool2/test/parser/input/cursor.sql +37 -0
- data/pgpool2/test/parser/input/delete.sql +10 -0
- data/pgpool2/test/parser/input/drop.sql +12 -0
- data/pgpool2/test/parser/input/insert.sql +13 -0
- data/pgpool2/test/parser/input/misc.sql +28 -0
- data/pgpool2/test/parser/input/prepare.sql +4 -0
- data/pgpool2/test/parser/input/privileges.sql +31 -0
- data/pgpool2/test/parser/input/scanner.sql +34 -0
- data/pgpool2/test/parser/input/select.sql +89 -0
- data/pgpool2/test/parser/input/transaction.sql +38 -0
- data/pgpool2/test/parser/input/update.sql +11 -0
- data/pgpool2/test/parser/input/v84.sql +37 -0
- data/pgpool2/test/parser/input/v90.sql +38 -0
- data/pgpool2/test/parser/input/var.sql +22 -0
- data/pgpool2/test/parser/main.c +96 -0
- data/pgpool2/test/parser/parse_schedule +16 -0
- data/pgpool2/test/parser/pool.h +13 -0
- data/pgpool2/test/parser/run-test +62 -0
- data/pgpool2/test/pdo-test/README.euc_jp +58 -0
- data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
- data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
- data/pgpool2/test/pdo-test/collections.inc +11 -0
- data/pgpool2/test/pdo-test/def.inc +7 -0
- data/pgpool2/test/pdo-test/log.txt +0 -0
- data/pgpool2/test/pdo-test/mod/database.inc +36 -0
- data/pgpool2/test/pdo-test/mod/def.inc +0 -0
- data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
- data/pgpool2/test/pdo-test/pdotest.php +11 -0
- data/pgpool2/test/pdo-test/regsql.inc +56 -0
- data/pgpool2/test/pgpool_setup +898 -0
- data/pgpool2/test/regression/README +39 -0
- data/pgpool2/test/regression/clean.sh +21 -0
- data/pgpool2/test/regression/libs.sh +16 -0
- data/pgpool2/test/regression/regress.sh +166 -0
- data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
- data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
- data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
- data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
- data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
- data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
- data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
- data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
- data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
- data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
- data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
- data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
- data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
- data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
- data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
- data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
- data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
- data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
- data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
- data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
- data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
- data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
- data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
- data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
- data/pgpool2/test/timestamp/expected/insert.out +16 -0
- data/pgpool2/test/timestamp/expected/misc.out +3 -0
- data/pgpool2/test/timestamp/expected/update.out +6 -0
- data/pgpool2/test/timestamp/input/insert.sql +16 -0
- data/pgpool2/test/timestamp/input/misc.sql +3 -0
- data/pgpool2/test/timestamp/input/update.sql +6 -0
- data/pgpool2/test/timestamp/main.c +129 -0
- data/pgpool2/test/timestamp/parse_schedule +3 -0
- data/pgpool2/test/timestamp/run-test +69 -0
- data/pgpool2/version.h +1 -0
- data/pgpool2/watchdog/Makefile.am +17 -0
- data/pgpool2/watchdog/Makefile.in +505 -0
- data/pgpool2/watchdog/test/stab.c +266 -0
- data/pgpool2/watchdog/test/test.c +85 -0
- data/pgpool2/watchdog/test/wd_child_t.c +87 -0
- data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
- data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
- data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
- data/pgpool2/watchdog/watchdog.c +408 -0
- data/pgpool2/watchdog/watchdog.h +209 -0
- data/pgpool2/watchdog/wd_child.c +444 -0
- data/pgpool2/watchdog/wd_ext.h +123 -0
- data/pgpool2/watchdog/wd_heartbeat.c +577 -0
- data/pgpool2/watchdog/wd_if.c +216 -0
- data/pgpool2/watchdog/wd_init.c +126 -0
- data/pgpool2/watchdog/wd_interlock.c +347 -0
- data/pgpool2/watchdog/wd_lifecheck.c +512 -0
- data/pgpool2/watchdog/wd_list.c +429 -0
- data/pgpool2/watchdog/wd_packet.c +1159 -0
- data/pgpool2/watchdog/wd_ping.c +330 -0
- data/pgpool2/ylwrap +223 -0
- data/pgsql/presto_client.py +346 -0
- data/pgsql/prestogres.py +156 -0
- data/pgsql/setup_functions.sql +21 -0
- data/pgsql/setup_language.sql +3 -0
- data/prestogres.gemspec +23 -0
- metadata +496 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/* -*-pgsql-c-*- */
|
|
2
|
+
/*
|
|
3
|
+
*
|
|
4
|
+
* $Header$
|
|
5
|
+
*
|
|
6
|
+
* pgpool: a language independent connection pool server for PostgreSQL
|
|
7
|
+
* written by Tatsuo Ishii
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2003-2012 PgPool Global Development Group
|
|
10
|
+
*
|
|
11
|
+
* Permission to use, copy, modify, and distribute this software and
|
|
12
|
+
* its documentation for any purpose and without fee is hereby
|
|
13
|
+
* granted, provided that the above copyright notice appear in all
|
|
14
|
+
* copies and that both that copyright notice and this permission
|
|
15
|
+
* notice appear in supporting documentation, and that the name of the
|
|
16
|
+
* author not be used in advertising or publicity pertaining to
|
|
17
|
+
* distribution of the software without specific, written prior
|
|
18
|
+
* permission. The author makes no representations about the
|
|
19
|
+
* suitability of this software for any purpose. It is provided "as
|
|
20
|
+
* is" without express or implied warranty.
|
|
21
|
+
*
|
|
22
|
+
* watchdog.h.: watchdog definition header file
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
#ifndef WATCHDOG_H
|
|
27
|
+
#define WATCHDOG_H
|
|
28
|
+
|
|
29
|
+
#include <sys/time.h>
|
|
30
|
+
#include "libpq-fe.h"
|
|
31
|
+
|
|
32
|
+
#include "md5.h"
|
|
33
|
+
|
|
34
|
+
#define WD_MAX_HOST_NAMELEN (128)
|
|
35
|
+
#define WD_MAX_PATH_LEN (128)
|
|
36
|
+
#define MAX_WATCHDOG_NUM (128)
|
|
37
|
+
#define WD_SEND_TIMEOUT (1)
|
|
38
|
+
#define WD_MAX_IF_NUM (256)
|
|
39
|
+
#define WD_MAX_IF_NAME_LEN (16)
|
|
40
|
+
|
|
41
|
+
#define WD_INFO(wd_id) (pool_config->other_wd->wd_info[(wd_id)])
|
|
42
|
+
#define WD_HB_IF(if_id) (pool_config->hb_if[(if_id)])
|
|
43
|
+
|
|
44
|
+
#define WD_MYSELF (WD_List)
|
|
45
|
+
|
|
46
|
+
#define WD_NG (0)
|
|
47
|
+
#define WD_OK (1)
|
|
48
|
+
|
|
49
|
+
#define WD_MAX_PACKET_STRING (256)
|
|
50
|
+
|
|
51
|
+
#define WD_TIME_INIT(tv) ((tv).tv_sec = (tv).tv_usec = 0)
|
|
52
|
+
#define WD_TIME_ISSET(tv) ((tv).tv_sec || (tv).tv_usec)
|
|
53
|
+
#define WD_TIME_BEFORE(a,b) (((a).tv_sec == (b).tv_sec) ? \
|
|
54
|
+
((a).tv_usec < (b).tv_usec) : \
|
|
55
|
+
((a).tv_sec < (b).tv_sec))
|
|
56
|
+
#define WD_TIME_DIFF_SEC(a,b) (int)(((a).tv_sec - (b).tv_sec) + \
|
|
57
|
+
((a).tv_usec - (b).tv_usec) / 1000000.0)
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* packet number of watchdog negotiation
|
|
61
|
+
*/
|
|
62
|
+
typedef enum {
|
|
63
|
+
|
|
64
|
+
/* normal packet */
|
|
65
|
+
WD_INVALID = 0, /* invalid packet no */
|
|
66
|
+
WD_INFO_REQ, /* information request */
|
|
67
|
+
WD_ADD_REQ, /* add request into the watchdog list */
|
|
68
|
+
WD_ADD_ACCEPT, /* accept the add request */
|
|
69
|
+
WD_ADD_REJECT, /* reject the add request */
|
|
70
|
+
WD_STAND_FOR_MASTER, /* announce candidacy */
|
|
71
|
+
WD_VOTE_YOU, /* agree to the candidacy */
|
|
72
|
+
WD_MASTER_EXIST, /* disagree to the candidacy */
|
|
73
|
+
WD_DECLARE_NEW_MASTER, /* announce assumption */
|
|
74
|
+
WD_STAND_FOR_LOCK_HOLDER, /* announce candidacy for lock holder */
|
|
75
|
+
WD_LOCK_HOLDER_EXIST, /* reject the assumption for lock holder */
|
|
76
|
+
WD_DECLARE_LOCK_HOLDER, /* announce to assume lock holder */
|
|
77
|
+
WD_RESIGN_LOCK_HOLDER, /* announce to resign lock holder */
|
|
78
|
+
WD_START_INTERLOCK, /* announce to start interlocking */
|
|
79
|
+
WD_END_INTERLOCK, /* announce to end interlocking */
|
|
80
|
+
WD_SERVER_DOWN, /* announce server down */
|
|
81
|
+
WD_AUTH_FAILED, /* fail answer to authentication */
|
|
82
|
+
WD_READY, /* answer to the announce */
|
|
83
|
+
|
|
84
|
+
/* node packet */
|
|
85
|
+
WD_START_RECOVERY, /* announce start online recovery */
|
|
86
|
+
WD_END_RECOVERY, /* announce end online recovery */
|
|
87
|
+
WD_FAILBACK_REQUEST, /* announce failback request */
|
|
88
|
+
WD_DEGENERATE_BACKEND, /* announce degenerate backend */
|
|
89
|
+
WD_PROMOTE_BACKEND, /* announce promote backend */
|
|
90
|
+
WD_NODE_READY, /* answer to the node announce */
|
|
91
|
+
WD_NODE_FAILED, /* fail answer to the node announce */
|
|
92
|
+
|
|
93
|
+
/* lock packet */
|
|
94
|
+
WD_UNLOCK_REQUEST, /* announce to unlock command */
|
|
95
|
+
WD_LOCK_READY, /* answer to the lock announce */
|
|
96
|
+
WD_LOCK_FAILED /* fail answer to the lock announce */
|
|
97
|
+
|
|
98
|
+
} WD_PACKET_NO;
|
|
99
|
+
|
|
100
|
+
/*
|
|
101
|
+
* watchdog status
|
|
102
|
+
*/
|
|
103
|
+
typedef enum {
|
|
104
|
+
WD_END = 0,
|
|
105
|
+
WD_INIT,
|
|
106
|
+
WD_NORMAL,
|
|
107
|
+
WD_MASTER,
|
|
108
|
+
WD_DOWN
|
|
109
|
+
} WD_STATUS;
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* watchdog locks
|
|
113
|
+
*/
|
|
114
|
+
typedef enum {
|
|
115
|
+
WD_FAILOVER_START_LOCK = 0,
|
|
116
|
+
WD_FAILOVER_END_LOCK,
|
|
117
|
+
WD_FAILOVER_COMMAND_LOCK,
|
|
118
|
+
WD_FAILBACK_COMMAND_LOCK,
|
|
119
|
+
WD_FOLLOW_MASTER_COMMAND_LOCK,
|
|
120
|
+
WD_MAX_LOCK_NUM
|
|
121
|
+
} WD_LOCK_ID;
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
* watchdog list
|
|
125
|
+
*/
|
|
126
|
+
typedef struct WdInfo {
|
|
127
|
+
WD_STATUS status; /* status */
|
|
128
|
+
struct timeval tv; /* startup time value */
|
|
129
|
+
char hostname[WD_MAX_HOST_NAMELEN]; /* host name */
|
|
130
|
+
int pgpool_port; /* pgpool port */
|
|
131
|
+
int wd_port; /* watchdog port */
|
|
132
|
+
int life; /* life point */
|
|
133
|
+
char delegate_ip[WD_MAX_HOST_NAMELEN]; /* delegate IP */
|
|
134
|
+
int delegate_ip_flag; /* delegate IP flag */
|
|
135
|
+
struct timeval hb_send_time; /* send time */
|
|
136
|
+
struct timeval hb_last_recv_time; /* recv time */
|
|
137
|
+
bool is_lock_holder; /* lock holder flag */
|
|
138
|
+
bool in_interlocking; /* interlocking is in progress */
|
|
139
|
+
bool is_contactable; /* able to create socket and connection */
|
|
140
|
+
} WdInfo;
|
|
141
|
+
|
|
142
|
+
typedef struct {
|
|
143
|
+
int node_id_set[MAX_NUM_BACKENDS]; /* node sets */
|
|
144
|
+
int node_num; /* node number */
|
|
145
|
+
} WdNodeInfo;
|
|
146
|
+
|
|
147
|
+
typedef struct {
|
|
148
|
+
WD_LOCK_ID lock_id;
|
|
149
|
+
} WdLockInfo;
|
|
150
|
+
|
|
151
|
+
typedef union {
|
|
152
|
+
WdInfo wd_info;
|
|
153
|
+
WdNodeInfo wd_node_info;
|
|
154
|
+
WdLockInfo wd_lock_info;
|
|
155
|
+
} WD_PACKET_BODY;
|
|
156
|
+
|
|
157
|
+
typedef struct {
|
|
158
|
+
char addr[WD_MAX_HOST_NAMELEN];
|
|
159
|
+
char if_name[WD_MAX_IF_NAME_LEN];
|
|
160
|
+
int dest_port;
|
|
161
|
+
} WdHbIf;
|
|
162
|
+
|
|
163
|
+
typedef struct {
|
|
164
|
+
int num_wd; /* number of watchdogs */
|
|
165
|
+
WdInfo wd_info[MAX_WATCHDOG_NUM];
|
|
166
|
+
} WdDesc;
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* negotiation packet
|
|
170
|
+
*/
|
|
171
|
+
typedef struct {
|
|
172
|
+
WD_PACKET_NO packet_no; /* packet number */
|
|
173
|
+
WD_PACKET_BODY wd_body; /* watchdog information */
|
|
174
|
+
struct timeval send_time;
|
|
175
|
+
char hash[(MD5_PASSWD_LEN+1)*2];
|
|
176
|
+
} WdPacket;
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
* thread argument for watchdog negotiation
|
|
180
|
+
*/
|
|
181
|
+
typedef struct {
|
|
182
|
+
int sock; /* socket */
|
|
183
|
+
WdInfo * target; /* target watchdog information */
|
|
184
|
+
WdPacket * packet; /* packet data */
|
|
185
|
+
} WdPacketThreadArg;
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* heartbeat packet
|
|
189
|
+
*/
|
|
190
|
+
typedef struct {
|
|
191
|
+
char from[WD_MAX_HOST_NAMELEN];
|
|
192
|
+
int from_pgpool_port;
|
|
193
|
+
struct timeval send_time;
|
|
194
|
+
WD_STATUS status;
|
|
195
|
+
char hash[(MD5_PASSWD_LEN+1)*2];
|
|
196
|
+
} WdHbPacket;
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* thread argument for lifecheck of pgpool
|
|
200
|
+
*/
|
|
201
|
+
typedef struct {
|
|
202
|
+
PGconn * conn; /* PGconn */
|
|
203
|
+
int retry; /* retry times (not used?)*/
|
|
204
|
+
} WdPgpoolThreadArg;
|
|
205
|
+
|
|
206
|
+
extern WdInfo * WD_List;
|
|
207
|
+
extern unsigned char * WD_Node_List;
|
|
208
|
+
|
|
209
|
+
#endif /* WATCHDOG_H */
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/* -*-pgsql-c-*- */
|
|
2
|
+
/*
|
|
3
|
+
* $Header$
|
|
4
|
+
*
|
|
5
|
+
* pgpool: a language independent connection pool server for PostgreSQL
|
|
6
|
+
* written by Tatsuo Ishii
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2003-2012 PgPool Global Development Group
|
|
9
|
+
*
|
|
10
|
+
* Permission to use, copy, modify, and distribute this software and
|
|
11
|
+
* its documentation for any purpose and without fee is hereby
|
|
12
|
+
* granted, provided that the above copyright notice appear in all
|
|
13
|
+
* copies and that both that copyright notice and this permission
|
|
14
|
+
* notice appear in supporting documentation, and that the name of the
|
|
15
|
+
* author not be used in advertising or publicity pertaining to
|
|
16
|
+
* distribution of the software without specific, written prior
|
|
17
|
+
* permission. The author makes no representations about the
|
|
18
|
+
* suitability of this software for any purpose. It is provided "as
|
|
19
|
+
* is" without express or implied warranty.
|
|
20
|
+
*
|
|
21
|
+
* child.c: child process main
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
#include <sys/types.h>
|
|
25
|
+
#include <sys/socket.h>
|
|
26
|
+
#include <signal.h>
|
|
27
|
+
#include <stdio.h>
|
|
28
|
+
#include <errno.h>
|
|
29
|
+
#include <string.h>
|
|
30
|
+
#include <unistd.h>
|
|
31
|
+
#include <stdlib.h>
|
|
32
|
+
#include <sys/time.h>
|
|
33
|
+
#include "pool.h"
|
|
34
|
+
#include "watchdog.h"
|
|
35
|
+
#include "pool_config.h"
|
|
36
|
+
#include "wd_ext.h"
|
|
37
|
+
|
|
38
|
+
pid_t wd_child(int fork_wait_time);
|
|
39
|
+
static void wd_child_exit(int exit_signo);
|
|
40
|
+
static int wd_send_response(int sock, WdPacket * recv_pack);
|
|
41
|
+
static void wd_node_request_signal(WD_PACKET_NO packet_no, WdNodeInfo *node);
|
|
42
|
+
|
|
43
|
+
pid_t
|
|
44
|
+
wd_child(int fork_wait_time)
|
|
45
|
+
{
|
|
46
|
+
int sock;
|
|
47
|
+
int fd;
|
|
48
|
+
int rtn;
|
|
49
|
+
pid_t pid = 0;
|
|
50
|
+
|
|
51
|
+
pid = fork();
|
|
52
|
+
if (pid != 0)
|
|
53
|
+
{
|
|
54
|
+
if (pid == -1)
|
|
55
|
+
pool_error("wd_child: fork() failed.");
|
|
56
|
+
|
|
57
|
+
return pid;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (fork_wait_time > 0)
|
|
61
|
+
{
|
|
62
|
+
sleep(fork_wait_time);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
myargv = save_ps_display_args(myargc, myargv);
|
|
66
|
+
|
|
67
|
+
POOL_SETMASK(&UnBlockSig);
|
|
68
|
+
|
|
69
|
+
signal(SIGTERM, wd_child_exit);
|
|
70
|
+
signal(SIGINT, wd_child_exit);
|
|
71
|
+
signal(SIGQUIT, wd_child_exit);
|
|
72
|
+
signal(SIGCHLD, SIG_IGN);
|
|
73
|
+
signal(SIGHUP, SIG_IGN);
|
|
74
|
+
signal(SIGUSR1, SIG_IGN);
|
|
75
|
+
signal(SIGUSR2, SIG_IGN);
|
|
76
|
+
signal(SIGPIPE, SIG_IGN);
|
|
77
|
+
signal(SIGALRM, SIG_IGN);
|
|
78
|
+
|
|
79
|
+
init_ps_display("", "", "", "");
|
|
80
|
+
|
|
81
|
+
if (WD_List == NULL)
|
|
82
|
+
{
|
|
83
|
+
/* memory allocate is not ready */
|
|
84
|
+
wd_child_exit(15);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
sock = wd_create_recv_socket(WD_MYSELF->wd_port);
|
|
88
|
+
|
|
89
|
+
if (sock < 0)
|
|
90
|
+
{
|
|
91
|
+
/* socket create failed */
|
|
92
|
+
wd_child_exit(15);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
set_ps_display("watchdog", false);
|
|
96
|
+
|
|
97
|
+
/* child loop */
|
|
98
|
+
for(;;)
|
|
99
|
+
{
|
|
100
|
+
WdPacket buf;
|
|
101
|
+
fd = wd_accept(sock);
|
|
102
|
+
if (fd < 0)
|
|
103
|
+
{
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
rtn = wd_recv_packet(fd, &buf);
|
|
107
|
+
if (rtn == WD_OK)
|
|
108
|
+
{
|
|
109
|
+
wd_send_response(fd, &buf);
|
|
110
|
+
}
|
|
111
|
+
close(fd);
|
|
112
|
+
}
|
|
113
|
+
return pid;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static void
|
|
117
|
+
wd_child_exit(int exit_signo)
|
|
118
|
+
{
|
|
119
|
+
sigset_t mask;
|
|
120
|
+
|
|
121
|
+
sigemptyset(&mask);
|
|
122
|
+
sigaddset(&mask, SIGTERM);
|
|
123
|
+
sigaddset(&mask, SIGINT);
|
|
124
|
+
sigaddset(&mask, SIGQUIT);
|
|
125
|
+
sigaddset(&mask, SIGCHLD);
|
|
126
|
+
sigprocmask(SIG_BLOCK, &mask, NULL);
|
|
127
|
+
|
|
128
|
+
exit(0);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static int
|
|
132
|
+
wd_send_response(int sock, WdPacket * recv_pack)
|
|
133
|
+
{
|
|
134
|
+
int rtn = WD_NG;
|
|
135
|
+
WdInfo * p, *q;
|
|
136
|
+
WdNodeInfo * node;
|
|
137
|
+
WdLockInfo * lock;
|
|
138
|
+
WdPacket send_packet;
|
|
139
|
+
struct timeval tv;
|
|
140
|
+
char pack_str[WD_MAX_PACKET_STRING];
|
|
141
|
+
int pack_str_len;
|
|
142
|
+
char hash[(MD5_PASSWD_LEN+1)*2];
|
|
143
|
+
bool is_node_packet = false;
|
|
144
|
+
|
|
145
|
+
if (recv_pack == NULL)
|
|
146
|
+
{
|
|
147
|
+
return rtn;
|
|
148
|
+
}
|
|
149
|
+
memset(&send_packet, 0, sizeof(WdPacket));
|
|
150
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
151
|
+
|
|
152
|
+
/* authentication */
|
|
153
|
+
if (strlen(pool_config->wd_authkey))
|
|
154
|
+
{
|
|
155
|
+
/* calculate hash from packet */
|
|
156
|
+
pack_str_len = wd_packet_to_string(recv_pack, pack_str, sizeof(pack_str));
|
|
157
|
+
wd_calc_hash(pack_str, pack_str_len, hash);
|
|
158
|
+
|
|
159
|
+
if (strcmp(recv_pack->hash, hash))
|
|
160
|
+
{
|
|
161
|
+
pool_log("wd_send_response: watchdog authentication failed");
|
|
162
|
+
rtn = wd_authentication_failed(sock);
|
|
163
|
+
return rtn;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* set response packet no */
|
|
168
|
+
switch (recv_pack->packet_no)
|
|
169
|
+
{
|
|
170
|
+
/* information request */
|
|
171
|
+
case WD_INFO_REQ:
|
|
172
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
173
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
174
|
+
send_packet.packet_no = WD_READY;
|
|
175
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
176
|
+
break;
|
|
177
|
+
|
|
178
|
+
/* add request into the watchdog list */
|
|
179
|
+
case WD_ADD_REQ:
|
|
180
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
181
|
+
if (wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port,
|
|
182
|
+
p->delegate_ip, &(p->tv), p->status) > 0)
|
|
183
|
+
{
|
|
184
|
+
pool_log("wd_send_response: receive add request from %s:%d and accept it",
|
|
185
|
+
p->hostname, p->pgpool_port);
|
|
186
|
+
send_packet.packet_no = WD_ADD_ACCEPT;
|
|
187
|
+
}
|
|
188
|
+
else
|
|
189
|
+
{
|
|
190
|
+
pool_log("wd_send_response: receive add request from %s:%d and reject it",
|
|
191
|
+
p->hostname, p->pgpool_port);
|
|
192
|
+
send_packet.packet_no = WD_ADD_REJECT;
|
|
193
|
+
}
|
|
194
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
195
|
+
break;
|
|
196
|
+
|
|
197
|
+
/* announce candidacy to be the new master */
|
|
198
|
+
case WD_STAND_FOR_MASTER:
|
|
199
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
200
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
201
|
+
/* check exist master */
|
|
202
|
+
if ((q = wd_is_alive_master()) != NULL)
|
|
203
|
+
{
|
|
204
|
+
/* vote against the candidate */
|
|
205
|
+
send_packet.packet_no = WD_MASTER_EXIST;
|
|
206
|
+
memcpy(&(send_packet.wd_body.wd_info), q, sizeof(WdInfo));
|
|
207
|
+
|
|
208
|
+
pool_log("wd_send_response: WD_STAND_FOR_MASTER received, and voting against %s:%d",
|
|
209
|
+
p->hostname, p->pgpool_port);
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
{
|
|
213
|
+
if (WD_MYSELF->tv.tv_sec <= p->tv.tv_sec )
|
|
214
|
+
{
|
|
215
|
+
memcpy(&tv,&(p->tv),sizeof(struct timeval));
|
|
216
|
+
tv.tv_sec += 1;
|
|
217
|
+
wd_set_myself(&tv, WD_NORMAL);
|
|
218
|
+
}
|
|
219
|
+
/* vote for the candidate */
|
|
220
|
+
send_packet.packet_no = WD_VOTE_YOU;
|
|
221
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
222
|
+
|
|
223
|
+
pool_log("wd_send_response: WD_STAND_FOR_MASTER received, and voting for %s:%d",
|
|
224
|
+
p->hostname, p->pgpool_port);
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
|
|
228
|
+
/* announce assumption to be the new master */
|
|
229
|
+
case WD_DECLARE_NEW_MASTER:
|
|
230
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
231
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
232
|
+
if (WD_MYSELF->status == WD_MASTER)
|
|
233
|
+
{
|
|
234
|
+
/* resign master server */
|
|
235
|
+
pool_log("wd_send_response: WD_DECLARE_NEW_MASTER received and resign master server");
|
|
236
|
+
if (strlen(pool_config->delegate_IP) != 0)
|
|
237
|
+
wd_IP_down();
|
|
238
|
+
wd_set_myself(NULL, WD_NORMAL);
|
|
239
|
+
}
|
|
240
|
+
send_packet.packet_no = WD_READY;
|
|
241
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
242
|
+
break;
|
|
243
|
+
|
|
244
|
+
/* announce to assume lock holder */
|
|
245
|
+
case WD_STAND_FOR_LOCK_HOLDER:
|
|
246
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
247
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
248
|
+
/* only master handles lock holder assignment */
|
|
249
|
+
if (WD_MYSELF->status == WD_MASTER)
|
|
250
|
+
{
|
|
251
|
+
/* if lock holder exists yet */
|
|
252
|
+
if (wd_get_lock_holder() != NULL)
|
|
253
|
+
{
|
|
254
|
+
pool_log("wd_send_response: WD_STAND_FOR_LOCK_HOLDER received but lock holder exists already");
|
|
255
|
+
send_packet.packet_no = WD_LOCK_HOLDER_EXIST;
|
|
256
|
+
}
|
|
257
|
+
else
|
|
258
|
+
{
|
|
259
|
+
pool_log("wd_send_response: WD_STAND_FOR_LOCK_HOLDER received it");
|
|
260
|
+
wd_set_lock_holder(p, true);
|
|
261
|
+
send_packet.packet_no = WD_READY;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else
|
|
265
|
+
{
|
|
266
|
+
send_packet.packet_no = WD_READY;
|
|
267
|
+
}
|
|
268
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
269
|
+
break;
|
|
270
|
+
|
|
271
|
+
/* announce to assume lock holder */
|
|
272
|
+
case WD_DECLARE_LOCK_HOLDER:
|
|
273
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
274
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
275
|
+
if (WD_MYSELF->is_lock_holder)
|
|
276
|
+
{
|
|
277
|
+
pool_log("wd_send_response: WD_DECLARE_LOCK_HOLDER received but lock holder exists already");
|
|
278
|
+
send_packet.packet_no = WD_LOCK_HOLDER_EXIST;
|
|
279
|
+
}
|
|
280
|
+
else
|
|
281
|
+
{
|
|
282
|
+
wd_set_lock_holder(p, true);
|
|
283
|
+
send_packet.packet_no = WD_READY;
|
|
284
|
+
}
|
|
285
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
286
|
+
break;
|
|
287
|
+
|
|
288
|
+
/* announce to resign lock holder */
|
|
289
|
+
case WD_RESIGN_LOCK_HOLDER:
|
|
290
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
291
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
292
|
+
wd_set_lock_holder(p, false);
|
|
293
|
+
send_packet.packet_no = WD_READY;
|
|
294
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
295
|
+
break;
|
|
296
|
+
|
|
297
|
+
/* announce to start interlocking */
|
|
298
|
+
case WD_START_INTERLOCK:
|
|
299
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
300
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
301
|
+
wd_set_interlocking(p, true);
|
|
302
|
+
send_packet.packet_no = WD_READY;
|
|
303
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
304
|
+
break;
|
|
305
|
+
|
|
306
|
+
/* announce to end interlocking */
|
|
307
|
+
case WD_END_INTERLOCK:
|
|
308
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
309
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), p->status);
|
|
310
|
+
wd_set_interlocking(p, false);
|
|
311
|
+
send_packet.packet_no = WD_READY;
|
|
312
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
313
|
+
break;
|
|
314
|
+
|
|
315
|
+
/* announce that server is down */
|
|
316
|
+
case WD_SERVER_DOWN:
|
|
317
|
+
p = &(recv_pack->wd_body.wd_info);
|
|
318
|
+
wd_set_wd_list(p->hostname, p->pgpool_port, p->wd_port, p->delegate_ip, &(p->tv), WD_DOWN);
|
|
319
|
+
send_packet.packet_no = WD_READY;
|
|
320
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
321
|
+
if (wd_am_I_oldest() == WD_OK && WD_MYSELF->status != WD_MASTER)
|
|
322
|
+
{
|
|
323
|
+
wd_escalation();
|
|
324
|
+
}
|
|
325
|
+
break;
|
|
326
|
+
|
|
327
|
+
/* announce start online recovery */
|
|
328
|
+
case WD_START_RECOVERY:
|
|
329
|
+
if (*InRecovery != RECOVERY_INIT)
|
|
330
|
+
{
|
|
331
|
+
send_packet.packet_no = WD_NODE_FAILED;
|
|
332
|
+
}
|
|
333
|
+
else
|
|
334
|
+
{
|
|
335
|
+
send_packet.packet_no = WD_NODE_READY;
|
|
336
|
+
*InRecovery = RECOVERY_ONLINE;
|
|
337
|
+
if (wait_connection_closed() != 0)
|
|
338
|
+
{
|
|
339
|
+
send_packet.packet_no = WD_NODE_FAILED;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
break;
|
|
343
|
+
|
|
344
|
+
/* announce end online recovery */
|
|
345
|
+
case WD_END_RECOVERY:
|
|
346
|
+
send_packet.packet_no = WD_NODE_READY;
|
|
347
|
+
*InRecovery = RECOVERY_INIT;
|
|
348
|
+
kill(wd_ppid, SIGUSR2);
|
|
349
|
+
break;
|
|
350
|
+
|
|
351
|
+
/* announce failback request */
|
|
352
|
+
case WD_FAILBACK_REQUEST:
|
|
353
|
+
if (Req_info->switching)
|
|
354
|
+
{
|
|
355
|
+
pool_log("wd_send_response: failback request from other pgpool is canceled because it's while switching");
|
|
356
|
+
send_packet.packet_no = WD_NODE_FAILED;
|
|
357
|
+
}
|
|
358
|
+
else
|
|
359
|
+
{
|
|
360
|
+
node = &(recv_pack->wd_body.wd_node_info);
|
|
361
|
+
wd_set_node_mask(WD_FAILBACK_REQUEST,node->node_id_set,node->node_num);
|
|
362
|
+
is_node_packet = true;
|
|
363
|
+
send_packet.packet_no = WD_NODE_READY;
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
|
|
367
|
+
/* announce degenerate backend */
|
|
368
|
+
case WD_DEGENERATE_BACKEND:
|
|
369
|
+
if (Req_info->switching)
|
|
370
|
+
{
|
|
371
|
+
pool_log("wd_send_response: failover request from other pgpool is canceled because it's while switching");
|
|
372
|
+
send_packet.packet_no = WD_NODE_FAILED;
|
|
373
|
+
}
|
|
374
|
+
else
|
|
375
|
+
{
|
|
376
|
+
node = &(recv_pack->wd_body.wd_node_info);
|
|
377
|
+
wd_set_node_mask(WD_DEGENERATE_BACKEND,node->node_id_set, node->node_num);
|
|
378
|
+
is_node_packet = true;
|
|
379
|
+
send_packet.packet_no = WD_NODE_READY;
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
|
|
383
|
+
/* announce promote backend */
|
|
384
|
+
case WD_PROMOTE_BACKEND:
|
|
385
|
+
if (Req_info->switching)
|
|
386
|
+
{
|
|
387
|
+
pool_log("wd_send_response: promote request from other pgpool is canceled because it's while switching");
|
|
388
|
+
send_packet.packet_no = WD_NODE_FAILED;
|
|
389
|
+
}
|
|
390
|
+
else
|
|
391
|
+
{
|
|
392
|
+
node = &(recv_pack->wd_body.wd_node_info);
|
|
393
|
+
wd_set_node_mask(WD_PROMOTE_BACKEND,node->node_id_set, node->node_num);
|
|
394
|
+
is_node_packet = true;
|
|
395
|
+
send_packet.packet_no = WD_NODE_READY;
|
|
396
|
+
}
|
|
397
|
+
break;
|
|
398
|
+
|
|
399
|
+
/* announce to unlock command */
|
|
400
|
+
case WD_UNLOCK_REQUEST:
|
|
401
|
+
lock = &(recv_pack->wd_body.wd_lock_info);
|
|
402
|
+
wd_set_lock(lock->lock_id, false);
|
|
403
|
+
send_packet.packet_no = WD_LOCK_READY;
|
|
404
|
+
break;
|
|
405
|
+
|
|
406
|
+
default:
|
|
407
|
+
send_packet.packet_no = WD_INVALID;
|
|
408
|
+
memcpy(&(send_packet.wd_body.wd_info), WD_MYSELF, sizeof(WdInfo));
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/* send response packet */
|
|
413
|
+
rtn = wd_send_packet(sock, &send_packet);
|
|
414
|
+
|
|
415
|
+
/* send node request signal.
|
|
416
|
+
* wd_node_request_signal() uses a semaphore lock internally, so should be
|
|
417
|
+
* called after sending a response packet to prevent dead lock.
|
|
418
|
+
*/
|
|
419
|
+
if (is_node_packet)
|
|
420
|
+
wd_node_request_signal(recv_pack->packet_no, node);
|
|
421
|
+
|
|
422
|
+
return rtn;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* send node request signal for other pgpool*/
|
|
426
|
+
static void
|
|
427
|
+
wd_node_request_signal(WD_PACKET_NO packet_no, WdNodeInfo *node)
|
|
428
|
+
{
|
|
429
|
+
switch (packet_no)
|
|
430
|
+
{
|
|
431
|
+
case WD_FAILBACK_REQUEST:
|
|
432
|
+
send_failback_request(node->node_id_set[0]);
|
|
433
|
+
break;
|
|
434
|
+
case WD_DEGENERATE_BACKEND:
|
|
435
|
+
degenerate_backend_set(node->node_id_set, node->node_num);
|
|
436
|
+
break;
|
|
437
|
+
case WD_PROMOTE_BACKEND:
|
|
438
|
+
promote_backend(node->node_id_set[0]);
|
|
439
|
+
break;
|
|
440
|
+
default:
|
|
441
|
+
pool_error("wd_node_request_signal: unknown packet number");
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|