Blob Blame History Raw
From a13ef4a5ef08913004223feb8dfdc7e1e8ed0b5c Mon Sep 17 00:00:00 2001
From: Kotresh HR <khiremat@redhat.com>
Date: Tue, 4 Jul 2017 08:46:06 -0400
Subject: [PATCH 544/557] geo-rep: Fix entry failure because parent dir doesn't
 exist

In a distributed volume on master, it can so happen that
the RMDIR followed by MKDIR is recorded in changelog on
a particular subvolume with same gfid and pargfid/bname
but not on all subvolumes as below.

E 61c67a2e-07f2-45a9-95cf-d8f16a5e9c36 RMDIR \
9cc51be8-91c3-4ef4-8ae3-17596fcfed40%2Ffedora2
E 61c67a2e-07f2-45a9-95cf-d8f16a5e9c36 MKDIR 16877 0 0 \
9cc51be8-91c3-4ef4-8ae3-17596fcfed40%2Ffedora2

While processing this changelog, geo-rep thinks RMDIR is
successful and does recursive rmdir on slave. But in the
master the directory still exists. This could lead to
data discrepancy between master and slave.

Cause:
RMDIR-MKDIR pair gets recorded so in changelog when the
directory removal is successful on cached subvolume and
failed in one of hashed subvol for some reason
(may be down). In this case, the directory is re-created
on cached subvol which gets recorded as MKDIR again in
changelog.

Solution:
So while processing RMDIR geo-replication should stat on
master with gfid and should not delete it if it's present.

> Change-Id: If5da1d6462eb4d9ebe2e88b3a70cc454411a133e
> BUG: 1467718
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
> Reviewed-on: https://review.gluster.org/17695
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Aravinda VK <avishwan@redhat.com>

Change-Id: If5da1d6462eb4d9ebe2e88b3a70cc454411a133e
BUG: 1468186
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/111301
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 geo-replication/syncdaemon/master.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py
index 39dd6ea..3bd9b54 100644
--- a/geo-replication/syncdaemon/master.py
+++ b/geo-replication/syncdaemon/master.py
@@ -823,6 +823,11 @@ class GMasterChangelogMixin(GMasterCommon):
                     if pt in datas:
                         datas.remove(pt)
 
+                    if ty in ['RMDIR'] and not isinstance(st, int):
+                        logging.info(lf('Ignoring rmdir. Directory present in '
+                                        'master', gfid=gfid, pgfid_bname=en))
+                        continue
+
                     if not boolify(gconf.ignore_deletes):
                         purge_update()
                         entries.append(edct(ty, gfid=gfid, entry=en))
-- 
1.8.3.1