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,512 @@
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
+ #include <pthread.h>
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 <unistd.h>
32
+ #include <netdb.h>
33
+ #include "pool.h"
34
+ #include "pool_config.h"
35
+ #include "watchdog.h"
36
+ #include "wd_ext.h"
37
+
38
+ #include "libpq-fe.h"
39
+
40
+ int is_wd_lifecheck_ready(void);
41
+ int wd_lifecheck(void);
42
+ int wd_ping_pgpool(WdInfo * pgpool);
43
+ static void * thread_ping_pgpool(void * arg);
44
+ static PGconn * create_conn(char * hostname, int port);
45
+ static int pgpool_down(WdInfo * pool);
46
+
47
+ static void check_pgpool_status(void);
48
+ static void check_pgpool_status_by_query(void);
49
+ static void check_pgpool_status_by_hb(void);
50
+ static int ping_pgpool(PGconn * conn);
51
+ static int is_parent_alive(void);
52
+
53
+ int
54
+ is_wd_lifecheck_ready(void)
55
+ {
56
+ int rtn = WD_OK;
57
+ WdInfo * p = WD_List;
58
+ int i = 0;
59
+
60
+ while (p->status != WD_END)
61
+ {
62
+ /* query mode */
63
+ if (!strcmp(pool_config->wd_lifecheck_method, MODE_QUERY))
64
+ {
65
+ if (wd_ping_pgpool(p) == WD_NG)
66
+ {
67
+ pool_debug("is_wd_lifecheck_ready: pgpool %d (%s:%d) has not started yet",
68
+ i, p->hostname, p->pgpool_port);
69
+ rtn = WD_NG;
70
+ }
71
+ }
72
+ /* heartbeat mode */
73
+ else if (!strcmp(pool_config->wd_lifecheck_method, MODE_HEARTBEAT))
74
+ {
75
+ if (p == WD_List)
76
+ {
77
+ p++;
78
+ i++;
79
+ continue;
80
+ }
81
+
82
+ if (!WD_TIME_ISSET(p->hb_last_recv_time) ||
83
+ !WD_TIME_ISSET(p->hb_send_time))
84
+ {
85
+ pool_debug("is_wd_lifecheck_ready: pgpool %d (%s:%d) has not send the heartbeat signal yet",
86
+ i, p->hostname, p->pgpool_port);
87
+ rtn = WD_NG;
88
+ }
89
+ }
90
+ /* otherwise */
91
+ else
92
+ {
93
+ pool_error("is_wd_lifecheck_ready: unkown watchdog mode %s",
94
+ pool_config->wd_lifecheck_method);
95
+ return WD_NG;
96
+ }
97
+
98
+ p ++;
99
+ i ++;
100
+ }
101
+
102
+ return rtn;
103
+ }
104
+
105
+ /*
106
+ * Check if pgpool is living
107
+ */
108
+ int
109
+ wd_lifecheck(void)
110
+ {
111
+ struct timeval tv;
112
+
113
+ /* I'm in down.... */
114
+ if (WD_MYSELF->status == WD_DOWN)
115
+ {
116
+ pool_error("wd_lifecheck: watchdog status is DOWN. You need to restart pgpool");
117
+ return WD_NG;
118
+ }
119
+
120
+ /* set startup time */
121
+ gettimeofday(&tv, NULL);
122
+
123
+ /* check upper connection */
124
+ if (strlen(pool_config->trusted_servers) &&
125
+ wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)
126
+ {
127
+ pool_error("wd_lifecheck: failed to connect to any trusted servers");
128
+
129
+ if (WD_MYSELF->status == WD_MASTER &&
130
+ strlen(pool_config->delegate_IP) != 0)
131
+ {
132
+ wd_IP_down();
133
+ }
134
+
135
+ wd_set_myself(&tv, WD_DOWN);
136
+ wd_notice_server_down();
137
+
138
+ return WD_NG;
139
+ }
140
+
141
+ /* skip lifecheck during recovery execution */
142
+ if (*InRecovery != RECOVERY_INIT)
143
+ {
144
+ return WD_OK;
145
+ }
146
+
147
+ /* check and update pgpool status */
148
+ check_pgpool_status();
149
+
150
+ return WD_OK;
151
+ }
152
+
153
+ /*
154
+ * check and update pgpool status
155
+ */
156
+ static void
157
+ check_pgpool_status()
158
+ {
159
+ /* query mode */
160
+ if (!strcmp(pool_config->wd_lifecheck_method, MODE_QUERY))
161
+ {
162
+ check_pgpool_status_by_query();
163
+ }
164
+ /* heartbeat mode */
165
+ else if (!strcmp(pool_config->wd_lifecheck_method, MODE_HEARTBEAT))
166
+ {
167
+ check_pgpool_status_by_hb();
168
+ }
169
+ }
170
+
171
+ static void
172
+ check_pgpool_status_by_hb(void)
173
+ {
174
+ int cnt;
175
+ WdInfo * p = WD_List;
176
+ struct timeval tv;
177
+
178
+ gettimeofday(&tv, NULL);
179
+
180
+ cnt = 0;
181
+ while (p->status != WD_END)
182
+ {
183
+ pool_debug("check_pgpool_status_by_hb: checking pgpool %d (%s:%d)",
184
+ cnt, p->hostname, p->pgpool_port);
185
+
186
+ /* about myself */
187
+ if (p == WD_MYSELF)
188
+ {
189
+ /* parent is dead so it's orphan.... */
190
+ if (is_parent_alive() == WD_NG && WD_MYSELF->status != WD_DOWN)
191
+ {
192
+ pool_debug("check_pgpool_status_by_hb: NG; the main pgpool process does't exist.");
193
+ pool_log("check_pgpool_status_by_hb: lifecheck failed. pgpool %d (%s:%d) seems not to be working",
194
+ cnt, p->hostname, p->pgpool_port);
195
+ wd_set_myself(&tv, WD_DOWN);
196
+ wd_notice_server_down();
197
+ }
198
+ /* otherwise, the parent would take care of children. */
199
+ else
200
+ {
201
+ pool_debug("check_pgpool_status_by_hb: OK; status %d", p->status);
202
+ }
203
+ }
204
+
205
+ /* about other pgpools, check the latest heartbeat. */
206
+ else
207
+ {
208
+ if (p->status == WD_DOWN)
209
+ {
210
+ pool_log("check_pgpool_status_by_hb: pgpool %d (%s:%d) is in down status",
211
+ cnt, p->hostname, p->pgpool_port);
212
+ }
213
+ else if (wd_check_heartbeat(p) == WD_NG)
214
+ {
215
+ pool_debug("check_pgpool_status_by_hb: NG; status %d", p->status);
216
+
217
+ pool_log("check_pgpool_status_by_hb: lifecheck failed. pgpool %d (%s:%d) seems not to be working",
218
+ cnt, p->hostname, p->pgpool_port);
219
+
220
+ if (p->status != WD_DOWN)
221
+ pgpool_down(p);
222
+ }
223
+ else
224
+ {
225
+ pool_debug("check_pgpool_status_by_hb: OK; status %d", p->status);
226
+ }
227
+ }
228
+
229
+ p++;
230
+ cnt++;
231
+ if (cnt >= MAX_WATCHDOG_NUM)
232
+ {
233
+ pool_error("check_pgpool_status_by_hb: pgpool num is out of range(%d)",cnt);
234
+ break;
235
+ }
236
+ }
237
+ }
238
+
239
+ static void
240
+ check_pgpool_status_by_query(void)
241
+ {
242
+ WdInfo * p = WD_List;
243
+ struct timeval tv;
244
+ pthread_attr_t attr;
245
+ pthread_t thread[MAX_WATCHDOG_NUM];
246
+ WdPgpoolThreadArg thread_arg[MAX_WATCHDOG_NUM];
247
+ int rc;
248
+ int i,cnt;
249
+
250
+ /* set startup time */
251
+ gettimeofday(&tv, NULL);
252
+
253
+ /* thread init */
254
+ pthread_attr_init(&attr);
255
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
256
+
257
+ /* send queries to all pgpools using threads */
258
+ cnt = 0;
259
+ while (p->status != WD_END)
260
+ {
261
+ if (p->status != WD_DOWN)
262
+ {
263
+ thread_arg[cnt].conn = create_conn(p->hostname, p->pgpool_port);
264
+ rc = pthread_create(&thread[cnt], &attr, thread_ping_pgpool, (void*)&thread_arg[cnt]);
265
+ }
266
+ p ++;
267
+ cnt ++;
268
+ if (cnt >= MAX_WATCHDOG_NUM)
269
+ {
270
+ pool_error("check_pgpool_status_by_query: pgpool num is out of range(%d)",cnt);
271
+ break;
272
+ }
273
+ }
274
+ pthread_attr_destroy(&attr);
275
+
276
+ /* check results of queries */
277
+ p = WD_List;
278
+ for (i = 0; i < cnt; )
279
+ {
280
+ int result;
281
+
282
+ pool_debug("check_pgpool_status_by_query: checking pgpool %d (%s:%d)",
283
+ i, p->hostname, p->pgpool_port);
284
+
285
+ if (p->status == WD_DOWN)
286
+ {
287
+ pool_log("check_pgpool_status_by_query: pgpool %d (%s:%d) is in down status",
288
+ i, p->hostname, p->pgpool_port);
289
+ i++;
290
+ p++;
291
+ continue;
292
+ }
293
+ else
294
+ {
295
+ rc = pthread_join(thread[i], (void **)&result);
296
+ if ((rc != 0) && (errno == EINTR))
297
+ {
298
+ usleep(100);
299
+ continue;
300
+ }
301
+ }
302
+
303
+ if (result == WD_OK)
304
+ {
305
+ pool_debug("check_pgpool_status_by_query: OK; status: %d", p->status);
306
+
307
+ /* life point init */
308
+ p->life = pool_config->wd_life_point;
309
+ }
310
+ else
311
+ {
312
+ pool_debug("check_pgpool_status_by_query: NG; status: %d life:%d", p->status, p->life);
313
+
314
+ if (p->life > 0)
315
+ {
316
+ p->life --;
317
+ }
318
+
319
+ /* pgpool goes down */
320
+ if (p->life <= 0)
321
+ {
322
+ pool_log("check_pgpool_status_by_query: lifecheck failed %d times. pgpool %d (%s:%d) seems not to be working",
323
+ pool_config->wd_life_point, i, p->hostname, p->pgpool_port);
324
+
325
+ /* It's me! */
326
+ if ((i == 0) &&
327
+ (WD_MYSELF->status != WD_DOWN))
328
+ {
329
+ wd_set_myself(&tv, WD_DOWN);
330
+ wd_notice_server_down();
331
+ }
332
+
333
+ /* It's other pgpool */
334
+ else if (p->status != WD_DOWN)
335
+ pgpool_down(p);
336
+ }
337
+ }
338
+ i++;
339
+ p++;
340
+ }
341
+ }
342
+
343
+ /*
344
+ * Thread function to send lifecheck query to pgpool
345
+ * Used in wd_lifecheck.
346
+ */
347
+ static void *
348
+ thread_ping_pgpool(void * arg)
349
+ {
350
+ uintptr_t rtn;
351
+ WdPgpoolThreadArg * thread_arg;
352
+ PGconn * conn;
353
+
354
+ thread_arg = (WdPgpoolThreadArg *)arg;
355
+ conn = thread_arg->conn;
356
+ rtn = (uintptr_t)ping_pgpool(conn);
357
+
358
+ pthread_exit((void *)rtn);
359
+ }
360
+
361
+ /*
362
+ * Create connection to pgpool
363
+ */
364
+ static PGconn *
365
+ create_conn(char * hostname, int port)
366
+ {
367
+ static char conninfo[1024];
368
+ PGconn *conn;
369
+
370
+ if (strlen(pool_config->wd_lifecheck_dbname) == 0)
371
+ {
372
+ pool_error("create_conn: wd_lifecheck_dbname is empty");
373
+ return NULL;
374
+ }
375
+
376
+ if (strlen(pool_config->wd_lifecheck_user) == 0)
377
+ {
378
+ pool_error("create_conn: wd_lifecheck_user is empty");
379
+ return NULL;
380
+ }
381
+
382
+ snprintf(conninfo,sizeof(conninfo),
383
+ "host='%s' port='%d' dbname='%s' user='%s' password='%s' connect_timeout='%d'",
384
+ hostname,
385
+ port,
386
+ pool_config->wd_lifecheck_dbname,
387
+ pool_config->wd_lifecheck_user,
388
+ pool_config->wd_lifecheck_password,
389
+ pool_config->wd_interval / 2 + 1);
390
+ conn = PQconnectdb(conninfo);
391
+
392
+ if (PQstatus(conn) != CONNECTION_OK)
393
+ {
394
+ pool_debug("create_conn: Connection to database failed: %s", PQerrorMessage(conn));
395
+ PQfinish(conn);
396
+ return NULL;
397
+ }
398
+ return conn;
399
+ }
400
+
401
+ /* handle other pgpool's down */
402
+ static int
403
+ pgpool_down(WdInfo * pool)
404
+ {
405
+ int rtn = WD_OK;
406
+ WD_STATUS prev_status;
407
+
408
+ pool_log("pgpool_down: %s:%d is going down",
409
+ pool->hostname, pool->pgpool_port);
410
+
411
+ prev_status = pool->status;
412
+ pool->status = WD_DOWN;
413
+
414
+ /* the active pgpool goes down and I'm sandby pgpool */
415
+ if (prev_status == WD_MASTER && WD_MYSELF->status == WD_NORMAL)
416
+ {
417
+ if (wd_am_I_oldest() == WD_OK)
418
+ {
419
+ pool_log("pgpool_down: I'm oldest so standing for master");
420
+ /* stand for master */
421
+ rtn = wd_stand_for_master();
422
+ if (rtn == WD_OK)
423
+ {
424
+ /* win */
425
+ wd_escalation();
426
+ }
427
+ else
428
+ {
429
+ /* rejected by others */
430
+ pool->status = prev_status;
431
+ }
432
+ }
433
+ }
434
+
435
+ return rtn;
436
+ }
437
+
438
+ /*
439
+ * Check if pgpool is alive using heartbeat signal.
440
+ */
441
+ int
442
+ wd_check_heartbeat(WdInfo * pgpool)
443
+ {
444
+ int interval;
445
+ struct timeval tv;
446
+
447
+ gettimeofday(&tv, NULL);
448
+
449
+ interval = WD_TIME_DIFF_SEC(tv, pgpool->hb_last_recv_time);
450
+ pool_debug("wd_check_heartbeat: the latest heartbeat from %s:%d received %d seconds ago",
451
+ pgpool->hostname, pgpool->pgpool_port, interval);
452
+
453
+ if (interval > pool_config->wd_heartbeat_deadtime)
454
+ return WD_NG;
455
+ else
456
+ return WD_OK;
457
+ }
458
+
459
+ /*
460
+ * Check if pgpool can accept the lifecheck query.
461
+ */
462
+ int
463
+ wd_ping_pgpool(WdInfo * pgpool)
464
+ {
465
+ int rtn;
466
+ PGconn * conn;
467
+
468
+ conn = create_conn(pgpool->hostname, pgpool->pgpool_port);
469
+ rtn = ping_pgpool(conn);
470
+
471
+ return rtn;
472
+ }
473
+
474
+ /* inner function for issueing lifecheck query */
475
+ static int
476
+ ping_pgpool(PGconn * conn)
477
+ {
478
+ int rtn = WD_NG;
479
+ int status = PGRES_FATAL_ERROR;
480
+ PGresult * res = (PGresult *)NULL;
481
+
482
+ if (!conn)
483
+ {
484
+ return WD_NG;
485
+ }
486
+
487
+ res = PQexec(conn, pool_config->wd_lifecheck_query );
488
+
489
+ status = PQresultStatus(res);
490
+ if (res != NULL)
491
+ {
492
+ PQclear(res);
493
+ }
494
+
495
+ if ((status != PGRES_NONFATAL_ERROR ) &&
496
+ (status != PGRES_FATAL_ERROR ))
497
+ {
498
+ rtn = WD_OK;
499
+ }
500
+ PQfinish(conn);
501
+
502
+ return rtn;
503
+ }
504
+
505
+ static int
506
+ is_parent_alive()
507
+ {
508
+ if (mypid == getppid())
509
+ return WD_OK;
510
+ else
511
+ return WD_NG;
512
+ }