You can subscribe to this list here.
2010 |
Jan
|
Feb
|
Mar
|
Apr
(4) |
May
(28) |
Jun
(12) |
Jul
(11) |
Aug
(12) |
Sep
(5) |
Oct
(19) |
Nov
(14) |
Dec
(12) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
(18) |
Feb
(30) |
Mar
(115) |
Apr
(89) |
May
(50) |
Jun
(44) |
Jul
(22) |
Aug
(13) |
Sep
(11) |
Oct
(30) |
Nov
(28) |
Dec
(39) |
2012 |
Jan
(38) |
Feb
(18) |
Mar
(43) |
Apr
(91) |
May
(108) |
Jun
(46) |
Jul
(37) |
Aug
(44) |
Sep
(33) |
Oct
(29) |
Nov
(36) |
Dec
(15) |
2013 |
Jan
(35) |
Feb
(611) |
Mar
(5) |
Apr
(55) |
May
(30) |
Jun
(28) |
Jul
(458) |
Aug
(34) |
Sep
(9) |
Oct
(39) |
Nov
(22) |
Dec
(32) |
2014 |
Jan
(16) |
Feb
(16) |
Mar
(42) |
Apr
(179) |
May
(7) |
Jun
(6) |
Jul
(9) |
Aug
|
Sep
(4) |
Oct
|
Nov
(3) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(2) |
May
(4) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1
|
2
(1) |
3
(3) |
4
(3) |
5
|
6
|
7
|
8
|
9
(1) |
10
(1) |
11
(3) |
12
(4) |
13
|
14
|
15
|
16
(1) |
17
|
18
|
19
(1) |
20
|
21
|
22
|
23
|
24
(7) |
25
(16) |
26
(2) |
27
|
28
|
29
|
30
(4) |
31
(3) |
|
|
|
|
From: Michael P. <mic...@us...> - 2011-05-12 07:39:51
|
Project "Postgres-XC". The branch, ha_support has been updated via 7c0fb4e4bf34f558697ee864e68b01dc05f08e81 (commit) from 4f452a336a0cea55c13b93823f39ffed547f9065 (commit) - Log ----------------------------------------------------------------- commit 7c0fb4e4bf34f558697ee864e68b01dc05f08e81 Author: Michael P <mic...@us...> Date: Thu May 12 16:29:13 2011 +0900 XC Watcher and Configurator Configurator is a utility that can be used to setup a Postgres-XC cluster automatically. Based on Ruby and a global YAML configuration file, it is in charge of parsing the global file, make postgresql.conf, indent and pg_hba.conf, and then distribute each postgreSQL file automatically to each node. XC watcher is a module using XCM flag information to gather the status of nodes in the cluster and what kind of action is necessary in case a node fails. This module takes into account Datanode, Coordinator, GTM, GTM-Proxy and GTM-Standby. Modules written by Suto Takayuki diff --git a/src/pgxc/Makefile b/src/pgxc/Makefile index 2156013..d421d0b 100644 --- a/src/pgxc/Makefile +++ b/src/pgxc/Makefile @@ -13,7 +13,7 @@ subdir = src/pgxc top_builddir = ../.. include $(top_builddir)/src/Makefile.global -DIRS = xcm pgxc_clean +DIRS = xcm pgxc_clean pgxc_config xc_watcher all install installdirs uninstall distprep clean distclean maintainer-clean: $(INSTALL_DATA) $(srcdir)/xcm/pgxc_ha.conf.sample '$(DESTDIR)$(datadir)/pgxc_ha.conf.sample' diff --git a/src/pgxc/pgxc_config/Makefile b/src/pgxc/pgxc_config/Makefile new file mode 100644 index 0000000..e3adc78 --- /dev/null +++ b/src/pgxc/pgxc_config/Makefile @@ -0,0 +1,28 @@ +#------------------------------------------------------------------------- +# +# Makefile for src/pgxc/pgxc_config +# +# Portions Copyright (c) 2011 Nippon Telegraph and Telephone Corporation +# +# $PostgreSQL$ +# +#------------------------------------------------------------------------- + +PGFILEDESC = "pgxc_config" +subdir = src/pgxc/pgxc_config +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +all: + +install: all installdirs + $(INSTALL_PROGRAM) pgxc_config$(X) '$(DESTDIR)$(bindir)'/pgxc_config$(X) + chmod 755 '$(DESTDIR)$(bindir)'/pgxc_config$(X) + +installdirs: + $(mkinstalldirs) '$(DESTDIR)$(bindir)' + +uninstall: + rm -f '$(DESTDIR)$(bindir)/pgxc_config$(X)' + +clean distclean maintainer-clean: diff --git a/src/pgxc/pgxc_config/pgxc_config b/src/pgxc/pgxc_config/pgxc_config new file mode 100755 index 0000000..748097c --- /dev/null +++ b/src/pgxc/pgxc_config/pgxc_config @@ -0,0 +1,6267 @@ +#!/usr/bin/ruby +# Copyright (c) 2011 Nippon Telegraph and Telephone Corporation + +require 'pp' +require 'yaml' +require 'fileutils' +require 'optparse' + +SEND_FAIL_MSG_RETRY_COUNT = 10 + +#------------------------------ +# Constant values +#------------------------------ +PGXC_CONFIG_WORK_DIRECTORY='~/.pgxc_config' +Version = "0.9.4" + +#------------------------------ +# module +#------------------------------ +module PgxcModule + def get_keywords(val,dest_array) + + if val.class == Hash then + val.each {|key, value| + dest_array << key + get_keywords(val[key],dest_array) + } + end + if val.class == Array then + val.each {|item| + if item.class == Hash then + get_keywords(item,dest_array) + end + } + end + end +end + +#------------------------------ +# Numeric Class +#------------------------------ +class Numeric + def to_str + self.to_s + end +end + +#------------------------------ +# PostgresXC Class +#------------------------------ +class PostgresXC + include PgxcModule + attr_accessor :value + def initialize(pgxc_conf) + if pgxc_conf == nil + raise "Postgres-xc section not found." + end + @value = pgxc_conf + validate + end + + def validate + required = {"UID"=>true, "GROUP"=>true, "POSTGRES_HOME"=>true, + "PGDATA"=>false, "coordinator"=>false, "datanode"=>false, + "XC_WATCHER"=>false, "MONITORING_AGENT"=>false, "port"=>false, "server"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Postgres-xc section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Postgres-xc section: unknown keyword '#{k}'." + end + } + end + + def UID + return @value["UID"] + end + + def GROUP + return @value["GROUP"] + end + + def POSTGRES_HOME + return @value["POSTGRES_HOME"] + end + + def XC_WATCHER_HOST + if @value["XC_WATCHER"] + return @value["XC_WATCHER"]["server"] + end + return nil + end + + def XC_WATCHER_PORT + if @value["XC_WATCHER"] + return @value["XC_WATCHER"]["port"] + end + return nil + end + + def MONITORING_AGENT_PORT + if @value["MONITORING_AGENT"] + return @value["MONITORING_AGENT"]["port"] + end + return nil + end + + def PGDATA(key) + if @value["PGDATA"] == nil + return nil + end + if @value["PGDATA"][key] != nil + return @value["PGDATA"][key] + end + return nil + end + +end + +#------------------------------ +# Server Class +#------------------------------ +class Server + include PgxcModule + attr_accessor :value + def initialize(server_conf) + if server_conf == nil + raise "Server section is missing." + end + @value = server_conf + validate + end + + def validate + required = {"name"=>true, "ip_addr"=>true} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Server section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Server section: unknown keyword '#{k}'." + end + } + # check array (include? 'name') + @value.each {|item| + if item["name"] == nil + raise "Server section: name value is missing." + end + } + # ip_addr check + get_name.each {|name| + if get_ip_addr(name) == nil + raise "Server section: ip_addr value is missing in 'name: #{name}'." + end + } + end + + def server(name) + @value.each {|item| + if item["name"] == name + return item + end + } + return nil + end + + def get_server_name(ip) + @value.each{|item| + item['ip_addr'].each {|v| + return item['name'] if v == ip + } + } + return nil + end + + def get_name() + ary = [] + @value.each {|item| + if item["name"] != nil + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_ip_addr(name) + @value.each {|item| + if item["name"] == name + return item["ip_addr"] + end + } + return nil + end + +end + +#------------------------------ +# GTM Class +#------------------------------ +class GTM + attr_accessor :value + include PgxcModule + def initialize(gtm_conf) + if gtm_conf == nil + raise "Gtm section is missing." + end + @value = gtm_conf + default + validate + @value.each {|v| + if v.has_key?("name") and v['name'] != 'default' + if v.has_key?('status') == false + v['status'] = 'R' + end + end + } + end + + def primary + @value.each {|v| + if v.has_key?('primary') + return v['primary'] + end + return nil + } + end + + def set_priamry(name) + @value.each {|v| + if v.has_key?('primary') + v['primary'] = name + break + end + } + end + + def set_primary(name) + @value.each {|v| + if v.has_key?('primary') + v['primary'] = name + break + end + } + end + + def active?(name) + if name().size == 1 and name()[0] == name + return true + end + if primary != nil + if primary == name + return true + end + end + return false + end + + def set_status(name, status) + @value.each {|v| + if v['name'] == name + v['status'] = status + end + } + end + + def get_status(name) + @value.each{|v| + return v['status'] if v['name'] == name + } + return nil + end + + def validate + required = {"server"=>true, "name"=>true, "ip_addr"=>false, "port"=>true, + "data_directory"=>true, "log_filename"=>true, "first_gxid"=>true, + "primary"=>false, "status"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Gtm section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Gtm section: unknown keyword '#{k}'." + end + } + + if name == nil + raise "Gtm section: 'name' is missing. (Excluding default)" + end + + if name.size > 1 + if primary == nil + raise "Gtm section: primary value is missing." + end + if name.size != name.uniq.size + raise "Gtm section: duplicate name in the list." + end + if name.index(primary) == nil + raise "Gtm section: primary '#{primary}' is not found in the Gtm section." + end + name.each {|name| + if server(name) == nil + raise "Gtm section: server value is missing in 'name: #{name}'." + end + if port(name) == nil + raise "Gtm section: port value is missing in 'name: #{name}'." + end + if data_directory(name) == nil + raise "Gtm section: data_directory value is missing in 'name: #{name}'." + end + if log_filename(name) == nil + raise "Gtm section: log_filename value is missing in 'name: #{name}'." + end + if first_gxid(name) == nil + raise "Gtm section: first_gxid value is missing in 'name: #{name}'." + end + } + end + + + end + + def server(name=nil) + server = [] + if name == nil + @value.each {|v| + if v.has_key?("server") + server << v['server'] + end + } + return server + else + @value.each {|v| + if v.has_key?("server") + return v['server'] if name == v['name'] + end + } + end + return nil + end + + def name + name = [] + @value.each {|v| + if v.has_key?('name') + name << v['name'] if v['name'] != 'default' + end + } + return nil if name.size == 0 + return name + end + + def ip_addr(name) + @value.each {|v| + if v.has_key?("name") + next if v['name'] != name + return v['ip_addr'] + end + } + return nil + end + + def port(name) + @value.each {|item| + if item['name'] == name + return item['port'] if item.has_key?('port') + end + } + if @default_port != nil + return @default_port + end + return nil + end + + def data_directory(name) + @value.each {|item| + if item['name'] == name + return item['data_directory'] if item.has_key?('data_directory') + end + } + if @default_data_directory != nil + return @default_data_directory + end + return nil + end + + def log_filename(name) + @value.each {|item| + if item['name'] == name + return item['log_filename'] if item.has_key?('log_filename') + end + } + if @default_log_filename != nil + return @default_log_filename + end + return nil + end + + def first_gxid(name) + @value.each {|item| + if item['name'] == name + return item['first_gxid'] if item.has_key?('first_gxid') + end + } + if @default_first_gxid != nil + return @default_first_gxid + end + return nil + end + + def get_default + @value.each {|item| + if item['name'] == 'default' + return item + end + } + return nil + end + + def default + default_values = get_default + if default_values != nil + @default_data_directory = default_values['data_directory'] + @default_log_filename = default_values['log_filename'] + @default_port = default_values['port'] + @default_first_gxid = default_values['first_gxid'] + end + end +end + +#------------------------------ +# GTM-PROXY Class +#------------------------------ +class GTMProxy + include PgxcModule + attr_accessor :value + def initialize(gtmp_conf) + if gtmp_conf == nil + @value = nil + return + end + @value = gtmp_conf + default + validate + # set status data + @value.each {|v| + if v['name'] != 'default' + if v.has_key?('status') == false + v['status'] = 'R' + end + end + } + end + + def set_status(name, status) + @value.each {|v| + if v['name'] == name + v['status'] = status + end + } + end + + def get_status(name) + @value.each {|v| + return v['status'] if v['name'] == name + } + return nil + end + + def validate + required = {"name"=>true, "server"=>true, "ip_addr"=>false, "gtm"=>true, + "port"=>true, "worker_number"=>true, "log_filename"=>true, "proxy_directory"=>true, + "status"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Gtm-proxy section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Gtm-proxy section: unknown keyword '#{k}'." + end + } + if get_name == nil + raise "Gtm-proxy section: 'name' is missing. (Excluding default)" + end + + # check array (include? 'name') + @value.each {|item| + if item["name"] == nil + raise "Gtm-proxy section: name value is missing." + end + } + # check server and gtm and port and worker_number and log_filename and proxy_directory + get_name.each {|name| + if get_gtm(name) == nil + raise "Gtm-proxy section: gtm value is missing in 'name: #{name}'." + end + if get_server(name) == nil + raise "Gtm-proxy section: server value is missing in 'name: #{name}'." + end + if get_port(name) == nil + raise "Gtm-proxy section: port value is missing in 'name: #{name}'." + end + if get_worker_number(name) == nil + raise "Gtm-proxy section: worker_number value is missing in 'name: #{name}'." + end + if get_log_filename(name) == nil + raise "Gtm-proxy section: log_filename value is missing in 'name: #{name}'." + end + if get_proxy_directory(name) == nil + raise "Gtm-proxy section: proxy_directory value is missing in 'name: #{name}'." + end + } + end + + def get_name + if @value == nil + return nil + end + ary = [] + @value.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_server(name) + if @value == nil + return nil + end + @value.each {|item| + if item["name"] == name + return item["server"] + end + } + return nil + end + + def get_ip_addr(name) + if @value == nil + return nil + end + @value.each {|item| + if item["name"] == name + return item["ip_addr"] + end + } + return nil + end + + def get_port(name) + + @value.each{|item| + if item["name"] == name + return item["port"] if item["port"] != nil + end + } + if @default_port != nil + return @default_port + end + return nil + end + + def get_worker_number(name) + @value.each {|item| + if item["name"] == name + return item["worker_number"] if item["worker_number"] != nil + end + } + if @default_worker_number != nil + return @default_worker_number + end + return nil + end + + def get_proxy_directory(name) + @value.each {|item| + if item["name"] == name + return item["proxy_directory"] if item["proxy_directory"] != nil + end + } + if @default_proxy_directory != nil + return @default_proxy_directory + end + return nil + end + + def get_log_filename(name) + @value.each {|item| + if item["name"] == name + return item["log_filename"] if item["log_filename"] != nil + end + } + if @default_log_filename != nil + return @default_log_filename + end + return nil + end + + def get_gtm(name) + @value.each {|item| + if item["name"] == name + return item["gtm"] if item["gtm"] != nil + end + } + if @default_gtm != nil + return @default_gtm + end + return nil + end + + def get_default + @value.each {|item| + if item["name"] == "default" + return item + end + } + return nil + end + + def default + default_values = get_default + if default_values != nil + @default_gtm = default_values["gtm"] + @default_port = default_values["port"] + @default_worker_number = default_values["worker_number"] + @default_log_filename = default_values["log_filename"] + @default_proxy_directory = default_values["proxy_directory"] + end + end + +end + +#------------------------------ +# Datanode Class +#------------------------------ +class Datanode + include PgxcModule + attr_accessor :value + def initialize(dn_conf) + if dn_conf == nil + raise "Datanode section is missing." + end + @value = dn_conf + default + validate + # set status data + @value.each {|v| + next if v.has_key?('primary-node') + next if v.has_key?('name') and v['name'] == 'default' + if v.has_key?('mirror') + v['mirror'].each {|m| + next if m.has_key?('primary') + if m.has_key?('status') == false + m['status'] = 'R' + end + } + else + if v.has_key?('status') == false + v['status'] = 'R' + end + end + } + end + + def mirror_datanode? + get_name.each {|name| + return true if get_standby_type(name) == "mirror" + } + return false + end + + def set_status(dn_name, status, mirror=nil) + if mirror == nil + @value.each {|v| + next if v['name'] != dn_name + if v['name'] == dn_name + v['status'] = status + end + } + else + # mirror datanode + @value.each {|v| + next if v['name'] != dn_name + if v.has_key?("mirror") + v['mirror'].each {|m| + if m['name'] == mirror + m['status'] = status + end + } + end + } + end + end + + def get_status(dn_name, mirror=nil) + if mirror == nil + @value.each {|v| + next if v['name'] != dn_name + if v['name'] == dn_name + return v['status'] + end + } + else + # mirror datanode + @value.each {|v| + next if v['name'] != dn_name + if v.has_key?("mirror") + v['mirror'].each {|m| + if m['name'] == mirror + return m['status'] + end + } + end + } + end + return nil + end + + def validate + required = {"primary-node"=>true, "name"=>true, "server"=>true, "ip_addr"=>false, "datanode_number"=>true, + "gtm"=>true, "port"=>true, "data_directory"=>false, "standby"=> false, "mirror"=>false, "primary"=>false, "mirror_number"=>false, "status"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Datanode section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Datanode section: unknown keyword '#{k}'." + end + } + if get_name == nil + raise "Datanode section: 'name' is missing. (Excluding default)" + end + + # check array (include? 'name') + @value.each {|item| + next if item.has_key?("primary-node") + if item["name"] == nil + raise "Datanode section: name value is missing." + end + } + # check standby mirror data + standby_type = ["mirror", "none", nil] + get_name.each {|name| + type = get_standby_type(name) + if type != nil and standby_type.index(type) == nil + raise "Datanode section: standy is invalid value. 'standby: #{type}'." + end + if standby_type.index(type) == nil + raise "Datanode section: standby value is missing in 'name: #{name}'." + end + if type == "mirror" + if get_mirror_data(name)["mirror"] == nil + raise "Datanode section: mirror value is missing in 'name: #{name}'." + end + end + } + + # check primary_node + if get_name.index(primary) == nil + raise "Datanode section: primary_node '#{primary}' is not found in the datanode section." + end + + # check datanode_number and server and gtm and port + get_name.each {|name| + if get_datanode_number(name) == nil + raise "Datanode section: datanode_number value is missing in 'name: #{name}'." + end + # standby : mirror + if get_standby_type(name) == "mirror" + # check server + if get_mirror_servers(name) == nil + raise "Datanode section: server value is missing in 'name: #{name}'." + end + if get_mirror_servers(name).size < 2 + raise "Datanode section: mirror is required two or more server settings in 'name: #{name}'." + end + # check gtm, port + get_mirror_name(name).each {|mirror_name| + if get_mirror_gtm(name, mirror_name) == nil + raise "Datanode section: gtm value is missing in 'name: #{name}'." + end + if get_mirror_port(name, mirror_name) == nil + raise "Datanode section: port value is missing in 'name: #{name}'." + end + } + else + if get_server(name) == nil + raise "Datanode section: server value is missing in 'name: #{name}'." + end + if get_gtm(name) == nil + raise "Datanode section: gtm value is missing in 'name: #{name}'." + end + if get_port(name) == nil + raise "Datanode section: port value is missing in 'name: #{name}'." + end + end + } + # check datanode name + if get_name.size != get_name.uniq.size + raise "Datanode section: duplicate datanode name in the list." + end + # check datanode_number + a = [] + get_name.each {|name| + a << get_datanode_number(name) + } + if a.size != a.uniq.size + raise "Datanode section: duplicate datanode_number value in the list." + end + a.sort! + i = 1 + a.each {|v| + if v != i + raise "Datanode section: datanode_number should start with 1. (next datanode_number add +1)." + end + i += 1 + } + + # check mirror number and mirror primary + # standby : mirror + get_name.each {|name| + if get_standby_type(name) == "mirror" + mirror_number = [] + get_mirror_name(name).each {|mirror_name| + num = get_mirror_number(name, mirror_name) + if num == nil + raise "Datanode mirror section: mirror_number values is missing in 'name: #{mirror_name}'." + end + mirror_number << num + } + if mirror_number.size != mirror_number.uniq.size + raise "Datanode mirror section: duplicate mirror_number value in the list." + end + mirror_number.sort! + i = 1 + mirror_number.each {|v| + if v != i + raise "Datanode mirror section: mirror_number should start with 1. (next mirror_number add +1)." + end + i += 1 + } + # check mirror primary + if get_mirror_primary_name(name) == nil + raise "Datanode mirror section: primary is missing in 'name: #{name}'." + end + if get_mirror_name(name).index(get_mirror_primary_name(name)) == nil + raise "Datanode mirror section: 'primary: #{get_mirror_primary_name(name)}' is not found in the mirror section." + end + end + } + + end + + def primary + @value.each {|item| + if item.has_key?("primary-node") + return item["primary-node"] + end + } + return nil + end + + def count + ary = [] + @value.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + return ary.size + end + + def primary?(name, mirror=nil) + if mirror == nil + return true if primary() == name + else # mirror primary + return true if get_mirror_primary_name(name) == mirror + end + return false + end + + def get_mirror_number(name, mirror) + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + get_mirror_data(name)["mirror"].each {|item| + if item["name"] == mirror + return item["mirror_number"] + end + } + return nil + end + + def get_name + ary = [] + @value.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_mirror_name(name) + mirror_name = [] + return nil if get_mirror_data(name) == nil + return nil if get_mirror_data(name)["mirror"] == nil + get_mirror_data(name)["mirror"].each {|item| + if item["name"] != nil + mirror_name << item["name"] + end + } + return nil if mirror_name.size == 0 + return mirror_name + end + + def get_mirror_primary_name(name) + return nil if get_mirror_data(name) == nil + return nil if get_mirror_data(name)["mirror"] == nil + get_mirror_data(name)["mirror"].each {|item| + if item["primary"] != nil + return item["primary"] + end + } + return nil + end + + def get_server(name) + @value.each {|item| + if item["name"] == name + return item["server"] + end + } + return nil + end + + def get_mirror_servers(name) + server = [] + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + get_mirror_data(name)["mirror"].each {|item| + if item["server"] != nil + server << item["server"] + end + } + return nil if server.size == 0 + return server + end + + def get_mirror_server(name, mirror) + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + get_mirror_data(name)["mirror"].each {|item| + if item["name"] == mirror + return item["server"] + end + } + return nil + end + + def get_ip_addr(name) + @value.each {|item| + if item["name"] == name + return item["ip_addr"] + end + } + return nil + end + + def get_mirror_ip_addr(name, mirror) + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + get_mirror_data(name)["mirror"].each {|item| + return item["ip_addr"] if item["name"] == mirror + } + return nil + end + + def get_mirror_svr_ip_addr(name) + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + mirror_svr_ip_addr = [] + get_mirror_data(name)["mirror"].each {|item| + if item["server"] != nil + mirror_svr_ip_addr << {"server"=>item["server"], "ip_addr"=>item["ip_addr"]} + end + } + if mirror_svr_ip_addr.size == 0 + return nil + end + return mirror_svr_ip_addr + end + + def get_gtm(name) + @value.each {|item| + if item["name"] == name + return item["gtm"] if item["gtm"] != nil + end + } + if @default_gtm != nil + return @default_gtm + end + return nil + end + + def get_mirror_gtm(name, mirror_name) + if get_mirror_data(name) == nil + return nil + end + if get_mirror_data(name)["mirror"] == nil + return nil + end + get_mirror_data(name)["mirror"].each {|item| + if item["name"] == mirror_name + return item["gtm"] if item["gtm"] != nil + end + } + if @default_gtm != nil + return @default_gtm + end + return nil + end + + def get_datanode_number(name) + @value.each{|item| + if item["name"] == name + return item["datanode_number"] + end + } + return nil + end + + def get_default + @value.each {|item| + if item["name"] == "default" + return item + end + } + return nil + end + + def get_port(name) + @value.each {|item| + if item["name"] == name + return item["port"] if item["port"] != nil + end + } + if @default_port != nil + return @default_port + end + return nil + end + + def get_mirror_port(name, mirror_name) + if get_mirror_data(name) != nil + if get_mirror_data(name)["mirror"] != nil + get_mirror_data(name)["mirror"].each {|item| + if item["name"] == mirror_name + return item["port"] if item["port"] != nil + end + } + end + end + if @default_port != nil + return @default_port + end + return nil + end + + def get_data_directory(name) + @value.each{|item| + if item["name"] == name + return item["data_directory"] if item["data_directory"] != nil + end + } + if @default_data_directory != nil + return @default_data_directory + end + return nil + end + + def get_mirror_datanode_directory(name, mirror) + if get_mirror_data(name) != nil + if get_mirror_data(name)["mirror"] != nil + get_mirror_data(name)["mirror"].each {|item| + if item["name"] == mirror + return item["data_directory"] if item["data_directory"] != nil + end + } + end + end + if @default_data_directory != nil + return @default_data_directory + end + return nil + end + + def default + default_values = get_default + if default_values != nil + @default_gtm = default_values["gtm"] + @default_port = default_values["port"] + @default_data_directory = default_values["data_directory"] + end + end + + def get_mirror_data(name) + @value.each {|item| + if item["name"] == name + return item + end + } + return nil + end + + def get_standby_type(name) + return get_mirror_data(name) ? get_mirror_data(name)["standby"] : nil + end +end + +#------------------------------ +# Coordinator Class +#------------------------------ +class Coordinator + include PgxcModule + attr_accessor :value + def initialize(coord_conf) + if coord_conf == nil + raise "Coordinator section is missing." + end + @value = coord_conf + default + validate + # set status data + @value.each {|v| + if v['name'] != 'default' + if v.has_key?('status') == false + v['status'] = 'R' + end + end + } + end + + def set_status(name, status) + @value.each {|v| + if v['name'] == name + v['status'] = status + end + } + end + + def get_status(name) + @value.each{|v| + return v['status'] if v['name'] == name + } + return nil + end + + def count + ary = [] + @value.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + return ary.size + end + + def validate + required = {"name"=>true, "server"=>true, "ip_addr"=>false, "preferred_data_nodes"=>true, "coordinator_number"=>true, + "gtm"=>true, "port"=>true, "data_directory"=>false, "status"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Coordinator section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Coordinator section: unknown keyword '#{k}'" + end + } + if get_name == nil + raise "Coordinator section: 'name' is missing. (Excluding default)" + end + + # check array (include? 'name') + @value.each {|item| + next if item.has_key?("primary-node") + if item["name"] == nil + raise "Coordinator section: name value is missing." + end + } + # check server and gtm and preferred_data_nodes + get_name.each {|name| + if get_coordinator_number(name) == nil + raise "Coordinator section: coordinator_number value is missing in 'name: #{name}'." + end + if get_server(name) == nil + raise "Coordinator section: server value is missing in 'name: #{name}'." + end + if get_gtm(name) == nil + raise "Coordinator section: gtm value is missing in 'name: #{name}'." + end + if get_preferred_data_nodes(name) == nil + raise "Coordinator section: preferred_data_nodes value is missing in 'name: #{name}'." + end + if get_port(name) == nil + raise "Coordinator section: port value is missing in 'name: #{name}'." + end + } + # check coordinator_number + a = [] + get_name.each {|name| + a << get_coordinator_number(name) + } + if a.size != a.uniq.size + raise "Coordinator section: duplicate coordinator_number value in the list." + end + a.sort! + i = 1 + a.each {|v| + if v != i + raise "Coordinator section: coordinator_number should start with 1. (next coordinator_number add +1)." + end + i += 1 + } + end + + def get_name + ary = [] + @value.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_server(name) + @value.each {|item| + if item["name"] == name + return item["server"] + end + } + return nil + end + + def get_ip_addr(name) + @value.each {|item| + if item["name"] == name + return item["ip_addr"] + end + } + return nil + end + + def get_gtm(name) + @value.each {|item| + if item["name"] == name + return item["gtm"] if item["gtm"] != nil + end + } + if @default_gtm != nil + return @default_gtm + end + return nil + end + + def get_preferred_data_nodes(name) + @value.each {|item| + if item["name"] == name + return item["preferred_data_nodes"] if item["preferred_data_nodes"] != nil + end + } + if @default_preferred_data_nodes != nil + return @default_preferred_data_nodes + end + return nil + end + + def get_coordinator_number(name) + @value.each{|item| + if item["name"] == name + return item["coordinator_number"] + end + } + return nil + end + + def get_default + @value.each {|item| + if item["name"] == "default" + return item + end + } + return nil + end + + def get_port(name) + @value.each {|item| + if item["name"] == name + return item["port"] if item["port"] != nil + end + } + if @default_port != nil + return @default_port + end + return nil + end + + def get_data_directory(name) + @value.each{|item| + if item["name"] == name + return item["data_directory"] if item["data_directory"] != nil + end + } + if @default_data_directory != nil + return @default_data_directory + end + return nil + end + + def default + default_values = get_default + if default_values != nil + @default_gtm = default_values["gtm"] + @default_port = default_values["port"] + @default_data_directory = default_values["data_directory"] + @default_default_preferred_data_nodes = default_values["preferred_data_nodes"] + end + end + +end + +#------------------------------ +# PGSQLConf Class +#------------------------------ +class PGSQLConf + include PgxcModule + attr_accessor :value, :coordinator, :datanode + def initialize(pgsql_conf) + @coordinator = @datanode = nil + if pgsql_conf == nil + raise "Postgresql.conf section not found." + end + @value = pgsql_conf + if pgsql_conf.class == Hash + @coordinator = pgsql_conf['coordinator'] + @datanode = pgsql_conf['datanode'] + else + raise "Postgresql.conf section: syntax error." + end + validate + end + + def validate + required = {"coordinator"=>true, "datanode"=>true, "name"=>true, + "data_node_users"=>true, "coordinator_users"=>true} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Postgresql.conf section: '#{k}' is missing." + end + } + if @coordinator.class != Array + raise "Postgresql.conf coordinator section: syntax error." + end + if @datanode.class != Array and @datanode != nil + raise "Postgresql.conf datanode section: syntax error." + end + # check coordinator_users, data_node_users + if get_coordinator_name == nil and get_coordinator_default == nil + raise "Postgresql.conf coordinator section: syntax error." + end + ['coordinator_users','data_node_users'].each {|k| + if get_coordinator_default != nil + if get_coordinator_default[k] == nil + if get_coordinator_name == nil + raise "Postgresql.conf coordinator section: 'name' is missing." + else + get_coordinator_name.each {|name| + if get_coordinator_value(name)[k] == nil + raise "Postgresql.conf coordinator section: '#{k}' is missing in 'name: #{name}." + end + } + end + end + end + } + end + + def get_datanode_name + if @datanode == nil + return nil + end + ary = [] + @datanode.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_coordinator_name + if @coordinator == nil + return nil + end + ary = [] + @coordinator.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_coordinator_value(name) + @coordinator.each {|item| + if item["name"] == name + return item + end + } + return nil + end + + def get_coordinator_string_value(name) + opt = "" + param = get_coordinator_value(name) + if param != nil + param.each {|key, value| + if key != "name" and key != "default" + opt = "#{opt}#{key} = #{value}\n" + end + } + end + return opt + end + + def get_datanode_value(name) + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == name + return item + end + } + return nil + end + + def get_datanode_string_value(name) + opt = "" + param = get_datanode_value(name) + if param != nil + param.each {|key, value| + if key != "name" and key != "default" + opt = "#{opt}#{key} = #{value}\n" + end + } + end + return opt + end + + def get_coordinator_default + @coordinator.each {|item| + if item["name"] == "default" + return item + end + } + return nil + end + + def get_coordinator_default_string_value(name) + opt = "" + param = get_coordinator_default + if param != nil + param.each {|key, value| + if key != "name" and key != "default" + opt = "#{opt}#{key} = #{value}\n" + end + } + end + return opt + end + + def get_datanode_default + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == "default" + return item + end + } + return nil + end + + def get_datanode_default_string_value(name) + opt = "" + param = get_datanode_default + if param != nil + get_datanode_default.each {|key, value| + if key != "name" and key != "default" + opt = "#{opt}#{key} = #{value}\n" + end + } + end + return opt + end + +end + +#------------------------------ +# RPM Class +#------------------------------ +class RPM + include PgxcModule + attr_accessor :value, :server, :gtm, :coordinator + def initialize(rpm_conf) + if rpm_conf == nil + raise "Rpm section is missing." + end + @gtm = @coordinator = nil + if rpm_conf.class == Hash + @value = rpm_conf + @gtm = @value['gtm'] + @coordinator = @value['coordinator'] + else + raise "Rpm section: syntax error." + end + validate + end + + def validate + required = {"gtm"=>true, "coordinator"=>true} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Rpm section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Rpm section: unknown keyword '#{k}'." + end + } + end +end + +#------------------------------ +# PGHBAConf Class +#------------------------------ +class PGHBAConf + include PgxcModule + attr_accessor :value + def initialize(pg_hba_conf) + @value = @coordinator = @datanode = nil + if pg_hba_conf == nil + return + end + @value = pg_hba_conf + @coordinator = @datanode = nil + if pg_hba_conf.class == Hash + @coordinator = pg_hba_conf['coordinator'] + @datanode = pg_hba_conf['datanode'] + else + raise "Pg_hba.conf section: syntax error." + end + validate + end + + def validate + required = {"coordinator"=>true, "datanode"=>true, "name"=>true, "content"=>true} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Pg_hba.conf section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Pg_hba.conf section: unknown keyword '#{k}'." + end + } + # check default + if has_datanode_default? == true + if get_datanode_default_contents == nil + raise "Pg_hba.conf section: 'name: default' no contents were found." + end + end + if has_coordinator_default? == true + if get_coordinator_default_contents == nil + raise "Pg_hba.conf section: 'name: default' no contents were found." + end + end + end + + def get_datanode_name + if @datanode == nil + return nil + end + ary = [] + @datanode.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_coordinator_name + if @coordinator == nil + return nil + end + ary = [] + @coordinator.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def has_datanode_default? + if @datanode == nil + return false + end + @datanode.each {|item| + if item["name"] == "default" + return true + end + } + return false + end + + def has_coordinator_default? + if @coordinator == nil + return false + end + @coordinator.each {|item| + if item["name"] == "default" + return true + end + } + return false + end + + def get_coordinator_contents(name) + if @coordinator == nil + return nil + end + @coordinator.each {|item| + if item["name"] == name + return item["content"] + end + } + return nil + end + + def get_datanode_contents(name) + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == name + return item["content"] + end + } + return nil + end + + def get_coordinator_default_contents + if @coordinator == nil + return nil + end + @coordinator.each {|item| + if item["name"] == "default" + return item["content"] + end + } + return nil + end + + def get_datanode_default_contents + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == "default" + return item["content"] + end + } + return nil + end + +end + +#------------------------------ +# PGIDENTConf Class +#------------------------------ +class PGIDENTConf + include PgxcModule + attr_accessor :value + def initialize(pg_ident_conf) + @value = @coordinator = @datanode = nil + if pg_ident_conf == nil + return + end + @value = pg_ident_conf + if pg_ident_conf.class == Hash + @coordinator = pg_ident_conf['coordinator'] + @datanode = pg_ident_conf['datanode'] + else + raise "Pg_ident.conf section: syntax error." + end + validate + end + + def validate + required = {"coordinator"=>false, "datanode"=>false, "name"=>false, "content"=>false} + yaml_keys = [] + get_keywords(@value, yaml_keys) + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "Pg_ident.conf section: '#{k}' is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Pg_ident.conf section: unknown keyword '#{k}'." + end + } + # check default + if has_datanode_default? == true + if get_datanode_default_contents == nil + raise "Pg_ident.conf section: contents not found." + end + end + if has_coordinator_default? == true + if get_coordinator_default_contents == nil + raise "Pg_ident.conf section: contents not found." + end + end + # check coordinator + if @coordinator != nil + coordinator_item = get_coordinator_name + if coordinator_item == nil and has_coordinator_default? == false + raise "Pg_ident.conf section: name value is missing." + end + if coordinator_item != nil + coordinator_item.each {|name| + if get_coordinator_contents(name) == nil + raise "Pg_ident.conf section: contents not found." + end + } + end + end + # check datanode + if @datanode != nil + datanode_item = get_datanode_name + if datanode_item == nil and has_datanode_default? == false + raise "Pg_ident.conf section: name value is missing." + end + if datanode_item != nil + datanode_item.each {|name| + if get_datanode_contents(name) == nil + raise "Pg_ident.conf section: contents not found." + end + } + end + end + end + + def get_datanode_name + if @datanode == nil + return nil + end + ary = [] + @datanode.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def get_coordinator_name + if @coordinator == nil + return nil + end + ary = [] + @coordinator.each {|item| + if item["name"] != nil and item["name"] != "default" + ary << item["name"] + end + } + if ary.size == 0 + ary = nil + end + return ary + end + + def has_datanode_default? + if @datanode == nil + return false + end + @datanode.each {|item| + if item["name"] == "default" + return true + end + } + return false + end + + def has_coordinator_default? + if @coordinator == nil + return false + end + @coordinator.each {|item| + if item["name"] == "default" + return true + end + } + return false + end + + def get_coordinator_contents(name) + if @coordinator == nil + return nil + end + @coordinator.each {|item| + if item["name"] == name + return item["content"] + end + } + return nil + end + + def get_datanode_contents(name) + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == name + return item["content"] + end + } + return nil + end + + def get_coordinator_default_contents + if @coordinator == nil + return nil + end + @coordinator.each {|item| + if item["name"] == "default" + return item["content"] + end + } + return nil + end + + def get_datanode_default_contents + if @datanode == nil + return nil + end + @datanode.each {|item| + if item["name"] == "default" + return item["content"] + end + } + return nil + end + +end + +#------------------------------ +# PGXC config Class +#------------------------------ +class PGXCCONF + attr_accessor :value, :postgresxc, :server, :gtm, :gtmproxy, :datanode, :coordinator, :pgsqlconf, :rpm, :pghbaconf, :pgidentconf + def initialize(yaml) + @value = YAML.load_file(yaml) + @postgresxc = PostgresXC.new(@value['postgres-xc']) + @server = Server.new(@value['server']) + @gtm = GTM.new(@value['gtm']) + @gtmproxy = GTMProxy.new(@value['gtm-proxy']) + @datanode = Datanode.new(@value['datanode']) + @coordinator = Coordinator.new(@value['coordinator']) + @pgsqlconf = PGSQLConf.new(@value['postgresql.conf']) + @rpm = RPM.new(@value['rpm']) + @pghbaconf = PGHBAConf.new(@value['pg_hba.conf']) + @pgidentconf = PGIDENTConf.new(@value['pg_ident.conf']) + validate + end + + def to_file(path_filename) + f = File.open(File.expand_path("#{path_filename}"), "w") + f.puts @value.to_yaml + f.close + end + + def validate + # top level section keyword check + required = { "postgres-xc"=>true, "server"=>true, "gtm"=>true, "gtm-proxy"=>false, + "datanode"=>true, "coordinator"=>true, "rpm"=>true, + "postgresql.conf"=>true, "pg_hba.conf"=>false, "pg_ident.conf"=>false} + yaml_keys = [] + @value.each {|k, v| + yaml_keys << k + } + required.each {|k, v| + if yaml_keys.index(k) == nil and required[k] == true + raise "'#{k}' section is missing." + end + } + required_key = [] + required.each {|k, v| + required_key << k + } + yaml_keys.each {|k| + if required_key.index(k) == nil + raise "Unknown section '#{k}'." + end + } + + # Mirror ? + mirror_type = @datanode.mirror_datanode? + if mirror_type + # check xc_watcher section + if @postgresxc.value.has_key?('XC_WATCHER') == false + raise "XcWatcher section is missing." + end + if @postgresxc.XC_WATCHER_HOST == nil + raise "XcWatcher section: 'server' is missing." + end + if @postgresxc.XC_WATCHER_PORT == nil + raise "XcWatcher section: 'port' is missing." + end + # check xc_watcher_server + if @server.server(@postgresxc.XC_WATCHER_HOST) == nil + raise "XcWatcher '#{@postgresxc.XC_WATCHER_HOST}' is not found in the server section." + end + # check monitoring agent + if @postgresxc.value.has_key?('MONITORING_AGENT') == false + raise "Monitoring Agent section is missing." + end + if @postgresxc.MONITORING_AGENT_PORT == nil + raise "Monitoring Agent: 'port' is missing." + end + end + + + # check gtm server + @gtm.server.each {|v| + if @server.server(v) == nil + raise "Gtm '#{@gtm.server}' is not found in the server section." + end + } + @gtm.name.each {|v| + if @gtm.ip_addr(v) != nil + result = false + @server.get_ip_addr(@gtm.server(v)).each {|ip| + if ip == @gtm.ip_addr(v) + result = true + break + end + } + if result == false + raise "Gtm 'ip_addr: #{@gtm.ip_addr(v)}' is not found in the server section." + end + else + if @server.get_ip_addr(@gtm.server(v)).size != 1 + raise "Gtm 'ip_addr' value is missing." + end + end + } + + # check gtm-proxy section + # check server + if @gtmproxy.value != nil + @gtmproxy.get_name.each {|name| + if @server.server(@gtmproxy.get_server(name)) == nil + raise "Gtm-proxy 'server: #{@gtmproxy.get_server(name)}' is not found in the server section." + end + } + # check ip_addr + @gtmproxy.get_name.each {|name| + gtmp_ip = @gtmproxy.get_ip_addr(name) + if gtmp_ip != nil + if @server.get_ip_addr(@gtmproxy.get_server(name)).index(gtmp_ip) == nil + raise "Gtm-proxy 'name: #{name}' and 'ip_addr: #{gtmp_ip}' are not found in the server section." + end + else + if @server.get_ip_addr(@gtmproxy.get_server(name)).size != 1 + raise "Gtm-proxy 'ip_addr' is not included in 'name: #{name}'." + end + end + } + #check gtm + @gtmproxy.get_name.each {|name| + gtm_name = @gtmproxy.get_gtm(name) + if @gtm.name.index(gtm_name) + next + else + raise "Gtm-proxy 'gtm: #{gtm_name}' is not found in the gtm section." + end + } + end + + # check datanode section + # check server + @datanode.get_name.each {|name| + if @datanode.get_standby_type(name) == "mirror" + @datanode.get_mirror_servers(name).each {|svr| + if @server.server(svr) == nil + raise "Datanode 'server: #{svr}' is not found in the server section." + end + } + else + if @server.server(@datanode.get_server(name)) == nil + raise "Datanode 'server: #{@datanode.get_server(name)}' is not found in the server section." + end + end + } + # check ip_addr + @datanode.get_name.each {|name| + if @datanode.get_standby_type(name) == "mirror" + mirror_name = @datanode.get_mirror_name(name) + datanode_svr_ip = @datanode.get_mirror_svr_ip_addr(name) + datanode_ip = [] + datanode_svr_ip.each {|dn_ip| + next if dn_ip['ip_addr'] == nil + datanode_ip << dn_ip['ip_addr'] + } + if datanode_svr_ip != nil + if datanode_ip.size != datanode_ip.uniq.size + raise "Datanode 'name:#{name}, ip_addr: or server:' value is duplicated." + end + datanode_svr_ip.each {|svr_ip| + if svr_ip["ip_addr"] != nil + if @server.get_ip_addr(svr_ip["server"]).index(svr_ip["ip_addr"]) == nil + raise "Datanode 'name:#{name}, ip_addr: #{svr_ip['ip_addr']}' value is not found in the server section." + end + else + if @server.get_ip_addr(svr_ip["server"]).size != 1 + raise "Datanode 'ip_addr' is not included in 'name: #{name}'." + end + end + } + else + raise "Datanode 'name:#{name}' is server value is not found." + end + else + datanode_ip = @datanode.get_ip_addr(name) + if datanode_ip != nil + if @server.get_ip_addr(@datanode.get_server(name)).index(datanode_ip) == nil + raise "Datanode 'name:#{name}, ip_addr: #{datanode_ip}' value is not found in the server section." + end + else + if @server.get_ip_addr(@datanode.get_server(name)).size != 1 + raise "Datanode 'ip_addr' is not included in 'name: #{name}'." + end + end + end + } + # check gtm + gtm_proxy_name = @gtmproxy.get_name + if gtm_proxy_name == nil + gtm_proxy_name = [] + end + @datanode.get_name.each {|name| + if @datanode.get_standby_type(name) == "mirror" + @datanode.get_mirror_name(name).each {|mirror_nm| + gtm_name = @datanode.get_mirror_gtm(name,mirror_nm) + if @gtm.name == gtm_name or gtm_proxy_name.index(gtm_name) != nil + next + else + raise "Datanode 'gtm: #{gtm_name}' is not found in gtm or gtm-proxy section." + end + } + else + gtm_name = @datanode.get_gtm(name) + if @gtm.name == gtm_name or gtm_proxy_name.index(gtm_name) != nil + next + else + raise "Datanode 'gtm: #{gtm_name}' is not found in gtm or gtm-proxy section." + end + end + } + # check datanode data_direcotry + @datanode.get_name.each {|name| + if @datanode.get_standby_type(name) == "mirror" + @datanode.get_mirror_name(name).each {|mirror_nm| + if get_mirror_datanode_data_directory(name,mirror_nm) == nil + raise "Datanode data_direcotry value is not found in 'datanode: #{name}, mirror: #{mirror_nm}'." + end + } + else + if get_datanode_data_directory(name) == nil + raise "Datanode data_direcotry value is not found in 'datanode: #{name}'." + end + end + } + + # check coordinatro section + # check server + @coordinator.get_name.each {|name| + if @server.server(@coordinator.get_server(name)) == nil + raise "Coordinator 'server: #{@coordinator.get_server(name)}' is not found in the server section." + end + } + # check ip_addr + @coordinator.get_name.each {|name| + coordinator_ip = @coordinator.get_ip_addr(name) + if coordinator_ip != nil + if @server.get_ip_addr(@coordinator.get_server(name)).index(coordinator_ip) == nil + raise "Coordinator 'name: #{name}, ip_addr: #{coordinator_ip}' is not found in the server section." + end + else + if @server.get_ip_addr(@coordinator.get_server(name)).size != 1 + raise "Coordinator 'ip_addr' is not included in 'name: #{name}'." + end + end + } + # check gtm + gtm_proxy_name = @gtmproxy.get_name + if gtm_proxy_name == nil + gtm_proxy_name = [] + end + @coordinator.get_name.each {|name| + gtm_name = @coordinator.get_gtm(name) + if @gtm.name == gtm_name or gtm_proxy_name.index(gtm_name) != nil + next + else + raise "Coordinator 'gtm: #{gtm_name}' value is not found in gtm or gtm-proxy section." + end + } + # check preferred_data_nodes + @coordinator.get_name.each {|name| + @coordinator.get_preferred_data_nodes(name).each {|dn_name| + if @datanode.get_name.index(dn_name) != nil + next + else + raise "Coordinator 'preferred_data_nodes: #{dn_name}' is not found in the datanode section" + end + } + } + # check coordinator data_direcotry + @coordinator.get_name.each {|name| + if get_coordinator_data_directory(name) == nil + raise "Coordinator data_direcotry is not found in 'coordinator: #{name}'" + end + } + # datanode and coordinator + # check pg_ident.conf + if @pgidentconf.get_datanode_name != nil + @pgidentconf.get_datanode_name.each {|name| + if @datanode.get_name.index(name) == nil + raise "Pg_ident.conf section: '#{name}' value is not found datanode section." + end + } + end + if @pgidentconf.get_coordinator_name... [truncated message content] |
From: Michael P. <mic...@us...> - 2011-05-12 03:58:07
|
Project "Postgres-XC". The branch, ha_support has been updated via 4f452a336a0cea55c13b93823f39ffed547f9065 (commit) from 95fbb1a7742ef7cb0698875dbb3ad758499c21c7 (commit) - Log ----------------------------------------------------------------- commit 4f452a336a0cea55c13b93823f39ffed547f9065 Author: Michael P <mic...@us...> Date: Thu May 12 12:54:18 2011 +0900 Fix for GXID feed This fix is already done on master branch, but it became also necessary here for HA test purposes. diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 1f3c09f..a619fd4 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -1751,13 +1751,14 @@ CommitTransaction(bool contact_gtm) bool PrepareLocalCoord = false; bool PreparePGXCNodes = false; char implicitgid[256]; - TransactionId xid = GetCurrentTransactionId(); + TransactionId xid = InvalidTransactionId; if (IS_PGXC_COORDINATOR && !IsConnFromCoord() && contact_gtm) PreparePGXCNodes = PGXCNodeIsImplicit2PC(&PrepareLocalCoord); if (PrepareLocalCoord || PreparePGXCNodes) { + xid = GetCurrentTransactionId(); sprintf(implicitgid, "T%d", xid); /* Build Implicit 2PC Data for implicit PREPARE */ ----------------------------------------------------------------------- Summary of changes: src/backend/access/transam/xact.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) hooks/post-receive -- Postgres-XC |
From: Michael P. <mic...@us...> - 2011-05-12 03:52:41
|
Project "Postgres-XC". The branch, ha_support has been deleted was cf27a768d5e2f74c88d029a03d857a8d57040e34 ----------------------------------------------------------------------- cf27a768d5e2f74c88d029a03d857a8d57040e34 Fix for GXID feed ----------------------------------------------------------------------- hooks/post-receive -- Postgres-XC |
From: Koichi S. <koi...@us...> - 2011-05-12 02:01:18
|
Project "Postgres-XC". The branch, documentation has been updated via 58954e79e274b1280329aa61ca6af66b88c59cf6 (commit) from 0222ee52bb3fd9bedc71ee86169ad5009137fecc (commit) - Log ----------------------------------------------------------------- commit 58954e79e274b1280329aa61ca6af66b88c59cf6 Author: Koichi Suzuki <koi...@gm...> Date: Thu May 12 10:54:23 2011 +0900 This is the second commit of Postgres-XC documentation. Contents of the commit is as follows: 1) For sections just from PostgreSQL and not reviewd yet, added notice that this need further review and revision. Notice will be found in the file pgnotice.sgmlin. 2) First revision work on "installation". This is still WIP. To include notice in 1) almost all the files are modified. So far, we can generate html and man with this commit. diff --git a/doc/src/sgml/pgnotice.sgmlin b/doc/src/sgml/pgnotice.sgmlin new file mode 100644 index 0000000..515d384 --- /dev/null +++ b/doc/src/sgml/pgnotice.sgmlin @@ -0,0 +1,6 @@ +<!## XC> +<para> +Notice: At present, this section is just taken from PostgreSQL documentation +and is subject to revision for Postgres-XC. +</para> +<!## end> ----------------------------------------------------------------------- Summary of changes: doc/src/sgml/pgnotice.sgmlin | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) create mode 100644 doc/src/sgml/pgnotice.sgmlin hooks/post-receive -- Postgres-XC |