@@ -330,8 +330,9 @@ def version(self):
330
330
"""
331
331
return self._pg_version
332
332
333
- def _try_shutdown(self, max_attempts):
333
+ def _try_shutdown(self, max_attempts, with_force=False ):
334
334
attempts = 0
335
+ node_pid = self.pid
335
336
336
337
# try stopping server N times
337
338
while attempts < max_attempts:
@@ -341,12 +342,30 @@ def _try_shutdown(self, max_attempts):
341
342
except ExecUtilException:
342
343
pass # one more time
343
344
except Exception:
344
- # TODO: probably should kill stray instance
345
345
eprint('cannot stop node {}'.format(self.name))
346
346
break
347
347
348
348
attempts += 1
349
349
350
+ # If force stopping is enabled and PID is valid
351
+ if with_force and node_pid != 0:
352
+ # If we couldn't stop the node
353
+ p_status_output = self.os_ops.exec_command(cmd=f'ps -p {node_pid}', shell=True).decode('utf-8')
354
+ if self.status() != NodeStatus.Stopped and p_status_output and str(node_pid) in p_status_output:
355
+ try:
356
+ eprint(f'Force stopping node {self.name} with PID {node_pid}')
357
+ self.os_ops.kill(node_pid, signal.SIGKILL, expect_error=False)
358
+ except Exception:
359
+ # The node has already stopped
360
+ pass
361
+
362
+ # Check that node stopped
363
+ p_status_output = self.os_ops.exec_command(f'ps -p {node_pid}', shell=True, expect_error=True).decode('utf-8')
364
+ if p_status_output and str(node_pid) in p_status_output:
365
+ eprint(f'Failed to stop node {self.name}.')
366
+ else:
367
+ eprint(f'Node {self.name} has been stopped successfully.')
368
+
350
369
def _assign_master(self, master):
351
370
"""NOTE: this is a private method!"""
352
371
0 commit comments