diff options
| author | Aravinda VK <avishwan@redhat.com> | 2014-08-12 18:19:30 +0530 | 
|---|---|---|
| committer | Venky Shankar <vshankar@redhat.com> | 2014-08-14 19:56:41 -0700 | 
| commit | 2510af16744f7825c91bed4507968181050bbf88 (patch) | |
| tree | 23720fe0912a45d0748619e392fa55d303ef780f /geo-replication/syncdaemon/resource.py | |
| parent | 718f10e0d68715be2d73e677974629452485c699 (diff) | |
geo-rep: Handle RMDIR recursively
If RMDIR is recorded in brick changelog which is due to
self heal traffic then it will not have UNLINK entries for
child files. Geo-rep hangs with ENOTEMPTY error on slave.
Now geo-rep recursively deletes the dir if it gets ENOTEMPTY.
BUG: 1129702
Change-Id: Iacfe6a05d4b3a72b68c3be7fd19f10af0b38bcd1
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/8477
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
Diffstat (limited to 'geo-replication/syncdaemon/resource.py')
| -rw-r--r-- | geo-replication/syncdaemon/resource.py | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index c84265739c5..09310c1f1aa 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -26,6 +26,7 @@ import subprocess  from errno import EEXIST, ENOENT, ENODATA, ENOTDIR, ELOOP  from errno import EISDIR, ENOTEMPTY, ESTALE, EINVAL  from select import error as SelectError +import shutil  from gconf import gconf  import repce @@ -616,6 +617,17 @@ class Server(object):                  while True:                      er = entry_purge(entry, gfid)                      if isinstance(er, int): +                        if er == ENOTEMPTY and op == 'RMDIR': +                            er1 = errno_wrap(shutil.rmtree, +                                             [os.path.join(pg, bname)], +                                             [ENOENT]) +                            if not isinstance(er1, int): +                                logging.info("Removed %s/%s recursively" % +                                             (pg, bname)) +                                break + +                        logging.warn("Failed to remove %s => %s/%s. %s" % +                                     (gfid, pg, bname, os.strerror(er)))                          time.sleep(1)                      else:                          break  | 
