diff options
| -rw-r--r-- | geo-replication/syncdaemon/resource.py | 23 | ||||
| -rw-r--r-- | tests/00-geo-rep/georep-basic-dr-rsync.t | 1 | ||||
| -rw-r--r-- | tests/geo-rep.rc | 12 | 
3 files changed, 27 insertions, 9 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index a2d0b16899a..c290d86880e 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -625,15 +625,20 @@ class Server(object):                  # exist with different gfid.                  if not matching_disk_gfid(gfid, entry):                      if e['stat'] and not stat.S_ISDIR(e['stat']['mode']): -                        if stat.S_ISLNK(e['stat']['mode']) and \ -                           e['link'] is not None: -                            st1 = lstat(en) -                            if isinstance(st1, int): -                                (pg, bname) = entry2pb(en) -                                blob = entry_pack_symlink(cls, gfid, bname, -                                                          e['link'], e['stat']) -                            elif not matching_disk_gfid(gfid, en): -                                collect_failure(e, EEXIST, uid, gid, True) +                        if stat.S_ISLNK(e['stat']['mode']): +                            # src is not present, so don't sync symlink as +                            # we don't know target. It's ok to ignore. If +                            # it's unliked, it's fine. If it's renamed to +                            # something else, it will be synced then. +                            if e['link'] is not None: +                                st1 = lstat(en) +                                if isinstance(st1, int): +                                    (pg, bname) = entry2pb(en) +                                    blob = entry_pack_symlink(cls, gfid, bname, +                                                              e['link'], +                                                              e['stat']) +                                elif not matching_disk_gfid(gfid, en): +                                    collect_failure(e, EEXIST, uid, gid, True)                          else:                              slink = os.path.join(pfx, gfid)                              st = lstat(slink) diff --git a/tests/00-geo-rep/georep-basic-dr-rsync.t b/tests/00-geo-rep/georep-basic-dr-rsync.t index 062ca91760c..919c9d924ad 100644 --- a/tests/00-geo-rep/georep-basic-dr-rsync.t +++ b/tests/00-geo-rep/georep-basic-dr-rsync.t @@ -113,6 +113,7 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1  #Check History Crawl.  TEST $GEOREP_CLI $master $slave stop  TEST create_data "history" +TEST create_rename_symlink_case  TEST $GEOREP_CLI $master $slave start  EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"  EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive" diff --git a/tests/geo-rep.rc b/tests/geo-rep.rc index 396b4c4a3e5..d72312956b3 100644 --- a/tests/geo-rep.rc +++ b/tests/geo-rep.rc @@ -19,6 +19,18 @@ function check_common_secret_file()      echo $?  } +function create_rename_symlink_case() +{ +    mkdir ${mastermnt}/MUL_REN_SYMLINK +    cd ${mastermnt}/MUL_REN_SYMLINK +    mkdir sym_dir1 +    ln -s "sym_dir1" sym1 +    mv sym1 sym2 +    mv sym2 sym3 +    mv sym3 sym4 +    cd - +} +  function create_data()  {      prefix=$1  | 
