diff options
author | Venky Shankar <venky@gluster.com> | 2011-10-24 15:29:00 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-11-04 02:06:44 -0700 |
commit | 8e171a03d81452a2998b01997da7647c0b3bf52b (patch) | |
tree | 54117831ec7c55fe0b1bb67f9ec227c5fe2059c6 /xlators/features/marker/utils/syncdaemon/monitor.py | |
parent | cc0a908bc5d5046bcb2909fc98765038f15e918d (diff) |
cli: add geo-replication log-rotate command
Rotating geo-replication master/monitor log files from cli.
On invocation, the log file for a given master-slave session
is backed up with the current timestamp suffixed to the file
name and signal is sent to gsyncd to start logging to a new
log file.
Sample commands:
* Rotate log file for this <master>:<slave> session:
gluster volume geo-replication <master> <slave> log-rotate
* Rotate log files for all session for master volume <master>
gluster volume geo-replication <master> log-rotate
* Rotate log files for all sessions:
gluster volume geo-replication log-rotate
Change-Id: If801743e9f37bd282e68d262203141626ce77e55
BUG: 3519
Reviewed-on: http://review.gluster.com/653
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Csaba Henk <csaba@gluster.com>
Diffstat (limited to 'xlators/features/marker/utils/syncdaemon/monitor.py')
-rw-r--r-- | xlators/features/marker/utils/syncdaemon/monitor.py | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/xlators/features/marker/utils/syncdaemon/monitor.py b/xlators/features/marker/utils/syncdaemon/monitor.py index 365e91435fd..f58aa592c9f 100644 --- a/xlators/features/marker/utils/syncdaemon/monitor.py +++ b/xlators/features/marker/utils/syncdaemon/monitor.py @@ -1,11 +1,10 @@ import os import sys import time +import signal import logging -import select -from signal import SIGKILL from gconf import gconf -from syncdutils import update_file +from syncdutils import update_file, select, waitpid class Monitor(object): @@ -21,6 +20,19 @@ class Monitor(object): update_file(gconf.state_file, lambda f: f.write(state + '\n')) def monitor(self): + def sigcont_handler(*a): + """ + Re-init logging and send group kill signal + """ + md = gconf.log_metadata + logging.shutdown() + lcls = logging.getLoggerClass() + lcls.setup(label=md.get('saved_label'), **md) + pid = os.getpid() + os.kill(-pid, signal.SIGUSR1) + signal.signal(signal.SIGUSR1, lambda *a: ()) + signal.signal(signal.SIGCONT, sigcont_handler) + argv = sys.argv[:] for o in ('-N', '--no-daemon', '--monitor'): while o in argv: @@ -31,11 +43,16 @@ class Monitor(object): self.set_state('starting...') ret = 0 def nwait(p, o=0): - p2, r = os.waitpid(p, o) + p2, r = waitpid(p, o) if not p2: return - if os.WIFEXITED(r): - return os.WEXITSTATUS(r) + return r + def exit_signalled(s): + """ child teminated due to receipt of SIGUSR1 """ + return (os.WIFSIGNALED(s) and (os.WTERMSIG(s) == signal.SIGUSR1)) + def exit_status(s): + if os.WIFEXITED(s): + return os.WEXITSTATUS(s) return 1 conn_timeout = 60 while ret in (0, 1): @@ -48,7 +65,7 @@ class Monitor(object): os.execv(sys.executable, argv + ['--feedback-fd', str(pw)]) os.close(pw) t0 = time.time() - so = select.select((pr,), (), (), conn_timeout)[0] + so = select((pr,), (), (), conn_timeout)[0] os.close(pr) if so: ret = nwait(cpid, os.WNOHANG) @@ -65,13 +82,17 @@ class Monitor(object): else: logging.debug("worker not confirmed in %d sec, aborting it" % \ conn_timeout) - os.kill(cpid, SIGKILL) + os.kill(cpid, signal.SIGKILL) ret = nwait(cpid) if ret == None: self.set_state('OK') ret = nwait(cpid) - elif ret in (0, 1): - self.set_state('faulty') + if exit_signalled(ret): + ret = 0 + else: + ret = exit_status(ret) + if ret in (0,1): + self.set_state('faulty') time.sleep(10) self.set_state('inconsistent') return ret |