summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--geo-replication/syncdaemon/gsyncd.py1
-rw-r--r--geo-replication/syncdaemon/master.py10
-rw-r--r--geo-replication/syncdaemon/monitor.py17
-rw-r--r--geo-replication/syncdaemon/resource.py7
4 files changed, 30 insertions, 5 deletions
diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py
index b3c7e62506e..982b8532f75 100644
--- a/geo-replication/syncdaemon/gsyncd.py
+++ b/geo-replication/syncdaemon/gsyncd.py
@@ -356,6 +356,7 @@ def main_i():
action='callback', callback=store_local_curry('canon'))
op.add_option('--canonicalize-escape-url', dest='url_print',
action='callback', callback=store_local_curry('canon_esc'))
+ op.add_option('--is-coldtier', default=False, action='store_true')
tunables = [norm(o.get_opt_string()[2:])
for o in op.option_list
diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py
index 407e4b29580..b2cfb8531d1 100644
--- a/geo-replication/syncdaemon/master.py
+++ b/geo-replication/syncdaemon/master.py
@@ -809,6 +809,13 @@ class GMasterChangelogMixin(GMasterCommon):
et = e[self.IDX_START:self.IDX_END] # entry type
ec = e[self.IDX_END:].split(' ') # rest of the bits
+ # skip ENTRY operation if cold tier brick
+ if self.name == 'live_changelog':
+ if boolify(gconf.is_coldtier) and et == self.TYPE_ENTRY:
+ logging.debug('skip ENTRY op: %s if cold tier brick'
+ % (ec[self.POS_TYPE]))
+ continue
+
if et == self.TYPE_ENTRY:
# extract information according to the type of
# the entry operation. create(), mkdir() and mknod()
@@ -1120,6 +1127,7 @@ class GMasterChangelogMixin(GMasterCommon):
self.changelog_done_func = self.changelog_agent.done
self.processed_changelogs_dir = os.path.join(self.setup_working_dir(),
".processed")
+ self.name = "live_changelog"
self.status = status
@@ -1132,6 +1140,7 @@ class GMasterChangeloghistoryMixin(GMasterChangelogMixin):
self.history_turns = 0
self.processed_changelogs_dir = os.path.join(self.setup_working_dir(),
".history/.processed")
+ self.name = "history_changelog"
self.status = status
def crawl(self):
@@ -1226,6 +1235,7 @@ class GMasterXsyncMixin(GMasterChangelogMixin):
self.tempdir = self.setup_working_dir()
self.tempdir = os.path.join(self.tempdir, 'xsync')
self.processed_changelogs_dir = self.tempdir
+ self.name = "xsync"
logging.info('xsync temp directory: %s' % self.tempdir)
try:
os.makedirs(self.tempdir)
diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py
index ba5c8e32514..c41eb969143 100644
--- a/geo-replication/syncdaemon/monitor.py
+++ b/geo-replication/syncdaemon/monitor.py
@@ -99,6 +99,10 @@ class Volinfo(object):
def get(self, elem):
return self.tree.findall('.//' + elem)
+ def is_cold(self, brickpath):
+ logging.debug('brickpath: ' + repr(brickpath))
+ return brickpath in self.cold_bricks
+
@property
@memoize
def bricks(self):
@@ -127,6 +131,10 @@ class Volinfo(object):
def disperse_count(self):
return int(self.get('disperseCount')[0].text)
+ @property
+ @memoize
+ def cold_bricks(self):
+ return [b.text for b in self.get('coldBricks/brick')]
class Monitor(object):
@@ -248,9 +256,9 @@ class Monitor(object):
'--rpc-fd',
','.join([str(rw), str(ww),
str(ra), str(wa)]),
- '--subvol-num', str(w[2]),
- '--resource-remote',
- remote_host])
+ '--subvol-num', str(w[2])] +
+ (['--is-coldtier'] if w[3] else []) +
+ ['--resource-remote', remote_host])
cpids.add(cpid)
agents.add(apid)
@@ -377,7 +385,8 @@ def distribute(*resources):
slaves = slavevols
workerspex = [(brick['dir'], slaves[idx % len(slaves)],
- get_subvol_num(idx, mvol.replica_count, mvol.disperse_count))
+ get_subvol_num(idx, mvol.replica_count, mvol.disperse_count),
+ mvol.is_cold(":".join([brick['host'], brick['dir']])))
for idx, brick in enumerate(mvol.bricks)
if is_host_local(brick['host'])]
logging.info('worker specs: ' + repr(workerspex))
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
index c73347aaf17..51f88627a96 100644
--- a/geo-replication/syncdaemon/resource.py
+++ b/geo-replication/syncdaemon/resource.py
@@ -1435,7 +1435,12 @@ class GLUSTER(AbstractUrl, SlaveLocal, SlaveRemote):
# Note: if config.change_detector is xsync then
# it will not use changelog history api
try:
- g3.crawlwrap(oneshot=True)
+ # if cold brick type, avoid changeloghistory and use xsync
+ if (boolify(gconf.is_coldtier)):
+ logging.info("cold tier using xsync crawl")
+ g1.crawlwrap(oneshot=True)
+ else:
+ g3.crawlwrap(oneshot=True)
except PartialHistoryAvailable as e:
logging.info('Partial history available, using xsync crawl'
' after consuming history till %s' % str(e))