@@ -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