mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-25 14:53:37 +00:00
Not doing so makes it hard to implement callbacks in bash and eventually can lead to the situation when two callbacks are running at the same time. In case if we failed to kill the child process we will still wait for it to finish. The same problem could happen with custom bootstrap, therefore if we happen to kill the custom bootstrap process we also kill all child subprocesses. Closes https://github.com/zalando/patroni/issues/1238
35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
import psutil
|
|
import unittest
|
|
|
|
from mock import Mock, patch
|
|
from patroni.exceptions import PostgresException
|
|
from patroni.postgresql.cancellable import CancellableSubprocess
|
|
|
|
|
|
class TestCancellableSubprocess(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.c = CancellableSubprocess()
|
|
|
|
def test_call(self):
|
|
self.c.cancel()
|
|
self.assertRaises(PostgresException, self.c.call, communicate_input=None)
|
|
|
|
def test__kill_children(self):
|
|
self.c._process_children = [Mock()]
|
|
self.c._kill_children()
|
|
self.c._process_children[0].kill.side_effect = psutil.AccessDenied()
|
|
self.c._kill_children()
|
|
self.c._process_children[0].kill.side_effect = psutil.NoSuchProcess(123)
|
|
self.c._kill_children()
|
|
|
|
@patch('patroni.postgresql.cancellable.polling_loop', Mock(return_value=[0, 0]))
|
|
def test_cancel(self):
|
|
self.c._process = Mock()
|
|
self.c._process.is_running.return_value = True
|
|
self.c._process.children.side_effect = psutil.Error()
|
|
self.c._process.suspend.side_effect = psutil.Error()
|
|
self.c.cancel()
|
|
self.c._process.is_running.side_effect = [True, False]
|
|
self.c.cancel()
|