summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--geo-replication/syncdaemon/gsyncd.py3
-rw-r--r--geo-replication/syncdaemon/gsyncdstatus.py17
2 files changed, 18 insertions, 2 deletions
diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py
index 32e4eb7828d..b3c7e62506e 100644
--- a/geo-replication/syncdaemon/gsyncd.py
+++ b/geo-replication/syncdaemon/gsyncd.py
@@ -615,7 +615,8 @@ def main_i():
status_get = rconf.get('status_get')
if status_get:
for brick in gconf.path:
- brick_status = GeorepStatus(gconf.state_file, brick)
+ brick_status = GeorepStatus(gconf.state_file, brick,
+ getattr(gconf, "pid_file", None))
checkpoint_time = int(getattr(gconf, "checkpoint", "0"))
brick_status.print_status(checkpoint_time=checkpoint_time)
return
diff --git a/geo-replication/syncdaemon/gsyncdstatus.py b/geo-replication/syncdaemon/gsyncdstatus.py
index 57692f8fab0..77f3f9e7569 100644
--- a/geo-replication/syncdaemon/gsyncdstatus.py
+++ b/geo-replication/syncdaemon/gsyncdstatus.py
@@ -16,6 +16,7 @@ import urllib
import json
import time
from datetime import datetime
+from errno import EACCES, EAGAIN
DEFAULT_STATUS = "N/A"
MONITOR_STATUS = ("Created", "Started", "Paused", "Stopped")
@@ -113,7 +114,7 @@ def set_monitor_status(status_file, status):
class GeorepStatus(object):
- def __init__(self, monitor_status_file, brick):
+ def __init__(self, monitor_status_file, brick, monitor_pid_file=None):
self.work_dir = os.path.dirname(monitor_status_file)
self.monitor_status_file = monitor_status_file
self.filename = os.path.join(self.work_dir,
@@ -126,6 +127,7 @@ class GeorepStatus(object):
os.close(fd)
self.brick = brick
self.default_values = get_default_values()
+ self.monitor_pid_file = monitor_pid_file
def _update(self, mergerfunc):
with LockedOpen(self.filename, 'r+') as f:
@@ -254,6 +256,19 @@ class GeorepStatus(object):
pass
monitor_status = self.get_monitor_status()
+ # Verifying whether monitor process running and adjusting status
+ if monitor_status in ["Started", "Paused"]:
+ try:
+ with open(self.monitor_pid_file, "r+") as f:
+ fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ monitor_status = "Stopped"
+ except (IOError, OSError) as e:
+ if e.errno in (EACCES, EAGAIN):
+ # cannot grab. so, monitor process still running..move on
+ pass
+ else:
+ raise
+
if monitor_status in ["Created", "Paused", "Stopped"]:
data["worker_status"] = monitor_status