manageiq-postgres_ha_admin 3.1.4 → 3.2.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.
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