manageiq-postgres_ha_admin 3.1.4 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 302246b3dedf536233f20df1c381932adbbe7c85366e400dd3678eda57f8ebf4
4
- data.tar.gz: cfc4aee15059200a0dddd56dea7a6f4563b89b24742682dd1c10b66e26bd9ac5
3
+ metadata.gz: 56101e65dae001ffb46cd7694fbef68783b68e9a65acf249be6442de3bfe9946
4
+ data.tar.gz: 7168416de251ecc47a6f18b74ee670aff0e064f856f4977b9ba326251db6908e
5
5
  SHA512:
6
- metadata.gz: 3169f9907e9b75c426dfea5908945921e82ef27a68769427ae556ab703d683ca0a5b4887d7206526417acdee0f908a1660ddbc90717d18ff09fabd873b8b5b6b
7
- data.tar.gz: 15766ce8377afa98450b7928d46dc790fb2a9f874760914fa929583d4951bae18288c1ff3b5dff7e75d07247723c17e0db87d71703fb22f7103db0d7e573b875
6
+ metadata.gz: ca051fa5381377b6252a323a3f77befb7f544d155d86a5b749409a58f7af68d6d2d8cb1c248d8bea6ebbeab8f45a57b43bf87deca082f43720642b7b47f505c8
7
+ data.tar.gz: 4d32d6edb84ff1cdf9d4448fbc1239962c7b24382d31e143b8169f00156947ea6160a5e63b54647c7c94dee0e4d838320f85f1a2434ac736d7dc8019b7187cc9
@@ -40,6 +40,7 @@ jobs:
40
40
  with:
41
41
  ruby-version: ${{ matrix.ruby-version }}
42
42
  bundler-cache: true
43
+ timeout-minutes: 30
43
44
  - name: Run tests
44
45
  run: bundle exec rake
45
46
  - name: Report code coverage
