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.
Files changed (393) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +20 -0
  4. data/LICENSE +202 -0
  5. data/NOTICE +22 -0
  6. data/README.md +217 -0
  7. data/Rakefile +13 -0
  8. data/VERSION +1 -0
  9. data/bin/prestogres +254 -0
  10. data/config/pcp.conf.sample +28 -0
  11. data/config/pgpool.conf +678 -0
  12. data/config/pool_hba.conf +84 -0
  13. data/config/pool_passwd +0 -0
  14. data/config/postgresql.conf +2 -0
  15. data/ext/.gitignore +6 -0
  16. data/ext/depend +26 -0
  17. data/ext/extconf.rb +4 -0
  18. data/ext/prestogres_config.c +12 -0
  19. data/pgpool2/.gitignore +36 -0
  20. data/pgpool2/AUTHORS +4 -0
  21. data/pgpool2/COPYING +12 -0
  22. data/pgpool2/ChangeLog +1 -0
  23. data/pgpool2/INSTALL +1 -0
  24. data/pgpool2/Makefile.am +159 -0
  25. data/pgpool2/Makefile.in +1187 -0
  26. data/pgpool2/NEWS +4960 -0
  27. data/pgpool2/README +1 -0
  28. data/pgpool2/README.euc_jp +1 -0
  29. data/pgpool2/README.online-recovery +62 -0
  30. data/pgpool2/TODO +103 -0
  31. data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
  32. data/pgpool2/aclocal.m4 +1088 -0
  33. data/pgpool2/c-compiler.m4 +134 -0
  34. data/pgpool2/c-library.m4 +325 -0
  35. data/pgpool2/child.c +2097 -0
  36. data/pgpool2/config.guess +1532 -0
  37. data/pgpool2/config.h.in +332 -0
  38. data/pgpool2/config.sub +1640 -0
  39. data/pgpool2/configure +15752 -0
  40. data/pgpool2/configure.in +392 -0
  41. data/pgpool2/depcomp +522 -0
  42. data/pgpool2/doc/basebackup.sh +17 -0
  43. data/pgpool2/doc/pgpool-de.html +4220 -0
  44. data/pgpool2/doc/pgpool-en.html +5738 -0
  45. data/pgpool2/doc/pgpool-fr.html +4118 -0
  46. data/pgpool2/doc/pgpool-ja.css +198 -0
  47. data/pgpool2/doc/pgpool-ja.html +11279 -0
  48. data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
  49. data/pgpool2/doc/pgpool.css +280 -0
  50. data/pgpool2/doc/pgpool_remote_start +13 -0
  51. data/pgpool2/doc/recovery.conf.sample +117 -0
  52. data/pgpool2/doc/tutorial-en.html +707 -0
  53. data/pgpool2/doc/tutorial-ja.html +422 -0
  54. data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
  55. data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
  56. data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
  57. data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
  58. data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
  59. data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
  60. data/pgpool2/doc/tutorial-zh_cn.html +537 -0
  61. data/pgpool2/doc/watchdog.png +0 -0
  62. data/pgpool2/doc/wd-en.html +236 -0
  63. data/pgpool2/doc/wd-en.jpg +0 -0
  64. data/pgpool2/doc/wd-ja.html +219 -0
  65. data/pgpool2/doc/wd-ja.jpg +0 -0
  66. data/pgpool2/doc/wd-zh_cn.html +201 -0
  67. data/pgpool2/doc/where_to_send_queries.odg +0 -0
  68. data/pgpool2/doc/where_to_send_queries.pdf +0 -0
  69. data/pgpool2/general.m4 +166 -0
  70. data/pgpool2/getopt_long.c +200 -0
  71. data/pgpool2/getopt_long.h +44 -0
  72. data/pgpool2/install-sh +251 -0
  73. data/pgpool2/ltmain.sh +8406 -0
  74. data/pgpool2/m4/libtool.m4 +7360 -0
  75. data/pgpool2/m4/ltoptions.m4 +368 -0
  76. data/pgpool2/m4/ltsugar.m4 +123 -0
  77. data/pgpool2/m4/ltversion.m4 +23 -0
  78. data/pgpool2/m4/lt~obsolete.m4 +92 -0
  79. data/pgpool2/main.c +2971 -0
  80. data/pgpool2/md5.c +444 -0
  81. data/pgpool2/md5.h +28 -0
  82. data/pgpool2/missing +360 -0
  83. data/pgpool2/mkinstalldirs +40 -0
  84. data/pgpool2/parser/Makefile.am +50 -0
  85. data/pgpool2/parser/Makefile.in +559 -0
  86. data/pgpool2/parser/copyfuncs.c +3310 -0
  87. data/pgpool2/parser/gram.c +39100 -0
  88. data/pgpool2/parser/gram.h +940 -0
  89. data/pgpool2/parser/gram.y +13408 -0
  90. data/pgpool2/parser/gramparse.h +74 -0
  91. data/pgpool2/parser/keywords.c +32 -0
  92. data/pgpool2/parser/keywords.h +39 -0
  93. data/pgpool2/parser/kwlist.h +425 -0
  94. data/pgpool2/parser/kwlookup.c +88 -0
  95. data/pgpool2/parser/list.c +1156 -0
  96. data/pgpool2/parser/makefuncs.c +518 -0
  97. data/pgpool2/parser/makefuncs.h +83 -0
  98. data/pgpool2/parser/memnodes.h +79 -0
  99. data/pgpool2/parser/nodes.c +29 -0
  100. data/pgpool2/parser/nodes.h +609 -0
  101. data/pgpool2/parser/outfuncs.c +5790 -0
  102. data/pgpool2/parser/parsenodes.h +2615 -0
  103. data/pgpool2/parser/parser.c +262 -0
  104. data/pgpool2/parser/parser.h +46 -0
  105. data/pgpool2/parser/pg_class.h +158 -0
  106. data/pgpool2/parser/pg_config_manual.h +273 -0
  107. data/pgpool2/parser/pg_list.h +352 -0
  108. data/pgpool2/parser/pg_trigger.h +147 -0
  109. data/pgpool2/parser/pg_wchar.h +492 -0
  110. data/pgpool2/parser/pool_memory.c +342 -0
  111. data/pgpool2/parser/pool_memory.h +77 -0
  112. data/pgpool2/parser/pool_parser.h +222 -0
  113. data/pgpool2/parser/pool_string.c +121 -0
  114. data/pgpool2/parser/pool_string.h +37 -0
  115. data/pgpool2/parser/primnodes.h +1280 -0
  116. data/pgpool2/parser/scan.c +4094 -0
  117. data/pgpool2/parser/scan.l +1451 -0
  118. data/pgpool2/parser/scanner.h +120 -0
  119. data/pgpool2/parser/scansup.c +221 -0
  120. data/pgpool2/parser/scansup.h +28 -0
  121. data/pgpool2/parser/snprintf.c +1102 -0
  122. data/pgpool2/parser/stringinfo.c +294 -0
  123. data/pgpool2/parser/stringinfo.h +178 -0
  124. data/pgpool2/parser/value.c +78 -0
  125. data/pgpool2/parser/value.h +62 -0
  126. data/pgpool2/parser/wchar.c +2048 -0
  127. data/pgpool2/pcp.conf.sample +28 -0
  128. data/pgpool2/pcp/Makefile.am +40 -0
  129. data/pgpool2/pcp/Makefile.in +771 -0
  130. data/pgpool2/pcp/libpcp_ext.h +250 -0
  131. data/pgpool2/pcp/md5.c +444 -0
  132. data/pgpool2/pcp/md5.h +28 -0
  133. data/pgpool2/pcp/pcp.c +1652 -0
  134. data/pgpool2/pcp/pcp.h +61 -0
  135. data/pgpool2/pcp/pcp_attach_node.c +172 -0
  136. data/pgpool2/pcp/pcp_detach_node.c +185 -0
  137. data/pgpool2/pcp/pcp_error.c +87 -0
  138. data/pgpool2/pcp/pcp_node_count.c +160 -0
  139. data/pgpool2/pcp/pcp_node_info.c +198 -0
  140. data/pgpool2/pcp/pcp_pool_status.c +166 -0
  141. data/pgpool2/pcp/pcp_proc_count.c +166 -0
  142. data/pgpool2/pcp/pcp_proc_info.c +261 -0
  143. data/pgpool2/pcp/pcp_promote_node.c +185 -0
  144. data/pgpool2/pcp/pcp_recovery_node.c +172 -0
  145. data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
  146. data/pgpool2/pcp/pcp_stream.c +385 -0
  147. data/pgpool2/pcp/pcp_stream.h +52 -0
  148. data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
  149. data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
  150. data/pgpool2/pcp_child.c +1493 -0
  151. data/pgpool2/pg_md5.c +305 -0
  152. data/pgpool2/pgpool.8.in +121 -0
  153. data/pgpool2/pgpool.conf +553 -0
  154. data/pgpool2/pgpool.conf.sample +666 -0
  155. data/pgpool2/pgpool.conf.sample-master-slave +665 -0
  156. data/pgpool2/pgpool.conf.sample-replication +664 -0
  157. data/pgpool2/pgpool.conf.sample-stream +664 -0
  158. data/pgpool2/pgpool.spec +264 -0
  159. data/pgpool2/pgpool_adm/TODO +7 -0
  160. data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
  161. data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
  162. data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
  163. data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
  164. data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
  165. data/pgpool2/pool.h +655 -0
  166. data/pgpool2/pool_auth.c +1390 -0
  167. data/pgpool2/pool_config.c +5007 -0
  168. data/pgpool2/pool_config.h +284 -0
  169. data/pgpool2/pool_config.l +3281 -0
  170. data/pgpool2/pool_config_md5.c +29 -0
  171. data/pgpool2/pool_connection_pool.c +812 -0
  172. data/pgpool2/pool_error.c +242 -0
  173. data/pgpool2/pool_globals.c +27 -0
  174. data/pgpool2/pool_hba.c +1723 -0
  175. data/pgpool2/pool_hba.conf.sample +67 -0
  176. data/pgpool2/pool_ip.c +567 -0
  177. data/pgpool2/pool_ip.h +65 -0
  178. data/pgpool2/pool_ipc.h +38 -0
  179. data/pgpool2/pool_lobj.c +242 -0
  180. data/pgpool2/pool_lobj.h +32 -0
  181. data/pgpool2/pool_memqcache.c +3818 -0
  182. data/pgpool2/pool_memqcache.h +268 -0
  183. data/pgpool2/pool_params.c +163 -0
  184. data/pgpool2/pool_passwd.c +249 -0
  185. data/pgpool2/pool_passwd.h +41 -0
  186. data/pgpool2/pool_path.c +193 -0
  187. data/pgpool2/pool_path.h +81 -0
  188. data/pgpool2/pool_process_context.c +247 -0
  189. data/pgpool2/pool_process_context.h +62 -0
  190. data/pgpool2/pool_process_query.c +5001 -0
  191. data/pgpool2/pool_process_reporting.c +1671 -0
  192. data/pgpool2/pool_process_reporting.h +44 -0
  193. data/pgpool2/pool_proto2.c +671 -0
  194. data/pgpool2/pool_proto_modules.c +3524 -0
  195. data/pgpool2/pool_proto_modules.h +185 -0
  196. data/pgpool2/pool_query_cache.c +1020 -0
  197. data/pgpool2/pool_query_context.c +1871 -0
  198. data/pgpool2/pool_query_context.h +105 -0
  199. data/pgpool2/pool_relcache.c +284 -0
  200. data/pgpool2/pool_relcache.h +78 -0
  201. data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
  202. data/pgpool2/pool_rewrite_query.c +715 -0
  203. data/pgpool2/pool_rewrite_query.h +192 -0
  204. data/pgpool2/pool_select_walker.c +1150 -0
  205. data/pgpool2/pool_select_walker.h +68 -0
  206. data/pgpool2/pool_sema.c +161 -0
  207. data/pgpool2/pool_session_context.c +952 -0
  208. data/pgpool2/pool_session_context.h +203 -0
  209. data/pgpool2/pool_shmem.c +185 -0
  210. data/pgpool2/pool_signal.c +158 -0
  211. data/pgpool2/pool_signal.h +61 -0
  212. data/pgpool2/pool_ssl.c +339 -0
  213. data/pgpool2/pool_stream.c +962 -0
  214. data/pgpool2/pool_stream.h +61 -0
  215. data/pgpool2/pool_system.c +659 -0
  216. data/pgpool2/pool_timestamp.c +1215 -0
  217. data/pgpool2/pool_timestamp.h +38 -0
  218. data/pgpool2/pool_type.h +171 -0
  219. data/pgpool2/pool_worker_child.c +384 -0
  220. data/pgpool2/ps_status.c +404 -0
  221. data/pgpool2/recovery.c +435 -0
  222. data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
  223. data/pgpool2/redhat/pgpool.init +201 -0
  224. data/pgpool2/redhat/pgpool.sysconfig +7 -0
  225. data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
  226. data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
  227. data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
  228. data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
  229. data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
  230. data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
  231. data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
  232. data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
  233. data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
  234. data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
  235. data/pgpool2/sample/dist_def_pgbench.sql +73 -0
  236. data/pgpool2/sample/pgpool.pam +3 -0
  237. data/pgpool2/sample/pgpool_recovery +20 -0
  238. data/pgpool2/sample/pgpool_recovery_pitr +19 -0
  239. data/pgpool2/sample/pgpool_remote_start +13 -0
  240. data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
  241. data/pgpool2/sql/insert_lock.sql +15 -0
  242. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
  243. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
  244. data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
  245. data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
  246. data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
  247. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
  248. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
  249. data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
  250. data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
  251. data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
  252. data/pgpool2/sql/system_db.sql +38 -0
  253. data/pgpool2/strlcpy.c +85 -0
  254. data/pgpool2/test/C/test_extended.c +98 -0
  255. data/pgpool2/test/jdbc/.cvsignore +2 -0
  256. data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
  257. data/pgpool2/test/jdbc/BatchTest.java +55 -0
  258. data/pgpool2/test/jdbc/ColumnTest.java +60 -0
  259. data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
  260. data/pgpool2/test/jdbc/InsertTest.java +34 -0
  261. data/pgpool2/test/jdbc/LockTest.java +36 -0
  262. data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
  263. data/pgpool2/test/jdbc/README.euc_jp +73 -0
  264. data/pgpool2/test/jdbc/RunTest.java +83 -0
  265. data/pgpool2/test/jdbc/SelectTest.java +37 -0
  266. data/pgpool2/test/jdbc/UpdateTest.java +32 -0
  267. data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
  268. data/pgpool2/test/jdbc/expected/autocommit +10 -0
  269. data/pgpool2/test/jdbc/expected/batch +1 -0
  270. data/pgpool2/test/jdbc/expected/column +100 -0
  271. data/pgpool2/test/jdbc/expected/insert +1 -0
  272. data/pgpool2/test/jdbc/expected/lock +100 -0
  273. data/pgpool2/test/jdbc/expected/select +2 -0
  274. data/pgpool2/test/jdbc/expected/update +1 -0
  275. data/pgpool2/test/jdbc/pgpool.properties +7 -0
  276. data/pgpool2/test/jdbc/prepare.sql +54 -0
  277. data/pgpool2/test/jdbc/run.sh +6 -0
  278. data/pgpool2/test/parser/.cvsignore +6 -0
  279. data/pgpool2/test/parser/README +32 -0
  280. data/pgpool2/test/parser/expected/copy.out +17 -0
  281. data/pgpool2/test/parser/expected/create.out +64 -0
  282. data/pgpool2/test/parser/expected/cursor.out +37 -0
  283. data/pgpool2/test/parser/expected/delete.out +10 -0
  284. data/pgpool2/test/parser/expected/drop.out +12 -0
  285. data/pgpool2/test/parser/expected/insert.out +13 -0
  286. data/pgpool2/test/parser/expected/misc.out +28 -0
  287. data/pgpool2/test/parser/expected/prepare.out +4 -0
  288. data/pgpool2/test/parser/expected/privileges.out +31 -0
  289. data/pgpool2/test/parser/expected/scanner.out +30 -0
  290. data/pgpool2/test/parser/expected/select.out +89 -0
  291. data/pgpool2/test/parser/expected/transaction.out +38 -0
  292. data/pgpool2/test/parser/expected/update.out +11 -0
  293. data/pgpool2/test/parser/expected/v84.out +37 -0
  294. data/pgpool2/test/parser/expected/v90.out +25 -0
  295. data/pgpool2/test/parser/expected/var.out +22 -0
  296. data/pgpool2/test/parser/input/alter.sql +2 -0
  297. data/pgpool2/test/parser/input/copy.sql +17 -0
  298. data/pgpool2/test/parser/input/create.sql +64 -0
  299. data/pgpool2/test/parser/input/cursor.sql +37 -0
  300. data/pgpool2/test/parser/input/delete.sql +10 -0
  301. data/pgpool2/test/parser/input/drop.sql +12 -0
  302. data/pgpool2/test/parser/input/insert.sql +13 -0
  303. data/pgpool2/test/parser/input/misc.sql +28 -0
  304. data/pgpool2/test/parser/input/prepare.sql +4 -0
  305. data/pgpool2/test/parser/input/privileges.sql +31 -0
  306. data/pgpool2/test/parser/input/scanner.sql +34 -0
  307. data/pgpool2/test/parser/input/select.sql +89 -0
  308. data/pgpool2/test/parser/input/transaction.sql +38 -0
  309. data/pgpool2/test/parser/input/update.sql +11 -0
  310. data/pgpool2/test/parser/input/v84.sql +37 -0
  311. data/pgpool2/test/parser/input/v90.sql +38 -0
  312. data/pgpool2/test/parser/input/var.sql +22 -0
  313. data/pgpool2/test/parser/main.c +96 -0
  314. data/pgpool2/test/parser/parse_schedule +16 -0
  315. data/pgpool2/test/parser/pool.h +13 -0
  316. data/pgpool2/test/parser/run-test +62 -0
  317. data/pgpool2/test/pdo-test/README.euc_jp +58 -0
  318. data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
  319. data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
  320. data/pgpool2/test/pdo-test/collections.inc +11 -0
  321. data/pgpool2/test/pdo-test/def.inc +7 -0
  322. data/pgpool2/test/pdo-test/log.txt +0 -0
  323. data/pgpool2/test/pdo-test/mod/database.inc +36 -0
  324. data/pgpool2/test/pdo-test/mod/def.inc +0 -0
  325. data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
  326. data/pgpool2/test/pdo-test/pdotest.php +11 -0
  327. data/pgpool2/test/pdo-test/regsql.inc +56 -0
  328. data/pgpool2/test/pgpool_setup +898 -0
  329. data/pgpool2/test/regression/README +39 -0
  330. data/pgpool2/test/regression/clean.sh +21 -0
  331. data/pgpool2/test/regression/libs.sh +16 -0
  332. data/pgpool2/test/regression/regress.sh +166 -0
  333. data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
  334. data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
  335. data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
  336. data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
  337. data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
  338. data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
  339. data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
  340. data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
  341. data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
  342. data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
  343. data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
  344. data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
  345. data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
  346. data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
  347. data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
  348. data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
  349. data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
  350. data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
  351. data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
  352. data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
  353. data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
  354. data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
  355. data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
  356. data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
  357. data/pgpool2/test/timestamp/expected/insert.out +16 -0
  358. data/pgpool2/test/timestamp/expected/misc.out +3 -0
  359. data/pgpool2/test/timestamp/expected/update.out +6 -0
  360. data/pgpool2/test/timestamp/input/insert.sql +16 -0
  361. data/pgpool2/test/timestamp/input/misc.sql +3 -0
  362. data/pgpool2/test/timestamp/input/update.sql +6 -0
  363. data/pgpool2/test/timestamp/main.c +129 -0
  364. data/pgpool2/test/timestamp/parse_schedule +3 -0
  365. data/pgpool2/test/timestamp/run-test +69 -0
  366. data/pgpool2/version.h +1 -0
  367. data/pgpool2/watchdog/Makefile.am +17 -0
  368. data/pgpool2/watchdog/Makefile.in +505 -0
  369. data/pgpool2/watchdog/test/stab.c +266 -0
  370. data/pgpool2/watchdog/test/test.c +85 -0
  371. data/pgpool2/watchdog/test/wd_child_t.c +87 -0
  372. data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
  373. data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
  374. data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
  375. data/pgpool2/watchdog/watchdog.c +408 -0
  376. data/pgpool2/watchdog/watchdog.h +209 -0
  377. data/pgpool2/watchdog/wd_child.c +444 -0
  378. data/pgpool2/watchdog/wd_ext.h +123 -0
  379. data/pgpool2/watchdog/wd_heartbeat.c +577 -0
  380. data/pgpool2/watchdog/wd_if.c +216 -0
  381. data/pgpool2/watchdog/wd_init.c +126 -0
  382. data/pgpool2/watchdog/wd_interlock.c +347 -0
  383. data/pgpool2/watchdog/wd_lifecheck.c +512 -0
  384. data/pgpool2/watchdog/wd_list.c +429 -0
  385. data/pgpool2/watchdog/wd_packet.c +1159 -0
  386. data/pgpool2/watchdog/wd_ping.c +330 -0
  387. data/pgpool2/ylwrap +223 -0
  388. data/pgsql/presto_client.py +346 -0
  389. data/pgsql/prestogres.py +156 -0
  390. data/pgsql/setup_functions.sql +21 -0
  391. data/pgsql/setup_language.sql +3 -0
  392. data/prestogres.gemspec +23 -0
  393. 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
+ }