diff options
Diffstat (limited to 'geo-replication/syncdaemon/resource.py')
| -rw-r--r-- | geo-replication/syncdaemon/resource.py | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index 81edfaa4a49..27f7e84a2ce 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -690,6 +690,16 @@ class Server(object):              op = e['op']              gfid = e['gfid']              entry = e['entry'] +            uid = 0 +            gid = 0 +            if e.get("stat", {}): +                # Copy UID/GID value and then reset to zero. Copied UID/GID +                # will be used to run chown once entry is created. +                uid = e['stat']['uid'] +                gid = e['stat']['gid'] +                e['stat']['uid'] = 0 +                e['stat']['gid'] = 0 +              (pg, bname) = entry2pb(entry)              if op in ['RMDIR', 'UNLINK']:                  # Try once, if rmdir failed with ENOTEMPTY @@ -768,6 +778,16 @@ class Server(object):                                       [EEXIST, ENOENT],                                       [ESTALE, EINVAL])                  collect_failure(e, cmd_ret) + +                # If UID/GID is different than zero that means we are trying +                # create Entry with different UID/GID. Create Entry with +                # UID:0 and GID:0, and then call chown to set UID/GID +                if uid != 0 or gid != 0: +                    path = os.path.join(pfx, gfid) +                    cmd_ret = errno_wrap(os.chown, [path, uid, gid], [ENOENT], +                                         [ESTALE, EINVAL]) +                collect_failure(e, cmd_ret) +          return failures      @classmethod  | 
