From: Yan, Zheng Date: Wed, 22 Feb 2017 09:33:05 +0000 (+0800) Subject: client: wait for lastest osdmap when handling set file/dir layout X-Git-Tag: v11.2.1~29^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7674f84ddf8f8f8f0a3fe8c3b336bacc0718eeed;p=ceph.git client: wait for lastest osdmap when handling set file/dir layout Fixes: http://tracker.ceph.com/issues/18914 Signed-off-by: "Yan, Zheng" (cherry picked from commit 76f5eb86cdd61dde4e6c7cfeb5cf34f0c0334f21) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 2596920814d0c..d72cb2c40f46d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -10303,6 +10303,8 @@ int Client::fremovexattr(int fd, const char *name, const UserPerm& perms) int Client::setxattr(const char *path, const char *name, const void *value, size_t size, int flags, const UserPerm& perms) { + _setxattr_maybe_wait_for_osdmap(name, value, size); + Mutex::Locker lock(client_lock); InodeRef in; int r = Client::path_walk(path, &in, perms, true); @@ -10314,6 +10316,8 @@ int Client::setxattr(const char *path, const char *name, const void *value, int Client::lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags, const UserPerm& perms) { + _setxattr_maybe_wait_for_osdmap(name, value, size); + Mutex::Locker lock(client_lock); InodeRef in; int r = Client::path_walk(path, &in, perms, false); @@ -10325,6 +10329,8 @@ int Client::lsetxattr(const char *path, const char *name, const void *value, int Client::fsetxattr(int fd, const char *name, const void *value, size_t size, int flags, const UserPerm& perms) { + _setxattr_maybe_wait_for_osdmap(name, value, size); + Mutex::Locker lock(client_lock); Fh *f = get_filehandle(fd); if (!f) @@ -10576,7 +10582,7 @@ int Client::_setxattr(InodeRef &in, const char *name, const void *value, return _setxattr(in.get(), name, value, size, flags, perms); } -int Client::check_data_pool_exist(string name, string value, const OSDMap *osdmap) +int Client::_setxattr_check_data_pool(string& name, string& value, const OSDMap *osdmap) { string tmp; if (name == "layout") { @@ -10616,18 +10622,17 @@ int Client::check_data_pool_exist(string name, string value, const OSDMap *osdma return 0; } -int Client::ll_setxattr(Inode *in, const char *name, const void *value, - size_t size, int flags, const UserPerm& perms) +void Client::_setxattr_maybe_wait_for_osdmap(const char *name, const void *value, size_t size) { // For setting pool of layout, MetaRequest need osdmap epoch. // There is a race which create a new data pool but client and mds both don't have. // Make client got the latest osdmap which make mds quickly judge whether get newer osdmap. - if (strcmp(name, "ceph.file.layout.pool") == 0 || strcmp(name, "ceph.dir.layout.pool") == 0 || + if (strcmp(name, "ceph.file.layout.pool") == 0 || strcmp(name, "ceph.dir.layout.pool") == 0 || strcmp(name, "ceph.file.layout") == 0 || strcmp(name, "ceph.dir.layout") == 0) { string rest(strstr(name, "layout")); - string v((const char*)value); + string v((const char*)value, size); int r = objecter->with_osdmap([&](const OSDMap& o) { - return check_data_pool_exist(rest, v, &o); + return _setxattr_check_data_pool(rest, v, &o); }); if (r == -ENOENT) { @@ -10636,6 +10641,12 @@ int Client::ll_setxattr(Inode *in, const char *name, const void *value, ctx.wait(); } } +} + +int Client::ll_setxattr(Inode *in, const char *name, const void *value, + size_t size, int flags, const UserPerm& perms) +{ + _setxattr_maybe_wait_for_osdmap(name, value, size); Mutex::Locker lock(client_lock); diff --git a/src/client/Client.h b/src/client/Client.h index d5c679749aeba..4e35f8151ccf2 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -805,6 +805,8 @@ private: int flags, const UserPerm& perms); int _setxattr(InodeRef &in, const char *name, const void *value, size_t len, int flags, const UserPerm& perms); + int _setxattr_check_data_pool(string& name, string& value, const OSDMap *osdmap); + void _setxattr_maybe_wait_for_osdmap(const char *name, const void *value, size_t len); int _removexattr(Inode *in, const char *nm, const UserPerm& perms); int _removexattr(InodeRef &in, const char *nm, const UserPerm& perms); int _open(Inode *in, int flags, mode_t mode, Fh **fhp, @@ -858,8 +860,6 @@ private: int _getattr_for_perm(Inode *in, const UserPerm& perms); int _getgrouplist(gid_t **sgids, uid_t uid, gid_t gid); - int check_data_pool_exist(string name, string value, const OSDMap *osdmap); - vinodeno_t _get_vino(Inode *in); inodeno_t _get_inodeno(Inode *in);