Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

client: wait for lastest osdmap when handling set file/dir layout #13580

Merged
merged 1 commit into from Mar 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 17 additions & 6 deletions src/client/Client.cc
Expand Up @@ -10277,6 +10277,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);
Expand All @@ -10288,6 +10290,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);
Expand All @@ -10299,6 +10303,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)
Expand Down Expand Up @@ -10550,7 +10556,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") {
Expand Down Expand Up @@ -10590,18 +10596,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) {
Expand All @@ -10610,6 +10615,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);

Expand Down
4 changes: 2 additions & 2 deletions src/client/Client.h
Expand Up @@ -804,6 +804,8 @@ class Client : public Dispatcher, public md_config_obs_t {
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,
Expand Down Expand Up @@ -857,8 +859,6 @@ class Client : public Dispatcher, public md_config_obs_t {
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);

Expand Down