Blob Blame History Raw
--- a/fence/agents/lib/fencing.py.py	2017-09-28 13:45:20.920463487 +0200
+++ b/fence/agents/lib/fencing.py.py	2017-09-28 13:47:56.844961761 +0200
@@ -1075,6 +1075,9 @@
 					# fence action was completed succesfully even in that case
 					logging.warning("%s", str(ex))
 
+				# switch back to original action for the case it is used lateron
+				options["--action"] = "reboot"
+
 			if power_on == False:
 				# this should not fail as node was fenced succesfully
 				logging.error('Timed out waiting to power ON\n')
@@ -1278,11 +1281,21 @@
 
 	return (status, pipe_stdout, pipe_stderr)
 
-def run_delay(options):
-	## Delay is important for two-node clusters fencing but we do not need to delay 'status' operations
-	if options["--action"] in ["off", "reboot"]:
-		logging.info("Delay %s second(s) before logging in to the fence device", options["--delay"])
-		time.sleep(int(options["--delay"]))
+def run_delay(options, reserve=0, result=0):
+	## Delay is important for two-node clusters fencing
+	## but we do not need to delay 'status' operations
+	## and get us out quickly if we already know that we are gonna fail
+	## still wanna do something right before fencing? - reserve some time
+	if options["--action"] in ["off", "reboot"] \
+		and options["--delay"] != "0" \
+		and result == 0 \
+		and reserve >= 0:
+		time_left = 1 + int(options["--delay"]) - (time.time() - run_delay.time_start) - reserve
+		if time_left > 0:
+			logging.info("Delay %d second(s) before logging in to the fence device", time_left)
+			time.sleep(time_left)
+# mark time when fence-agent is started
+run_delay.time_start = time.time()
 
 def fence_logout(conn, logout_string, sleep=0):
 	# Logout is not required part of fencing but we should attempt to do it properly