diff options
author | Aravinda VK <avishwan@redhat.com> | 2016-08-10 14:02:09 +0530 |
---|---|---|
committer | Aravinda VK <avishwan@redhat.com> | 2016-09-08 09:16:05 -0700 |
commit | 8a6236e4cfc7bf86e881e5c770a19040a6060ad0 (patch) | |
tree | 6a92f9481ab1fdd9ae91f535a16d286a73704ad6 /geo-replication | |
parent | 9db2826cd8dbcc0fb58f5434c21d00ca5c15c491 (diff) |
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.
BUG: 1365791
Change-Id: I099af4192adac5125c0a23988ceb6506f91e987f
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/15132
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Kotresh HR <khiremat@redhat.com>
Diffstat (limited to 'geo-replication')
-rw-r--r-- | geo-replication/syncdaemon/resource.py | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index 0004a839e69..312d488d6a9 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -816,7 +816,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: |