From 74eb7b4e6bb091123720c4e225208523a424f9c8 Mon Sep 17 00:00:00 2001 From: Aravinda VK Date: Wed, 10 Aug 2016 14:02:09 +0530 Subject: geo-rep: Handle EISDIR error during Unlink During Rename, If Source and Target has same inode then Geo-rep unlinks source. But if source is a directory then this will fail with below traceback Traceback (most recent call last): File "/usr/libexec/glusterfs/python/syncdaemon/repce.py", line 113, in worker res = getattr(self.obj, rmeth)(*in_data[2:]) File "/usr/libexec/glusterfs/python/syncdaemon/resource.py", line 772, in entry_ops os.unlink(entry) OSError: [Errno 21] Is a directory: '.gfid/12711ebf-7fdc-4f4b-9850-2d75581eb 452/New folder' With this patch, if EISDIR, rmdir is tried. Logs error in Slave log in case of ENOTEMPTY. > Reviewed-on: http://review.gluster.org/15132 > NetBSD-regression: NetBSD Build System > CentOS-regression: Gluster Build System > Smoke: Gluster Build System > Reviewed-by: Kotresh HR BUG: 1374579 Change-Id: I099af4192adac5125c0a23988ceb6506f91e987f Signed-off-by: Aravinda VK (cherry picked from commit 8a6236e4cfc7bf86e881e5c770a19040a6060ad0) Reviewed-on: http://review.gluster.org/15436 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Saravanakumar Arumugam --- geo-replication/syncdaemon/resource.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'geo-replication') diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index ed0e7efe2b2..acbd49e1b54 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -773,7 +773,23 @@ class Server(object): else: if st.st_ino == st1.st_ino: # we have a hard link, we can now unlink source - os.unlink(entry) + try: + os.unlink(entry) + except OSError as e: + if e.errno == EISDIR: + try: + os.rmdir(entry) + except OSError as e: + if e.errno == ENOTEMPTY: + logging.error( + "Unable to delete directory " + "{0}, Both Old({1}) and New{2}" + " directories exists".format( + entry, entry, en)) + else: + raise + else: + raise else: rename_with_disk_gfid_confirmation(gfid, entry, en) if blob: -- cgit