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,216 @@
1
+ /*
2
+ * $Header$
3
+ *
4
+ * Handles watchdog connection, and protocol communication with pgpool-II
5
+ *
6
+ * pgpool: a language independent connection pool server for PostgreSQL
7
+ * written by Tatsuo Ishii
8
+ *
9
+ * Copyright (c) 2003-2013 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
+ */
23
+
24
+ #include <pthread.h>
25
+ #include <stdio.h>
26
+ #include <errno.h>
27
+ #include <string.h>
28
+ #include <stdlib.h>
29
+ #include <unistd.h>
30
+ #include <netdb.h>
31
+ #include <sys/wait.h>
32
+ #include <sys/stat.h>
33
+ #include <ctype.h>
34
+ #include <errno.h>
35
+ #include "pool.h"
36
+ #include "pool_config.h"
37
+ #include "watchdog.h"
38
+ #include "wd_ext.h"
39
+
40
+ int wd_IP_up(void);
41
+ int wd_IP_down(void);
42
+ int wd_get_cmd(char * buf, char * cmd);
43
+ static int exec_ifconfig(char * path,char * command);
44
+
45
+ int
46
+ wd_IP_up(void)
47
+ {
48
+ int rtn = WD_OK;
49
+ char path[WD_MAX_PATH_LEN];
50
+ char cmd[128];
51
+
52
+ if (strlen(pool_config->delegate_IP) == 0)
53
+ return WD_NG;
54
+
55
+ if (WD_List->delegate_ip_flag == 0)
56
+ {
57
+ WD_List->delegate_ip_flag = 1;
58
+
59
+ wd_get_cmd(cmd,pool_config->if_up_cmd);
60
+ snprintf(path,sizeof(path),"%s/%s",pool_config->ifconfig_path,cmd);
61
+ rtn = exec_ifconfig(path,pool_config->if_up_cmd);
62
+
63
+ wd_get_cmd(cmd,pool_config->arping_cmd);
64
+ snprintf(path,sizeof(path),"%s/%s",pool_config->arping_path,cmd);
65
+ rtn = exec_ifconfig(path,pool_config->arping_cmd);
66
+ }
67
+ return rtn;
68
+ }
69
+
70
+ int
71
+ wd_IP_down(void)
72
+ {
73
+ int rtn = WD_OK;
74
+ char path[WD_MAX_PATH_LEN];
75
+ char cmd[128];
76
+ int i;
77
+
78
+ if (strlen(pool_config->delegate_IP) == 0)
79
+ return WD_NG;
80
+
81
+ if (WD_List->delegate_ip_flag == 1)
82
+ {
83
+ WD_List->delegate_ip_flag = 0;
84
+ wd_get_cmd(cmd,pool_config->if_down_cmd);
85
+ snprintf(path, sizeof(path), "%s/%s", pool_config->ifconfig_path, cmd);
86
+ rtn = exec_ifconfig(path,pool_config->if_down_cmd);
87
+
88
+ if (rtn == WD_OK)
89
+ {
90
+ for (i = 0; i < 3; i++)
91
+ {
92
+ if (wd_is_unused_ip(pool_config->delegate_IP))
93
+ break;
94
+ }
95
+
96
+ if (i >= 3)
97
+ rtn = WD_NG;
98
+ }
99
+
100
+ if (rtn == WD_OK)
101
+ pool_log("wd_IP_down: ifconfig down succeeded");
102
+ else
103
+ pool_error("wd_IP_down: ifconfig down failed");
104
+ }
105
+ else
106
+ {
107
+ pool_debug("wd_IP_down: not delegate IP holder");
108
+ }
109
+
110
+ return rtn;
111
+ }
112
+
113
+ int
114
+ wd_get_cmd(char * buf, char * cmd)
115
+ {
116
+ int i,j;
117
+ i = 0;
118
+ while(isspace(cmd[i]) != 0)
119
+ {
120
+ i++;
121
+ }
122
+ j = 0;
123
+ while(isspace(cmd[i]) == 0)
124
+ {
125
+ buf[j++] = cmd[i++];
126
+ }
127
+ buf[j] = '\0';
128
+ return strlen(buf);
129
+ }
130
+
131
+ static int
132
+ exec_ifconfig(char * path,char * command)
133
+ {
134
+ int pfd[2];
135
+ int status;
136
+ char * args[24];
137
+ int pid, i = 0;
138
+ char buf[256];
139
+ char *bp, *ep;
140
+
141
+ if (pipe(pfd) == -1)
142
+ {
143
+ pool_error("exec_ifconfig: pipe open error:%s",strerror(errno));
144
+ return WD_NG;
145
+ }
146
+ memset(buf,0,sizeof(buf));
147
+ strlcpy(buf,command,sizeof(buf));
148
+ bp = buf;
149
+ while (*bp == ' ')
150
+ {
151
+ bp ++;
152
+ }
153
+ while (*bp != '\0')
154
+ {
155
+ ep = strchr(bp,' ');
156
+ if (ep != NULL)
157
+ {
158
+ *ep = '\0';
159
+ }
160
+ if (!strncmp(bp,"$_IP_$",5))
161
+ {
162
+ args[i++] = pool_config->delegate_IP;
163
+ }
164
+ else
165
+ {
166
+ args[i++] = bp;
167
+ }
168
+ if (ep != NULL)
169
+ {
170
+ bp = ep +1;
171
+ while (*bp == ' ')
172
+ {
173
+ bp ++;
174
+ }
175
+ }
176
+ else
177
+ {
178
+ break;
179
+ }
180
+ }
181
+ args[i++] = NULL;
182
+
183
+ pid = fork();
184
+ if (pid == 0)
185
+ {
186
+ close(STDOUT_FILENO);
187
+ dup2(pfd[1], STDOUT_FILENO);
188
+ close(pfd[0]);
189
+ status = execv(path,args);
190
+ exit(0);
191
+ }
192
+ else
193
+ {
194
+ close(pfd[1]);
195
+ for (;;)
196
+ {
197
+ int result;
198
+ result = wait(&status);
199
+ if (result < 0)
200
+ {
201
+ if (errno == EINTR)
202
+ continue;
203
+ return WD_NG;
204
+ }
205
+
206
+ if (WIFEXITED(status) == 0 || WEXITSTATUS(status) != 0)
207
+ return WD_NG;
208
+ else
209
+ break;
210
+ }
211
+ close(pfd[0]);
212
+ }
213
+ return WD_OK;
214
+ }
215
+
216
+
@@ -0,0 +1,126 @@
1
+ /*
2
+ * $Header$
3
+ *
4
+ * Handles watchdog connection, and protocol communication with pgpool-II
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
+ */
23
+
24
+ #include <stdio.h>
25
+ #include <string.h>
26
+ #include <stdlib.h>
27
+ #include <sys/time.h>
28
+ #include <unistd.h>
29
+
30
+ #include "pool.h"
31
+ #include "pool_config.h"
32
+ #include "watchdog.h"
33
+ #include "wd_ext.h"
34
+
35
+ int wd_init(void);
36
+
37
+ int
38
+ wd_init(void)
39
+ {
40
+ struct timeval tv;
41
+ WdInfo * p;
42
+
43
+ /* set startup time */
44
+ gettimeofday(&tv, NULL);
45
+
46
+ /* allocate watchdog list */
47
+ if (WD_List == NULL)
48
+ {
49
+ WD_List = pool_shared_memory_create(sizeof(WdInfo) * MAX_WATCHDOG_NUM);
50
+ if (WD_List == NULL)
51
+ {
52
+ pool_error("wd_init: failed to allocate watchdog list");
53
+ return WD_NG;
54
+ }
55
+ memset(WD_List, 0, sizeof(WdInfo) * MAX_WATCHDOG_NUM);
56
+ }
57
+
58
+ /* allocate node list */
59
+ if (WD_Node_List == NULL)
60
+ {
61
+ WD_Node_List = pool_shared_memory_create(sizeof(unsigned char) * MAX_NUM_BACKENDS);
62
+ if (WD_Node_List == NULL)
63
+ {
64
+ pool_error("wd_init: failed to allocate node list");
65
+ return WD_NG;
66
+ }
67
+ memset(WD_Node_List, 0, sizeof(unsigned char) * MAX_NUM_BACKENDS);
68
+ }
69
+
70
+ /* initialize interlock */
71
+ if (wd_init_interlock() != WD_OK)
72
+ {
73
+ pool_error("wd_init: wd_init_interlock failed");
74
+ return WD_NG;
75
+ }
76
+
77
+ /* set myself to watchdog list */
78
+ wd_set_wd_list(pool_config->wd_hostname, pool_config->port,
79
+ pool_config->wd_port, pool_config->delegate_IP,
80
+ &tv, WD_NORMAL);
81
+
82
+ /* set other pgpools to watchdog list */
83
+ wd_add_wd_list(pool_config->other_wd);
84
+
85
+ /* reset time value */
86
+ p = WD_List;
87
+ while (p->status != WD_END)
88
+ {
89
+ WD_TIME_INIT(p->hb_send_time);
90
+ WD_TIME_INIT(p->hb_last_recv_time);
91
+
92
+ p++;
93
+ }
94
+
95
+ /* check upper connection */
96
+ if (strlen(pool_config->trusted_servers) &&
97
+ wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)
98
+ {
99
+ pool_error("wd_init: failed to connect trusted server");
100
+ return WD_NG;
101
+ }
102
+
103
+ /* send startup packet */
104
+ if (wd_startup() == WD_NG)
105
+ {
106
+ pool_error("wd_init: failed to start watchdog");
107
+ return WD_NG;
108
+ }
109
+
110
+ /* check existence of master pgpool */
111
+ if (wd_is_exist_master() == NULL)
112
+ {
113
+ if (strlen(pool_config->delegate_IP) != 0 &&
114
+ !wd_is_unused_ip(pool_config->delegate_IP))
115
+ {
116
+ pool_error("wd_init: delegate_IP %s already exists", pool_config->delegate_IP);
117
+ return WD_NG;
118
+ }
119
+
120
+ /* escalate to delegate_IP holder */
121
+ wd_escalation();
122
+ }
123
+
124
+ pool_log("wd_init: start watchdog");
125
+ return WD_OK;
126
+ }
@@ -0,0 +1,347 @@
1
+ /*
2
+ * $Header$
3
+ *
4
+ * Handles watchdog connection, and protocol communication with pgpool-II
5
+ *
6
+ * pgpool: a language independent connection pool server for PostgreSQL
7
+ * written by Tatsuo Ishii
8
+ *
9
+ * Copyright (c) 2003-2013 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
+ */
23
+
24
+ #include <stdio.h>
25
+ #include <string.h>
26
+ #include <stdlib.h>
27
+ #include <sys/time.h>
28
+
29
+ #include "pool.h"
30
+ #include "pool_config.h"
31
+ #include "watchdog.h"
32
+ #include "wd_ext.h"
33
+
34
+ static volatile bool * WD_Locks;
35
+
36
+ int wd_init_interlock(void);
37
+ void wd_start_interlock(bool by_health_check);
38
+ void wd_end_interlock(void);
39
+ void wd_leave_interlock(void);
40
+ void wd_wait_for_lock(WD_LOCK_ID lock_id);
41
+ bool wd_am_I_lock_holder(void);
42
+ bool wd_is_locked(WD_LOCK_ID lock_id);
43
+ void wd_set_lock(WD_LOCK_ID lock_id, bool value);
44
+ int wd_unlock(WD_LOCK_ID lock_id);
45
+
46
+ static void wd_update_lock_holder(void);
47
+ static int wd_assume_lock_holder(void);
48
+ static void wd_resign_lock_holder(void);
49
+ static void wd_lock_all(void);
50
+ static void wd_confirm_contactable(void);
51
+
52
+ static void sleep_in_waiting(void);
53
+
54
+ #define WD_INTERLOCK_WAIT_MSEC 500
55
+ #define WD_INTERLOCK_TIMEOUT_SEC 10
56
+ #define WD_INTERLOCK_WAIT_COUNT ((int) ((WD_INTERLOCK_TIMEOUT_SEC * 1000)/WD_INTERLOCK_WAIT_MSEC))
57
+
58
+ /* initialize interlock */
59
+ int
60
+ wd_init_interlock(void)
61
+ {
62
+ int alloc_size;
63
+
64
+ /* allocate WD_lock_holder */
65
+ if (WD_Locks == NULL)
66
+ {
67
+ alloc_size = sizeof(bool) * WD_MAX_LOCK_NUM;
68
+
69
+ WD_Locks = pool_shared_memory_create(alloc_size);
70
+ if (WD_Locks == NULL)
71
+ {
72
+ pool_error("wd_init_interlock: failed to allocate WD_Locks");
73
+ return WD_NG;
74
+ }
75
+ memset((void *)WD_Locks, 0, alloc_size);
76
+ }
77
+
78
+ return WD_OK;
79
+ }
80
+
81
+ /* notify to start interlocking */
82
+ void wd_start_interlock(bool by_health_check)
83
+ {
84
+ int count;
85
+ int node_id;
86
+
87
+ pool_log("wd_start_interlock: start interlocking");
88
+
89
+ /* confirm other pgpools are contactable */
90
+ wd_confirm_contactable();
91
+
92
+ /* lock all the resource */
93
+ wd_lock_all();
94
+
95
+ wd_set_interlocking(WD_MYSELF, true);
96
+ wd_send_packet_no(WD_START_INTERLOCK);
97
+
98
+ /* try to assume lock holder */
99
+ wd_assume_lock_holder();
100
+
101
+ /*
102
+ * If it is due to DB down detection by healthcheck, send failover request
103
+ * to other pgpools because detection of DB down on the others may be late.
104
+ */
105
+ if (by_health_check && wd_am_I_lock_holder())
106
+ {
107
+ node_id = Req_info->node_id[0];
108
+ wd_degenerate_backend_set(&node_id, 1);
109
+ }
110
+
111
+ /* wait for all pgpools starting interlock */
112
+ count = WD_INTERLOCK_WAIT_COUNT;
113
+ while (wd_is_locked(WD_FAILOVER_START_LOCK))
114
+ {
115
+ if (WD_MYSELF->status == WD_DOWN)
116
+ {
117
+ wd_set_lock_holder(WD_MYSELF, false);
118
+ return;
119
+ }
120
+
121
+ if (wd_am_I_lock_holder() && wd_are_interlocking_all())
122
+ {
123
+ wd_unlock(WD_FAILOVER_START_LOCK);
124
+ }
125
+
126
+ sleep_in_waiting();
127
+ if (--count < 0)
128
+ {
129
+ pool_error("wd_start_interlock: timed out");
130
+ break;
131
+ }
132
+ }
133
+ }
134
+
135
+ /* notify to end interlocking */
136
+ void wd_end_interlock(void)
137
+ {
138
+ int count;
139
+
140
+ pool_log("wd_end_interlock: end interlocking");
141
+
142
+ wd_set_interlocking(WD_MYSELF, false);
143
+ wd_send_packet_no(WD_END_INTERLOCK);
144
+
145
+ /* wait for all pgpools ending interlock */
146
+ count = WD_INTERLOCK_WAIT_COUNT;
147
+ while (wd_is_locked(WD_FAILOVER_END_LOCK))
148
+ {
149
+ if (WD_MYSELF->status == WD_DOWN)
150
+ {
151
+ wd_set_lock_holder(WD_MYSELF, false);
152
+ break;
153
+ }
154
+
155
+ if (wd_am_I_lock_holder() && !wd_get_interlocking())
156
+ {
157
+ wd_unlock(WD_FAILOVER_END_LOCK);
158
+ }
159
+
160
+ sleep_in_waiting();
161
+ if (--count < 0)
162
+ {
163
+ pool_error("wd_end_interlock: timed out");
164
+ break;
165
+ }
166
+ }
167
+
168
+ if (wd_am_I_lock_holder())
169
+ wd_resign_lock_holder();
170
+
171
+ wd_clear_interlocking_info();
172
+ }
173
+
174
+ /* leave from interlocking by the wayside */
175
+ void wd_leave_interlock(void)
176
+ {
177
+ pool_log("wd_leave_interlock: leaving from interlocking");
178
+
179
+ if (wd_am_I_lock_holder())
180
+ wd_resign_lock_holder();
181
+
182
+ wd_end_interlock();
183
+ }
184
+
185
+ /* if lock holder return true otherwise false */
186
+ bool wd_am_I_lock_holder(void)
187
+ {
188
+ wd_update_lock_holder();
189
+ return WD_MYSELF->is_lock_holder;
190
+ }
191
+
192
+ /* waiting for the lock or to be lock holder */
193
+ void wd_wait_for_lock(WD_LOCK_ID lock_id)
194
+ {
195
+ int count;
196
+
197
+ count = WD_INTERLOCK_WAIT_COUNT;
198
+ while (wd_is_locked(lock_id))
199
+ {
200
+ if (WD_MYSELF->status == WD_DOWN)
201
+ {
202
+ wd_set_lock_holder(WD_MYSELF, false);
203
+ return;
204
+ }
205
+
206
+ if (wd_am_I_lock_holder())
207
+ break;
208
+
209
+ sleep_in_waiting();
210
+ if (--count < 0)
211
+ {
212
+ pool_error("wd_wait_for_lock: timed out");
213
+ break;
214
+ }
215
+ }
216
+ }
217
+
218
+ /*
219
+ * assume lock holder
220
+ * return WD_OK if success.
221
+ */
222
+ static int
223
+ wd_assume_lock_holder(void)
224
+ {
225
+ int rtn = WD_NG;
226
+
227
+ wd_set_lock_holder(WD_MYSELF, false);
228
+
229
+ if (WD_MYSELF->status == WD_DOWN)
230
+ return WD_NG;
231
+
232
+ /*
233
+ * confirm contatable master exists;
234
+ * If contactable master doesn't exists, WD_STAND_FOR_LOCK_HOLDER always
235
+ * returns WD_OK, eventually multiple pgpools can become lock_holder.
236
+ * Down of the host on which master pgpool was working is the case.
237
+ */
238
+ while (!wd_is_contactable_master())
239
+ {
240
+ if (WD_MYSELF->status == WD_DOWN)
241
+ return WD_NG;
242
+ }
243
+
244
+ /* I'm master and not lock holder, or I succeeded to become lock holder */
245
+ if ((WD_MYSELF->status == WD_MASTER && wd_get_lock_holder() == NULL) ||
246
+ (wd_send_packet_no(WD_STAND_FOR_LOCK_HOLDER) == WD_OK))
247
+ {
248
+ if (wd_send_packet_no(WD_DECLARE_LOCK_HOLDER) == WD_OK)
249
+ {
250
+ wd_set_lock_holder(WD_MYSELF, true);
251
+ pool_log("wd_assume_lock_holder: become a new lock holder");
252
+ rtn = WD_OK;
253
+ }
254
+ }
255
+
256
+ return rtn;
257
+ }
258
+
259
+ /*
260
+ * update information of who's lock holder
261
+ * Note that a lock holder pgpool may go down accidentally during interlocking.
262
+ */
263
+ static void
264
+ wd_update_lock_holder(void)
265
+ {
266
+ /* assume lock holder if not exist */
267
+ while (wd_get_lock_holder() == NULL)
268
+ {
269
+ if (WD_MYSELF->status == WD_DOWN)
270
+ return;
271
+
272
+ wd_assume_lock_holder();
273
+ }
274
+ }
275
+
276
+ /* resign lock holder */
277
+ static void
278
+ wd_resign_lock_holder(void)
279
+ {
280
+ wd_set_lock_holder(WD_MYSELF, false);
281
+ wd_send_packet_no(WD_RESIGN_LOCK_HOLDER);
282
+ }
283
+
284
+ /* returns true if lock_id is locked */
285
+ bool
286
+ wd_is_locked(WD_LOCK_ID lock_id)
287
+ {
288
+ return WD_Locks[lock_id];
289
+ }
290
+
291
+ /* lock of unlock a resource */
292
+ void
293
+ wd_set_lock(WD_LOCK_ID lock_id, bool value)
294
+ {
295
+ WD_Locks[lock_id] = value;
296
+ }
297
+
298
+ /* lock all the resource */
299
+ static void
300
+ wd_lock_all(void)
301
+ {
302
+ int i;
303
+
304
+ for (i = 0; i < WD_MAX_LOCK_NUM; i++)
305
+ wd_set_lock(i, true);
306
+ }
307
+
308
+ /* unlock a resource */
309
+ int
310
+ wd_unlock(WD_LOCK_ID lock_id)
311
+ {
312
+ int rtn;
313
+
314
+ wd_set_lock(lock_id, false);
315
+ rtn = wd_send_lock_packet(WD_UNLOCK_REQUEST, lock_id);
316
+ pool_debug("wd_unlock: send unlock request: %d", lock_id);
317
+
318
+ return rtn;
319
+ }
320
+
321
+ /* confirm other pgpools are contactable */
322
+ static void
323
+ wd_confirm_contactable(void)
324
+ {
325
+ int count;
326
+
327
+ count = WD_INTERLOCK_WAIT_COUNT;
328
+ while (!wd_are_contactable_all())
329
+ {
330
+ if (WD_MYSELF->status == WD_DOWN)
331
+ return;
332
+
333
+ sleep_in_waiting();
334
+ if (--count < 0)
335
+ {
336
+ pool_error("wd_confirm_contactable: timed out");
337
+ break;
338
+ }
339
+ }
340
+ }
341
+
342
+ static void
343
+ sleep_in_waiting(void)
344
+ {
345
+ struct timeval t = {0, WD_INTERLOCK_WAIT_MSEC * 1000};
346
+ select(0, NULL, NULL, NULL, &t);
347
+ }