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,123 @@
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
+ * wd_ext.h.: watchdog extern definition header file
23
+ *
24
+ */
25
+
26
+ #ifndef WD_EXT_H
27
+ #define WD_EXT_H
28
+
29
+ /* watchdog.c */
30
+ extern pid_t wd_ppid;
31
+ extern pid_t wd_main(int fork_wait_time);
32
+ extern int wd_chk_sticky(void);
33
+ extern int wd_is_watchdog_pid(pid_t pid);
34
+ extern int wd_reaper_watchdog(pid_t pid, int status);
35
+ extern int wd_chk_setuid(void);
36
+ extern void wd_kill_watchdog(int sig);
37
+
38
+ /* wd_child.c */
39
+ extern pid_t wd_child(int fork_wait_time);
40
+
41
+ /* wd_init.c */
42
+ extern int wd_init(void);
43
+
44
+ /* wd_list.c */
45
+ extern int wd_set_wd_list(char * hostname, int pgpool_port, int wd_port, char * delegate_ip, struct timeval * tv, int status);
46
+ extern int wd_add_wd_list(WdDesc * other_wd); extern int wd_set_wd_info(WdInfo * info);
47
+ extern WdInfo * wd_is_exist_master(void);
48
+ extern int wd_am_I_oldest(void);
49
+ extern int wd_set_myself(struct timeval * tv, int status);
50
+ extern WdInfo * wd_is_alive_master(void);
51
+
52
+ extern WdInfo * wd_get_lock_holder(void);
53
+ extern WdInfo * wd_get_interlocking(void);
54
+ extern bool wd_are_interlocking_all(void);
55
+ extern void wd_set_lock_holder(WdInfo *p, bool value);
56
+ extern void wd_set_interlocking(WdInfo *info, bool value);
57
+ extern void wd_clear_interlocking_info(void);
58
+ extern bool wd_is_contactable_master(void);
59
+ extern bool wd_are_contactable_all(void);
60
+ extern WdInfo * wd_get_watchdog_info(int num);
61
+
62
+ /* wd_packet.c */
63
+ extern int wd_startup(void);
64
+ extern int wd_declare(void);
65
+ extern int wd_stand_for_master(void);
66
+ extern int wd_notice_server_down(void);
67
+ extern int wd_update_info(void);
68
+ extern int wd_authentication_failed(int sock);
69
+ extern int wd_create_send_socket(char * hostname, int port);
70
+ extern int wd_create_recv_socket(int port);
71
+ extern int wd_accept(int sock);
72
+ extern int wd_send_packet(int sock, WdPacket * snd_pack);
73
+ extern int wd_recv_packet(int sock, WdPacket * buf);
74
+ extern int wd_escalation(void);
75
+ extern int wd_start_recovery(void);
76
+ extern int wd_end_recovery(void);
77
+ extern int wd_send_failback_request(int node_id);
78
+ extern int wd_degenerate_backend_set(int *node_id_set, int count);
79
+ extern int wd_promote_backend(int node_id);
80
+ extern int wd_set_node_mask (WD_PACKET_NO packet_no, int *node_id_set, int count);
81
+ extern int wd_send_packet_no(WD_PACKET_NO packet_no );
82
+ extern int wd_send_lock_packet(WD_PACKET_NO packet_no, WD_LOCK_ID lock_id);
83
+ extern void wd_calc_hash(const char *str, int len, char *buf);
84
+ int wd_packet_to_string(WdPacket *pkt, char *str, int maxlen);
85
+
86
+ /* wd_ping.c */
87
+ extern int wd_is_upper_ok(char * server_list);
88
+ extern int wd_is_unused_ip(char * ip);
89
+
90
+ /* wd_if.c */
91
+ extern int wd_IP_up(void);
92
+ extern int wd_IP_down(void);
93
+ extern int wd_get_cmd(char * buf, char * cmd);
94
+
95
+ /* wd_lifecheck.c */
96
+ extern int is_wd_lifecheck_ready(void);
97
+ extern int wd_lifecheck(void);
98
+ extern int wd_check_heartbeat(WdInfo * pgpool);
99
+ extern int wd_ping_pgpool(WdInfo * pgpool);
100
+
101
+ /* wd_hearbeat.c */
102
+ extern int wd_create_hb_send_socket(WdHbIf * hb_if);
103
+ extern int wd_create_hb_recv_socket(WdHbIf * hb_if);
104
+ extern int wd_hb_send(int sock, WdHbPacket * pkt, int len, const char * destination, const int dest_port);
105
+ extern int wd_hb_recv(int sock, WdHbPacket * pkt);
106
+ extern pid_t wd_hb_receiver(int fork_wait_time, WdHbIf * hb_if);
107
+ extern pid_t wd_hb_sender(int fork_wait_time, WdHbIf * hb_if);
108
+
109
+ /* wd_interlock.c */
110
+ extern int wd_init_interlock(void);
111
+ extern void wd_start_interlock(bool by_health_check);
112
+ extern void wd_end_interlock(void);
113
+ extern void wd_leave_interlock(void);
114
+ extern void wd_wait_for_lock(WD_LOCK_ID lock_id);
115
+ extern bool wd_am_I_lock_holder(void);
116
+ extern bool wd_is_locked(WD_LOCK_ID lock_id);
117
+ extern void wd_set_lock(WD_LOCK_ID lock_id, bool value);
118
+ extern int wd_unlock(WD_LOCK_ID lock);
119
+
120
+ /* main.c */
121
+ extern int myargc;
122
+ extern char **myargv;
123
+ #endif /* WD_EXT_H */
@@ -0,0 +1,577 @@
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 <errno.h>
26
+ #include <ctype.h>
27
+ #include <time.h>
28
+ #include <string.h>
29
+ #include <stdlib.h>
30
+ #include <signal.h>
31
+ #include <sys/stat.h>
32
+ #include <sys/un.h>
33
+ #include <sys/types.h>
34
+ #include <sys/socket.h>
35
+ #include <netinet/in.h>
36
+ #include <netinet/tcp.h>
37
+ #include <netinet/ip.h>
38
+ #include <netdb.h>
39
+ #include <arpa/inet.h>
40
+ #include <unistd.h>
41
+ #include <fcntl.h>
42
+
43
+ #if defined(SO_BINDTODEVICE)
44
+ #include <net/if.h>
45
+ #endif
46
+
47
+ #include "pool.h"
48
+ #include "pool_config.h"
49
+ #include "md5.h"
50
+ #include "watchdog.h"
51
+ #include "wd_ext.h"
52
+
53
+ #define MAX_BIND_TRIES 5
54
+
55
+ static RETSIGTYPE hb_sender_exit(int sig);
56
+ static RETSIGTYPE hb_receiver_exit(int sig);
57
+ static int hton_wd_hb_packet(WdHbPacket *to, WdHbPacket *from);
58
+ static int ntoh_wd_hb_packet(WdHbPacket *to, WdHbPacket *from);
59
+ static int packet_to_string_hb(WdHbPacket *pkt, char * str, int maxlen);
60
+
61
+ /* create socket for sending heartbeat */
62
+ int
63
+ wd_create_hb_send_socket(WdHbIf *hb_if)
64
+ {
65
+ int sock;
66
+ int tos;
67
+
68
+ /* create socket */
69
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
70
+ {
71
+ /* socket create failed */
72
+ pool_error("wd_create_hb_send_socket: Failed to create socket. reason: %s",
73
+ strerror(errno));
74
+ return -1;
75
+ }
76
+
77
+ /* set socket option */
78
+ tos = IPTOS_LOWDELAY;
79
+ if (setsockopt(sock, IPPROTO_IP, IP_TOS, (char *) &tos, sizeof(tos)) == -1 )
80
+ {
81
+ pool_error("wd_create_hb_send_socket: setsockopt(IP_TOS) failed. reason: %s",
82
+ strerror(errno));
83
+ close(sock);
84
+ return -1;
85
+ }
86
+
87
+ if (hb_if->if_name[0] != '\0')
88
+ {
89
+ #if defined(SO_BINDTODEVICE)
90
+ {
91
+ if (geteuid() == 0) /* check root privileges */
92
+ {
93
+ struct ifreq i;
94
+ strlcpy(i.ifr_name, hb_if->if_name, sizeof(i.ifr_name));
95
+
96
+ if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
97
+ {
98
+ pool_error("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, device: %s",
99
+ strerror(errno), i.ifr_name);
100
+ close(sock);
101
+ return -1;
102
+ }
103
+ pool_log("wd_create_hb_send_socket: bind send socket to device: %s", i.ifr_name);
104
+ }
105
+ else
106
+ pool_log("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) requies root privilege");
107
+ }
108
+ #else
109
+ pool_log("wd_create_hb_send_socket: couldn't setsockopt(SO_BINDTODEVICE) on this platform");
110
+ #endif
111
+ }
112
+
113
+ #if defined(SO_REUSEPORT)
114
+ {
115
+ int one = 1;
116
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) == -1)
117
+ {
118
+ pool_error("wd_create_hb_send_socket: setsockopt(SO_REUSEPORT) failed. reason: %s",
119
+ strerror(errno));
120
+ close(sock);
121
+ return -1;
122
+ }
123
+ pool_log("wd_create_hb_send_socket: set SO_REUSEPORT");
124
+ }
125
+ #endif
126
+
127
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0) {
128
+ pool_error("wd_create_hb_send_socket: setting close-on-exec flag failed. reason: %s",
129
+ strerror(errno));
130
+ close(sock);
131
+ return -1;
132
+ }
133
+
134
+ return sock;
135
+ }
136
+
137
+ /* create socket for receiving heartbeat */
138
+ int
139
+ wd_create_hb_recv_socket(WdHbIf *hb_if)
140
+ {
141
+ struct sockaddr_in addr;
142
+ int sock;
143
+ const int one = 1;
144
+ int bind_tries;
145
+ int bind_is_done;
146
+
147
+ memset(&(addr), 0, sizeof(addr));
148
+ addr.sin_family = AF_INET;
149
+ addr.sin_port = htons(pool_config->wd_heartbeat_port);
150
+ addr.sin_addr.s_addr = INADDR_ANY;
151
+
152
+ /* create socket */
153
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
154
+ {
155
+ /* socket create failed */
156
+ pool_error("wd_create_hb_recv_socket: Failed to create socket. reason: %s",
157
+ strerror(errno));
158
+ return -1;
159
+ }
160
+
161
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one)) == -1 )
162
+ {
163
+ pool_error("wd_create_hb_recv_socket: setsockopt(SO_REUSEADDR) failed. reason: %s",
164
+ strerror(errno));
165
+ close(sock);
166
+ return -1;
167
+ }
168
+
169
+ if (hb_if->if_name[0] != '\0')
170
+ {
171
+ #if defined(SO_BINDTODEVICE)
172
+ {
173
+ if (geteuid() == 0) /* check root privileges */
174
+ {
175
+ struct ifreq i;
176
+ strlcpy(i.ifr_name, hb_if->if_name, sizeof(i.ifr_name));
177
+
178
+ if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
179
+ {
180
+ pool_error("wd_create_hb_recv_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, devise: %s",
181
+ strerror(errno), i.ifr_name);
182
+ close(sock);
183
+ return -1;
184
+ }
185
+ pool_log("wd_create_hb_recv_socket: bind receive socket to device: %s", i.ifr_name);
186
+ }
187
+ else
188
+ pool_log("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) requies root privilege");
189
+ }
190
+ #else
191
+ pool_log("wd_create_hb_send_socket: couldn't setsockopt(SO_BINDTODEVICE) on this platform");
192
+ #endif
193
+ }
194
+
195
+ #if defined(SO_REUSEPORT)
196
+ {
197
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) == -1)
198
+ {
199
+ pool_error("wd_create_hb_recv_socket: setsockopt(SO_REUSEPORT) failed. reason: %s",
200
+ strerror(errno));
201
+ close(sock);
202
+ return -1;
203
+ }
204
+ pool_log("wd_create_hb_recv_socket: set SO_REUSEPORT");
205
+ }
206
+ #endif
207
+
208
+ bind_is_done = 0;
209
+ for (bind_tries = 0; !bind_is_done && bind_tries < MAX_BIND_TRIES; bind_tries++)
210
+ {
211
+ if (bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0)
212
+ {
213
+ pool_log("wd_crate_hb_recv_socket: bind failed. reason: %s ... retrying",
214
+ strerror(errno));
215
+ sleep(1);
216
+ }
217
+ else
218
+ {
219
+ bind_is_done = 1;
220
+ }
221
+ }
222
+
223
+ /* bind failed finally */
224
+ if (!bind_is_done)
225
+ {
226
+ pool_error("wd_crate_hb_recv_socket: unable to bind socket. reason: %s",
227
+ strerror(errno));
228
+ close(sock);
229
+ return -1;
230
+ }
231
+
232
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0) {
233
+ pool_error("wd_create_hb_recv_socket: setting close-on-exec flag failed. reason: %s",
234
+ strerror(errno)); close(sock); return -1; }
235
+
236
+ return sock;
237
+ }
238
+
239
+ /* send heartbeat signal */
240
+ int
241
+ wd_hb_send(int sock, WdHbPacket * pkt, int len, const char * host, const int port)
242
+ {
243
+ int rtn;
244
+ struct sockaddr_in addr;
245
+ struct hostent *hp;
246
+ WdHbPacket buf;
247
+
248
+ if (!host || !strlen(host))
249
+ {
250
+ pool_error("wd_hb_send: host name is empty");
251
+ return -1;
252
+ }
253
+
254
+ hp = gethostbyname(host);
255
+ if ((hp == NULL) || (hp->h_addrtype != AF_INET))
256
+ {
257
+ pool_error("wd_hb_send: gethostbyname() failed: %s host: %s",
258
+ hstrerror(h_errno), host);
259
+ return -1;
260
+ }
261
+ memmove((char *) &(addr.sin_addr), (char *) hp->h_addr, hp->h_length);
262
+
263
+ addr.sin_family = AF_INET;
264
+ addr.sin_port = htons(port);
265
+
266
+ hton_wd_hb_packet(&buf, pkt);
267
+
268
+ if ((rtn = sendto(sock, &buf, sizeof(WdHbPacket), 0,
269
+ (struct sockaddr *)&addr, sizeof(addr))) != len)
270
+ {
271
+ pool_error("wd_hb_send: failed to sent packet to %s", host);
272
+ return WD_NG;
273
+ }
274
+ pool_debug("wd_hb_send: send %d byte packet", rtn);
275
+
276
+ return WD_OK;
277
+ }
278
+
279
+ /* receive heartbeat signal */
280
+ int
281
+ wd_hb_recv(int sock, WdHbPacket * pkt)
282
+ {
283
+ int rtn;
284
+ struct sockaddr_in senderinfo;
285
+ socklen_t addrlen;
286
+ WdHbPacket buf;
287
+
288
+ addrlen = sizeof(senderinfo);
289
+
290
+ rtn = recvfrom(sock, &buf, sizeof(WdHbPacket), 0,
291
+ (struct sockaddr *)&senderinfo, &addrlen);
292
+ if (rtn < 0)
293
+ {
294
+ pool_error("wd_hb_recv: failed to receive packet");
295
+ return WD_NG;
296
+ }
297
+ else if (rtn == 0)
298
+ {
299
+ pool_error("wd_hb_recv: received zero bytes");
300
+ return WD_NG;
301
+ }
302
+ else
303
+ {
304
+ pool_debug("wd_hb_recv: received %d byte packet", rtn);
305
+ }
306
+
307
+ ntoh_wd_hb_packet(pkt, &buf);
308
+
309
+ return WD_OK;
310
+ }
311
+
312
+ /* fork heartbeat receiver child */
313
+ pid_t
314
+ wd_hb_receiver(int fork_wait_time, WdHbIf *hb_if)
315
+ {
316
+ int sock;
317
+ pid_t pid = 0;
318
+ WdHbPacket pkt;
319
+ struct timeval tv;
320
+ char from[WD_MAX_HOST_NAMELEN];
321
+ int from_pgpool_port;
322
+ char buf[(MD5_PASSWD_LEN+1)*2];
323
+ char pack_str[WD_MAX_PACKET_STRING];
324
+ int pack_str_len;
325
+
326
+ WdInfo * p;
327
+
328
+ pid = fork();
329
+ if (pid != 0)
330
+ {
331
+ if (pid == -1)
332
+ pool_error("wd_hb_receiver: fork() failed.");
333
+
334
+ return pid;
335
+ }
336
+
337
+ if (fork_wait_time > 0)
338
+ {
339
+ sleep(fork_wait_time);
340
+ }
341
+
342
+ myargv = save_ps_display_args(myargc, myargv);
343
+
344
+ POOL_SETMASK(&UnBlockSig);
345
+
346
+ signal(SIGTERM, hb_receiver_exit);
347
+ signal(SIGINT, hb_receiver_exit);
348
+ signal(SIGQUIT, hb_receiver_exit);
349
+ signal(SIGCHLD, SIG_IGN);
350
+ signal(SIGHUP, SIG_IGN);
351
+ signal(SIGUSR1, SIG_IGN);
352
+ signal(SIGUSR2, SIG_IGN);
353
+ signal(SIGPIPE, SIG_IGN);
354
+ signal(SIGALRM, SIG_IGN);
355
+
356
+ init_ps_display("", "", "", "");
357
+
358
+ if ( (sock = wd_create_hb_recv_socket(hb_if)) < 0)
359
+ {
360
+ pool_error("wd_hb_receiver: socket create failed");
361
+ hb_receiver_exit(SIGTERM);
362
+ }
363
+
364
+ set_ps_display("heartbeat receiver", false);
365
+
366
+ for(;;)
367
+ {
368
+ /* receive heartbeat signal */
369
+ if (wd_hb_recv(sock, &pkt) == WD_OK)
370
+ {
371
+ /* authentication */
372
+ if (strlen(pool_config->wd_authkey))
373
+ {
374
+ /* calculate hash from packet */
375
+ pack_str_len = packet_to_string_hb(&pkt, pack_str, sizeof(pack_str));
376
+ wd_calc_hash(pack_str, pack_str_len, buf);
377
+
378
+ if (strcmp(pkt.hash, buf))
379
+ {
380
+ pool_log("wd_hb_receiver: authentication failed");
381
+ continue;
382
+ }
383
+ }
384
+
385
+ /* get current time */
386
+ gettimeofday(&tv, NULL);
387
+
388
+ /* who send this packet? */
389
+ strlcpy(from, pkt.from, sizeof(from));
390
+ from_pgpool_port = pkt.from_pgpool_port;
391
+
392
+ p = WD_List;
393
+ while (p->status != WD_END)
394
+ {
395
+ if (!strcmp(p->hostname, from) && p->pgpool_port == from_pgpool_port)
396
+ {
397
+ /* ignore the packet from down pgpool */
398
+ if (pkt.status == WD_DOWN)
399
+ {
400
+ pool_debug("wd_hb_receiver: heatbeat signal from down pgpool (%s) is ignored", from);
401
+ break;
402
+ }
403
+
404
+ /* this is the first packet or the latest packet */
405
+ if (!WD_TIME_ISSET(p->hb_send_time) ||
406
+ WD_TIME_BEFORE(p->hb_send_time, pkt.send_time))
407
+ {
408
+ pool_debug("wd_hb_receiver: received heartbeat signal from %s:%d",
409
+ from, from_pgpool_port);
410
+ p->hb_send_time = pkt.send_time;
411
+ p->hb_last_recv_time = tv;
412
+ }
413
+ break;
414
+ }
415
+ p++;
416
+ }
417
+ }
418
+ }
419
+
420
+ return pid;
421
+ }
422
+
423
+ /* fork heartbeat sender child */
424
+ pid_t
425
+ wd_hb_sender(int fork_wait_time, WdHbIf *hb_if)
426
+ {
427
+ int sock;
428
+ pid_t pid = 0;
429
+ WdHbPacket pkt;
430
+ WdInfo * p = WD_List;
431
+ char pack_str[WD_MAX_PACKET_STRING];
432
+ int pack_str_len;
433
+
434
+ pid = fork();
435
+ if (pid != 0)
436
+ {
437
+ if (pid == -1)
438
+ pool_error("wd_hb_sender: fork() failed.");
439
+
440
+ return pid;
441
+ }
442
+
443
+ if (fork_wait_time > 0)
444
+ {
445
+ sleep(fork_wait_time);
446
+ }
447
+
448
+ myargv = save_ps_display_args(myargc, myargv);
449
+
450
+ POOL_SETMASK(&UnBlockSig);
451
+
452
+ signal(SIGTERM, hb_sender_exit);
453
+ signal(SIGINT, hb_sender_exit);
454
+ signal(SIGQUIT, hb_sender_exit);
455
+ signal(SIGCHLD, SIG_IGN);
456
+ signal(SIGHUP, SIG_IGN);
457
+ signal(SIGUSR1, SIG_IGN);
458
+ signal(SIGUSR2, SIG_IGN);
459
+ signal(SIGPIPE, SIG_IGN);
460
+ signal(SIGALRM, SIG_IGN);
461
+
462
+ init_ps_display("", "", "", "");
463
+
464
+ if ( (sock = wd_create_hb_send_socket(hb_if)) < 0)
465
+ {
466
+ pool_error("wd_hb_sender: socket create failed");
467
+ hb_sender_exit(SIGTERM);
468
+ }
469
+
470
+ set_ps_display("heartbeat sender", false);
471
+
472
+ for(;;)
473
+ {
474
+ /* contents of packet */
475
+ gettimeofday(&pkt.send_time, NULL);
476
+ strlcpy(pkt.from, pool_config->wd_hostname, sizeof(pkt.from));
477
+ pkt.from_pgpool_port = pool_config->port;
478
+
479
+ pkt.status = p->status;
480
+
481
+ /* authentication key */
482
+ if (strlen(pool_config->wd_authkey))
483
+ {
484
+ /* calculate hash from packet */
485
+ pack_str_len = packet_to_string_hb(&pkt, pack_str, sizeof(pack_str));
486
+ wd_calc_hash(pack_str, pack_str_len, pkt.hash);
487
+ }
488
+
489
+ /* send heartbeat signal */
490
+ wd_hb_send(sock, &pkt, sizeof(pkt), hb_if->addr, hb_if->dest_port);
491
+ pool_debug("wd_hb_sender: send heartbeat signal to %s:%d", hb_if->addr, hb_if->dest_port);
492
+ sleep(pool_config->wd_heartbeat_keepalive);
493
+ }
494
+
495
+ return pid;
496
+ }
497
+
498
+ static RETSIGTYPE
499
+ hb_sender_exit(int sig)
500
+ {
501
+ switch (sig)
502
+ {
503
+ case SIGTERM: /* smart shutdown */
504
+ case SIGINT: /* fast shutdown */
505
+ case SIGQUIT: /* immediate shutdown */
506
+ pool_debug("hb_sender child receives shutdown request signal %d", sig);
507
+ break;
508
+ default:
509
+ pool_error("hb_sender child receives unknown signal %d", sig);
510
+ }
511
+
512
+ exit(0);
513
+ }
514
+
515
+ static RETSIGTYPE
516
+ hb_receiver_exit(int sig)
517
+ {
518
+ switch (sig)
519
+ {
520
+ case SIGTERM: /* smart shutdown */
521
+ case SIGINT: /* fast shutdown */
522
+ case SIGQUIT: /* immediate shutdown */
523
+ pool_debug("hb_receiver child receives shutdown request signal %d", sig);
524
+ break;
525
+ default:
526
+ pool_error("hb_receiver child receives unknown signal %d", sig);
527
+ }
528
+
529
+ exit(0);
530
+ }
531
+
532
+ static int
533
+ hton_wd_hb_packet(WdHbPacket * to, WdHbPacket * from)
534
+ {
535
+ if ((to == NULL) || (from == NULL))
536
+ {
537
+ return WD_NG;
538
+ }
539
+
540
+ to->status = htonl(from->status);
541
+ to->send_time.tv_sec = htonl(from->send_time.tv_sec);
542
+ to->send_time.tv_usec = htonl(from->send_time.tv_usec);
543
+ memcpy(to->from, from->from, sizeof(to->from));
544
+ to->from_pgpool_port = htonl(from->from_pgpool_port);
545
+ memcpy(to->hash, from->hash, sizeof(to->hash));
546
+
547
+ return WD_OK;
548
+ }
549
+
550
+ static int
551
+ ntoh_wd_hb_packet(WdHbPacket * to, WdHbPacket * from)
552
+ {
553
+ if ((to == NULL) || (from == NULL))
554
+ {
555
+ return WD_NG;
556
+ }
557
+
558
+ to->status = ntohl(from->status);
559
+ to->send_time.tv_sec = ntohl(from->send_time.tv_sec);
560
+ to->send_time.tv_usec = ntohl(from->send_time.tv_usec);
561
+ memcpy(to->from, from->from, sizeof(to->from));
562
+ to->from_pgpool_port = ntohl(from->from_pgpool_port);
563
+ memcpy(to->hash, from->hash, sizeof(to->hash));
564
+
565
+ return WD_OK;
566
+ }
567
+
568
+ /* convert packet to string and return length of the string */
569
+ static int
570
+ packet_to_string_hb(WdHbPacket *pkt, char *str, int maxlen)
571
+ {
572
+ int len;
573
+ len = snprintf(str, maxlen, "status=%d tv_sec=%ld tv_usec=%ld from=%s",
574
+ pkt->status, pkt->send_time.tv_sec, pkt->send_time.tv_usec, pkt->from);
575
+
576
+ return len;
577
+ }