summaryrefslogtreecommitdiffstats
path: root/geo-replication/syncdaemon/monitor.py
diff options
context:
space:
mode:
Diffstat (limited to 'geo-replication/syncdaemon/monitor.py')
-rw-r--r--geo-replication/syncdaemon/monitor.py45
1 files changed, 44 insertions, 1 deletions
diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py
index 5e0698b8c46..e50893c793f 100644
--- a/geo-replication/syncdaemon/monitor.py
+++ b/geo-replication/syncdaemon/monitor.py
@@ -18,6 +18,7 @@ import xml.etree.ElementTree as XET
from subprocess import PIPE
from resource import Popen, FILE, GLUSTER, SSH
from threading import Lock
+from errno import EEXIST
import re
import random
from gconf import gconf
@@ -29,6 +30,16 @@ from syncdutils import escape, Thread, finalize, memoize
ParseError = XET.ParseError if hasattr(XET, 'ParseError') else SyntaxError
+def get_subvol_num(brick_idx, replica_count, disperse_count):
+ subvol_size = disperse_count if disperse_count > 0 else replica_count
+ cnt = int((brick_idx + 1) / subvol_size)
+ rem = (brick_idx + 1) % subvol_size
+ if rem > 0:
+ return cnt + 1
+ else:
+ return cnt
+
+
def get_slave_bricks_status(host, vol):
po = Popen(['gluster', '--xml', '--remote-host=' + host,
'volume', 'status', vol, "detail"],
@@ -104,6 +115,15 @@ class Volinfo(object):
self.volume, self.host)
return ids[0].text
+ @property
+ @memoize
+ def replica_count(self):
+ return int(self.get('replicaCount')[0].text)
+
+ @property
+ @memoize
+ def disperse_count(self):
+ return int(self.get('disperseCount')[0].text)
class Monitor(object):
@@ -154,6 +174,7 @@ class Monitor(object):
# give a chance to graceful exit
os.kill(-os.getpid(), signal.SIGTERM)
+
def monitor(self, w, argv, cpids, agents, slave_vol, slave_host):
"""the monitor loop
@@ -247,6 +268,7 @@ class Monitor(object):
'--rpc-fd',
','.join([str(rw), str(ww),
str(ra), str(wa)]),
+ '--subvol-num', str(w[2]),
'--resource-remote',
remote_host])
@@ -374,7 +396,8 @@ def distribute(*resources):
else:
slaves = slavevols
- workerspex = [(brick['dir'], slaves[idx % len(slaves)])
+ workerspex = [(brick['dir'], slaves[idx % len(slaves)],
+ get_subvol_num(idx, mvol.replica_count, mvol.disperse_count))
for idx, brick in enumerate(mvol.bricks)
if is_host_local(brick['host'])]
logging.info('worker specs: ' + repr(workerspex))
@@ -382,6 +405,26 @@ def distribute(*resources):
def monitor(*resources):
+ # Mount geo-rep management volume
+ if gconf.meta_volume:
+ mgmt_mnt = os.path.join(gconf.working_dir, gconf.meta_volume)
+ if not os.path.exists(mgmt_mnt):
+ try:
+ os.makedirs(mgmt_mnt)
+ except OSError:
+ ex = sys.exc_info()[1]
+ if ex.errno == EEXIST:
+ pass
+ else:
+ raise
+
+ if not os.path.ismount(mgmt_mnt):
+ po = Popen(["mount", "-t", "glusterfs", "localhost:%s"
+ % gconf.meta_volume, mgmt_mnt], stdout=PIPE,
+ stderr=PIPE)
+ po.wait()
+ po.terminate_geterr()
+
# Check if gsyncd restarted in pause state. If
# yes, send SIGSTOP to negative of monitor pid
# to go back to pause state.