Skip to content

Commit

Permalink
Fix node.py: try_shutdown and cleanup (#144)
Browse files Browse the repository at this point in the history
  • Loading branch information
demonolock authored Sep 17, 2024
1 parent 98b0286 commit 78603f8
Showing 1 changed file with 30 additions and 29 deletions.
59 changes: 30 additions & 29 deletions testgres/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,37 +334,38 @@ def _try_shutdown(self, max_attempts, with_force=False):
attempts = 0
node_pid = self.pid

# try stopping server N times
while attempts < max_attempts:
try:
self.stop()
break # OK
except ExecUtilException:
pass # one more time
except Exception:
eprint('cannot stop node {}'.format(self.name))
break

attempts += 1

# If force stopping is enabled and PID is valid
if with_force and node_pid != 0:
# If we couldn't stop the node
p_status_output = self.os_ops.exec_command(cmd=f'ps -p {node_pid}', shell=True).decode('utf-8')
if self.status() != NodeStatus.Stopped and p_status_output and str(node_pid) in p_status_output:
if node_pid > 0:
# try stopping server N times
while attempts < max_attempts:
try:
eprint(f'Force stopping node {self.name} with PID {node_pid}')
self.os_ops.kill(node_pid, signal.SIGKILL, expect_error=False)
self.stop()
break # OK
except ExecUtilException:
pass # one more time
except Exception:
# The node has already stopped
pass

# Check that node stopped - print only column pid without headers
p_status_output = self.os_ops.exec_command(f'ps -o pid= -p {node_pid}', shell=True, ignore_errors=True).decode('utf-8')
if p_status_output and str(node_pid) in p_status_output:
eprint(f'Failed to stop node {self.name}.')
else:
eprint(f'Node {self.name} has been stopped successfully.')
eprint('cannot stop node {}'.format(self.name))
break

attempts += 1

# If force stopping is enabled and PID is valid
if with_force and node_pid != 0:
# If we couldn't stop the node
p_status_output = self.os_ops.exec_command(cmd=f'ps -p {node_pid}', shell=True).decode('utf-8')
if self.status() != NodeStatus.Stopped and p_status_output and str(node_pid) in p_status_output:
try:
eprint(f'Force stopping node {self.name} with PID {node_pid}')
self.os_ops.kill(node_pid, signal.SIGKILL, expect_error=False)
except Exception:
# The node has already stopped
pass

# Check that node stopped - print only column pid without headers
p_status_output = self.os_ops.exec_command(f'ps -o pid= -p {node_pid}', shell=True, ignore_errors=True).decode('utf-8')
if p_status_output and str(node_pid) in p_status_output:
eprint(f'Failed to stop node {self.name}.')
else:
eprint(f'Node {self.name} has been stopped successfully.')

def _assign_master(self, master):
"""NOTE: this is a private method!"""
Expand Down

0 comments on commit 78603f8

Please sign in to comment.