geo-rep: use cold tier bricks for namespace operations

Problem:
symlinks are not getting synced to slave in a Tiering based volume.

Solution:
Now, symlinks are created directly in cold tier bricks( in the backend).

Earlier, cold tier was avoided for namespace operations and only
hot tier was used while processing changelogs.

Now, cold tier is HASH subvolume in a Tiering volume.
So, carry out namespace operation only in cold tier subvolume and
avoid hot tier subvolume to avoid any races.

Earlier, XSYNC was used(and changeloghistory avoided) during initial sync
in order to avoid race while processing historychangelog in Hot tier.
This is no longer required as there is no race from Hot tier.

Also, avoid both live and history changelog ENTRY operations from Hot tier to avoid any race with cold tier.

Change-Id: Ia8fbb7ae037f5b6cb683f36c0df5c3fc2894636e
BUG: 1287519
Signed-off-by: Saravanakumar Arumugam <sarumuga@redhat.com>
Reviewed-on: http://review.gluster.org/12844
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kotresh HR <khiremat@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
This commit is contained in:
Saravanakumar Arumugam 2015-12-02 14:26:47 +05:30 committed by Venky Shankar
parent e6046ddc62
commit 93f31189ce
4 changed files with 13 additions and 17 deletions

View File

@ -358,7 +358,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')
op.add_option('--is-hottier', default=False, action='store_true')
tunables = [norm(o.get_opt_string()[2:])
for o in op.option_list

View File

@ -828,10 +828,11 @@ 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'
# skip ENTRY operation if hot tier brick
if self.name == 'live_changelog' or \
self.name == 'history_changelog':
if boolify(gconf.is_hottier) and et == self.TYPE_ENTRY:
logging.debug('skip ENTRY op: %s if hot tier brick'
% (ec[self.POS_TYPE]))
continue

View File

@ -99,9 +99,9 @@ class Volinfo(object):
def get(self, elem):
return self.tree.findall('.//' + elem)
def is_cold(self, brickpath):
def is_hot(self, brickpath):
logging.debug('brickpath: ' + repr(brickpath))
return brickpath in self.cold_bricks
return brickpath in self.hot_bricks
@property
@memoize
@ -132,8 +132,8 @@ class Volinfo(object):
@property
@memoize
def cold_bricks(self):
return [b.text for b in self.get('coldBricks/brick')]
def hot_bricks(self):
return [b.text for b in self.get('hotBricks/brick')]
class Monitor(object):
@ -268,7 +268,7 @@ class Monitor(object):
','.join([str(rw), str(ww),
str(ra), str(wa)]),
'--subvol-num', str(w[2])] +
(['--is-coldtier'] if w[3] else []) +
(['--is-hottier'] if w[3] else []) +
['--resource-remote', remote_host])
cpids.add(cpid)
@ -419,7 +419,7 @@ def distribute(*resources):
workerspex = [(brick['dir'], slaves[idx % len(slaves)],
get_subvol_num(idx, mvol.replica_count, mvol.disperse_count),
mvol.is_cold(":".join([brick['host'], brick['dir']])))
mvol.is_hot(":".join([brick['host'], brick['dir']])))
for idx, brick in enumerate(mvol.bricks)
if is_host_local(brick['host'])]
logging.info('worker specs: ' + repr(workerspex))

View File

@ -1434,12 +1434,7 @@ class GLUSTER(AbstractUrl, SlaveLocal, SlaveRemote):
# Note: if config.change_detector is xsync then
# it will not use changelog history api
try:
# 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)
g3.crawlwrap(oneshot=True)
except PartialHistoryAvailable as e:
logging.info('Partial history available, using xsync crawl'
' after consuming history till %s' % str(e))