diff options
Diffstat (limited to 'geo-replication/syncdaemon/master.py')
| -rw-r--r-- | geo-replication/syncdaemon/master.py | 26 | 
1 files changed, 20 insertions, 6 deletions
diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py index 2aae860f5d1..2987bca0601 100644 --- a/geo-replication/syncdaemon/master.py +++ b/geo-replication/syncdaemon/master.py @@ -24,7 +24,7 @@ from datetime import datetime  from gconf import gconf  from syncdutils import Thread, GsyncdError, boolify, escape_space_newline  from syncdutils import unescape_space_newline, gauxpfx, md5hex, selfkill -from syncdutils import lstat, errno_wrap, FreeObject, lf +from syncdutils import lstat, errno_wrap, FreeObject, lf, matching_disk_gfid  from syncdutils import NoStimeAvailable, PartialHistoryAvailable  URXTIME = (-1, 0) @@ -792,6 +792,10 @@ class GMasterChangelogMixin(GMasterCommon):          fix_entry_ops = []          failures1 = []          for failure in failures: +            if failure[2]['dst']: +                pbname = failure[0]['entry1'] +            else: +                pbname = failure[0]['entry']              if failure[2]['gfid_mismatch']:                  slave_gfid = failure[2]['slave_gfid']                  st = lstat(os.path.join(pfx, slave_gfid)) @@ -800,7 +804,6 @@ class GMasterChangelogMixin(GMasterCommon):                                      ' the entry', retry_count=retry_count,                                      entry=repr(failure)))                      #Add deletion to fix_entry_ops list -                    pbname = failure[0]['entry']                      if failure[2]['slave_isdir']:                          fix_entry_ops.append(edct('RMDIR',                                                    gfid=failure[2]['slave_gfid'], @@ -836,7 +839,6 @@ class GMasterChangelogMixin(GMasterCommon):                                          ' Deleting the entry',                                          retry_count=retry_count,                                          entry=repr(failure))) -                        pbname = failure[0]['entry']                          fix_entry_ops.append(edct('UNLINK',                                                    gfid=failure[2]['slave_gfid'],                                                    entry=pbname)) @@ -1024,15 +1026,27 @@ class GMasterChangelogMixin(GMasterCommon):                                          stat=st, link=rl))                  else:                      # stat() to get mode and other information +                    if not matching_disk_gfid(gfid, en): +                        logging.debug(lf('Ignoring entry, purged in the ' +                                      'interim', file=en, gfid=gfid)) +                        continue +                      go = os.path.join(pfx, gfid)                      st = lstat(go)                      if isinstance(st, int): -                        logging.debug(lf('file got purged in the interim', -                                         file=go)) +                        logging.debug(lf('Ignoring entry, purged in the ' +                                      'interim', file=en, gfid=gfid))                          continue                      if ty == 'LINK': -                        entries.append(edct(ty, stat=st, entry=en, gfid=gfid)) +                        rl = None +                        if st and stat.S_ISLNK(st.st_mode): +                            rl = errno_wrap(os.readlink, [en], [ENOENT], +                                            [ESTALE]) +                            if isinstance(rl, int): +                                rl = None +                        entries.append(edct(ty, stat=st, entry=en, gfid=gfid, +                                       link=rl))                      elif ty == 'SYMLINK':                          rl = errno_wrap(os.readlink, [en], [ENOENT], [ESTALE])                          if isinstance(rl, int):  | 
