mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-25 14:53:37 +00:00
Add before stop hook (#2642)
The two cases we have in mind are: * In spite of following all best practices client-side, logical replication connections can sometimes hang the Postgres shutdown sequence. We'd like to sigterm any misbehaving logical replication connections which remain after x seconds. These will inevitably get killed anyway on master stop timeout. * remove "role=master" label on current primary when not using k8s as DCS. Waiting until after Postgres fully stops can sometimes be too long for this. * Pause pgbouncer connections before switchover Close #2596
This commit is contained in:
@@ -170,7 +170,8 @@ class TestPostgresql(BaseTestPostgresql):
|
||||
@patch('time.sleep', Mock())
|
||||
@patch.object(Postgresql, 'is_running')
|
||||
@patch.object(Postgresql, '_wait_for_connection_close', Mock())
|
||||
def test_stop(self, mock_is_running):
|
||||
@patch('patroni.postgresql.cancellable.CancellableSubprocess.call')
|
||||
def test_stop(self, mock_cancellable_call, mock_is_running):
|
||||
# Postmaster is not running
|
||||
mock_callback = Mock()
|
||||
mock_is_running.return_value = None
|
||||
@@ -195,6 +196,19 @@ class TestPostgresql(BaseTestPostgresql):
|
||||
mock_postmaster.wait.side_effect = [psutil.TimeoutExpired(30), Mock()]
|
||||
self.assertTrue(self.p.stop(on_safepoint=mock_callback, stop_timeout=30))
|
||||
|
||||
# Ensure before_stop script is called when configured to
|
||||
self.p.config._config['before_stop'] = ':'
|
||||
mock_postmaster.wait.side_effect = [psutil.TimeoutExpired(30), Mock()]
|
||||
mock_cancellable_call.return_value = 0
|
||||
with patch('patroni.postgresql.logger.info') as mock_logger:
|
||||
self.p.stop(on_safepoint=mock_callback, stop_timeout=30)
|
||||
self.assertEqual(mock_logger.call_args[0], ('before_stop script `%s` exited with %s', ':', 0))
|
||||
mock_postmaster.wait.side_effect = [psutil.TimeoutExpired(30), Mock()]
|
||||
mock_cancellable_call.side_effect = Exception
|
||||
with patch('patroni.postgresql.logger.error') as mock_logger:
|
||||
self.p.stop(on_safepoint=mock_callback, stop_timeout=30)
|
||||
self.assertEqual(mock_logger.call_args_list[1][0][0], 'Exception when calling `%s`: %r')
|
||||
|
||||
# Stop signal failed
|
||||
mock_postmaster.signal_stop.return_value = False
|
||||
self.assertFalse(self.p.stop())
|
||||
|
||||
Reference in New Issue
Block a user