data/CHANGELOG.md CHANGED
@@ -5,36 +5,46 @@ This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [3.2.0] - 2022-09-26
9
+ ### Added
10
+ - Add simple prefix to all log lines [#38](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/38)
11
+
12
+ ### Changed
13
+ - 5 minute db checks is too long, use 2 minutes [#37](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/37)
14
+
15
+ ### Removed
16
+ - Remove unused pglogical_config_handler [#35](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/35)
17
+
18
+ ### Fixed
19
+ - Don't attempt a database failover without a known standby [#36](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/36)
20
+
8
21
  ## [3.1.4] - 2022-04-30
9
22
  ### Changed
10
- - Loosed rails dependency to include rails 6.1
11
- - Support Ruby 3.0
23
+ - Loosen rails dependency to include rails 6.1 [#28](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/28)
12
24
 
13
25
  ## [3.1.3] - 2021-09-27
14
-
15
26
  ### Changed
16
27
  - Loosen manageiq-password dependency to < 2 [#26](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/26)
17
- - Update ruby versions to 2.5.8 minimum [#25](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/25)
28
+ - Update ruby versions to 2.5.8 minimum and support Ruby 3.0 [#25](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/25)
18
29
  - Switch to manageiq-style [#24](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/24)
19
30
 
20
31
  ## [3.1.2] - 2020-12-21
32
+ ### Changed
21
33
  - Allow for Rails 6.0 [#23](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/23)
22
34
 
23
35
  ## [3.1.1] - 2019-12-12
36
+ ### Changed
24
37
  - Remove the dependency on linux_admin [#19](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/19)
25
38
 
26
39
  ## [3.1.0] - 2019-05-09
27
-
28
40
  ### Added
29
41
  - Add a logical replication config handler [#17](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/17)
30
42
 
31
43
  ## [3.0.1] - 2019-03-19
32
-
33
44
  ### Changed
34
45
  - Remove references to MiqPassword [#15](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/15)
35
46
 
36
47
  ## [3.0.0] - 2018-09-05
37
-
38
48
  ### Added
39
49
  - Allow users of the gem to specify a logger object [#7](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/7)
40
50
 
@@ -44,7 +54,6 @@ This project adheres to [Semantic Versioning](http://semver.org/).
44
54
  - Make failover monitor generic [#10](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/10)
45
55
 
46
56
  ## [2.0.0] - 2018-08-01
47
-
48
57
  ### Added
49
58
  - Add pg-dsn_parser to the gemspec [#5](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/5)
50
59
  - Add postgresql addon for travis [#6](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/6)
@@ -52,7 +61,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
52
61
  ### Changed
53
62
  - Make changes for upgrading repmgr to version 4 [#4](https://github.com/ManageIQ/manageiq-postgres_ha_admin/pull/4)
54
63
 
55
- [Unreleased]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.1.4...master
64
+ [Unreleased]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.2.0...master
65
+ [3.2.0]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.1.4...v3.2.0
56
66
  [3.1.4]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.1.3...v3.1.4
57
67
  [3.1.3]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.1.2...v3.1.3
58
68
  [3.1.2]: https://github.com/ManageIQ/manageiq-postgres_ha_admin/compare/v3.1.1...v3.1.2
@@ -27,9 +27,12 @@ module PostgresHaAdmin
27
27
  @before_failover_cb&.call
28
28
  end
29
29
 
30
+ # Upon successful failover
30
31
  def do_after_failover(new_primary_conn_info)
31
32
  @after_failover_cb&.call(new_primary_conn_info)
32
33
  end
34
+
35
+ # If needed, we can add an unsuccessful failover hook
33
36
  end
34
37
  end
35
38
  end
@@ -7,7 +7,7 @@ module PostgresHaAdmin
7
7
  include Logging
8
8
 
9
9
  FAILOVER_ATTEMPTS = 10
10
- DB_CHECK_FREQUENCY = 300
10
+ DB_CHECK_FREQUENCY = 120
11
11
  FAILOVER_CHECK_FREQUENCY = 60
12
12
  attr_accessor :failover_attempts, :db_check_frequency, :failover_check_frequency
13
13
  attr_reader :config_handlers
@@ -31,17 +31,20 @@ module PostgresHaAdmin
31
31
  next
32
32
  end
33
33
 
34
- logger.error("Primary Database is not available for #{handler.name}. Starting to execute failover...")
34
+ logger.error("#{log_prefix(__callee__)} Primary Database is not available for #{handler.name}. Starting to execute failover...")
35
35
  handler.do_before_failover
36
36
 
37
37
  new_conn_info = execute_failover(handler, server_store)
38
+
38
39
  if new_conn_info
40
+ # Upon success, we pass a connection hash
39
41
  handler.do_after_failover(new_conn_info)
40
42
  else
41
- logger.error("Failover failed")
43
+ # Add failover_failed hook if we have a use case in the future
44
+ logger.error("#{log_prefix(__callee__)} Failover failed")
42
45
  end
43
46
  rescue => e
44
- logger.error("Received #{e.class} error while monitoring #{handler.name}: #{e.message}")
47
+ logger.error("#{log_prefix(__callee__)} Received #{e.class} error while monitoring #{handler.name}: #{e.message}")
45
48
  logger.error(e.backtrace)
46
49
  end
47
50
  end
@@ -52,7 +55,7 @@ module PostgresHaAdmin
52
55
  begin
53
56
  monitor
54
57
  rescue => err
55
- logger.error("#{err.class}: #{err}")
58
+ logger.error("#{log_prefix(__callee__)} #{err.class}: #{err}")
56
59
  logger.error(err.backtrace.join("\n"))
57
60
  end
58
61
  sleep(db_check_frequency)
@@ -72,21 +75,37 @@ module PostgresHaAdmin
72
75
  begin
73
76
  ha_admin_yml = YAML.load_file(ha_admin_yml_file) if File.exist?(ha_admin_yml_file)
74
77
  rescue SystemCallError, IOError => err
75
- logger.error("#{err.class}: #{err}")
76
- logger.info("File not loaded: #{ha_admin_yml_file}. Default settings for failover will be used.")
78
+ logger.error("#{log_prefix(__callee__)} #{err.class}: #{err}")
79
+ logger.info("#{log_prefix(__callee__)} File not loaded: #{ha_admin_yml_file}. Default settings for failover will be used.")
77
80
  end
78
81
  @failover_attempts = ha_admin_yml['failover_attempts'] || FAILOVER_ATTEMPTS
79
82
  @db_check_frequency = ha_admin_yml['db_check_frequency'] || DB_CHECK_FREQUENCY
80
83
  @failover_check_frequency = ha_admin_yml['failover_check_frequency'] || FAILOVER_CHECK_FREQUENCY
81
- logger.info("FAILOVER_ATTEMPTS=#{@failover_attempts} DB_CHECK_FREQUENCY=#{@db_check_frequency} FAILOVER_CHECK_FREQUENCY=#{@failover_check_frequency}")
84
+ logger.info("#{log_prefix(__callee__)} FAILOVER_ATTEMPTS=#{@failover_attempts} DB_CHECK_FREQUENCY=#{@db_check_frequency} FAILOVER_CHECK_FREQUENCY=#{@failover_check_frequency}")
85
+ end
86
+
87
+ def any_known_standby?(handler, server_store)
88
+ current_host = handler.read[:host]
89
+ server_store.servers.any? do |server|
90
+ server[:host] != current_host && server[:type] == "standby"
91
+ end
82
92
  end
83
93
 
84
94
  def execute_failover(handler, server_store)
95
+ # TODO: Instead of returning false, we should raise:
96
+ # "No active standby"
97
+ # "Standby in recovery"
98
+ # "Exhausted all failover retry attempts" exceptions
99
+ unless any_known_standby?(handler, server_store)
100
+ logger.error("#{log_prefix(__callee__)} Cannot attempt failover without a known active standby. Please verify the database.yml and ensure the database is started.")
101
+ return false
102
+ end
103
+
85
104
  failover_attempts.times do
86
105
  with_each_standby_connection(handler, server_store) do |connection, params|
87
106
  next if database_in_recovery?(connection)
88
107
  next unless server_store.host_is_primary?(params[:host], connection)
89
- logger.info("Failing over to server using conninfo: #{params.reject { |k, _v| k == :password }}")
108
+ logger.info("#{log_prefix(__callee__)} Failing over to server using conninfo: #{params.reject { |k, _v| k == :password }}")
90
109
  server_store.update_servers(connection)
91
110
  handler.write(params)
92
111
  return params
@@ -111,7 +130,7 @@ module PostgresHaAdmin
111
130
  def pg_connection(params)
112
131
  PG::Connection.open(params)
113
132
  rescue PG::Error => e
114
- logger.error("Failed to establish PG connection: #{e.message}")
133
+ logger.error("#{log_prefix(__callee__)} Failed to establish PG connection: #{e.message}")
115
134
  nil
116
135
  end
117
136
 
@@ -4,6 +4,10 @@ module PostgresHaAdmin
4
4
  def logger
5
5
  ManageIQ::PostgresHaAdmin.logger
6
6
  end
7
+
8
+ def log_prefix(method)
9
+ "(PostgresHaAdmin##{method})"
10
+ end
7
11
  end
8
12
  end
9
13
  end
@@ -25,11 +25,11 @@ module PostgresHaAdmin
25
25
  def update_servers(connection)
26
26
  new_servers = query_repmgr(connection)
27
27
  if servers_changed?(new_servers)
28
- logger.info("Updating servers cache to #{new_servers}")
28
+ logger.info("#{log_prefix(__callee__)} Updating servers cache to #{new_servers}")
29
29
  @servers = new_servers
30
30
  end
31
31
  rescue IOError => err
32
- logger.error("#{err.class}: #{err}")
32
+ logger.error("#{log_prefix(__callee__)} #{err.class}: #{err}")
33
33
  logger.error(err.backtrace.join("\n"))
34
34
  end
35
35
 
@@ -59,7 +59,7 @@ module PostgresHaAdmin
59
59
  db_result.clear
60
60
  result
61
61
  rescue PG::Error => err
62
- logger.error("#{err.class}: #{err}")
62
+ logger.error("#{log_prefix(__callee__)} #{err.class}: #{err}")
63
63
  logger.error(err.backtrace.join("\n"))
64
64
  result
65
65
  end
@@ -1,5 +1,5 @@
1
1
  module ManageIQ
2
2
  module PostgresHaAdmin
3
- VERSION = '3.1.4'.freeze
3
+ VERSION = '3.2.0'.freeze
4
4
  end
5
5
  end
@@ -8,7 +8,6 @@ require 'manageiq/postgres_ha_admin/failover_monitor'
8
8
 
9
9
  require 'manageiq/postgres_ha_admin/config_handler'
10
10
  require 'manageiq/postgres_ha_admin/config_handler/rails_config_handler'
11
- require 'manageiq/postgres_ha_admin/config_handler/pglogical_config_handler'
12
11
  require 'manageiq/postgres_ha_admin/config_handler/logical_replication_config_handler'
13
12
 
14
13
  module ManageIQ
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manageiq-postgres_ha_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.4
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ManageIQ Developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-29 00:00:00.000000000 Z
11
+ date: 2022-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -180,7 +180,6 @@ files:
180
180
  - lib/manageiq-postgres_ha_admin.rb
181
181
  - lib/manageiq/postgres_ha_admin/config_handler.rb
182
182
  - lib/manageiq/postgres_ha_admin/config_handler/logical_replication_config_handler.rb
183
- - lib/manageiq/postgres_ha_admin/config_handler/pglogical_config_handler.rb
184
183
  - lib/manageiq/postgres_ha_admin/config_handler/rails_config_handler.rb
185
184
  - lib/manageiq/postgres_ha_admin/failover_monitor.rb
186
185
  - lib/manageiq/postgres_ha_admin/logging.rb
@@ -210,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
209
  - !ruby/object:Gem::Version
211
210
  version: '0'
212
211
  requirements: []
213
- rubygems_version: 3.3.5
212
+ rubygems_version: 3.3.18
214
213
  signing_key:
215
214
  specification_version: 4
216
215
  summary: ManageIQ Postgres H.A. Admin
@@ -1,36 +0,0 @@
1
- require 'pg'
2
- require 'pg/dsn_parser'
3
-
4
- module ManageIQ
5
- module PostgresHaAdmin
6
- class PglogicalConfigHandler < ConfigHandler
7
- attr_reader :subscription, :conn_info
8
-
9
- def initialize(options = {})
10
- @subscription = options[:subscription]
11
- @conn_info = options[:conn_info]
12
- end
13
-
14
- def name
15
- "pglogical subscription #{subscription} Config Handler"
16
- end
17
-
18
- def read
19
- conn = PG::Connection.open(@conn_info)
20
- dsn = conn.exec_params(<<~SQL, [@subscription]).first["if_dsn"]
21
- SELECT if_dsn
22
- FROM pglogical.subscription s
23
- JOIN pglogical.node_interface i
24
- ON s.sub_origin_if = i.if_id
25
- WHERE s.sub_name = $1
26
- SQL
27
- PG::DSNParser.new.parse(dsn)
28
- end
29
-
30
- def write(_params)
31
- # Nothing to do here as the expectation is that the user will
32
- # remove and re-add the subscription in the after failover callback
33
- end
34
- end
35
- end
36
- end