m->put();
}
+void MDS::request_osdmap(Context *c) {
+ objecter->wait_for_new_map(c, osdmap->get_epoch());
+}
+
/* This function DOES put the passed message before returning*/
void MDS::handle_command(MMonCommand *m)
{
// indicates how may retries of request have been made
int retry;
+ // indicator for vxattr osdmap update
+ bool waited_for_osdmap;
+
// break rarely-used fields into a separately allocated structure
// to save memory for most ops
struct More {
slave_request(0),
internal_op(-1),
retry(0),
+ waited_for_osdmap(false),
_more(0) {
in[0] = in[1] = 0;
}
slave_request(0),
internal_op(-1),
retry(0),
+ waited_for_osdmap(false),
_more(0) {
in[0] = in[1] = 0;
}
slave_request(0),
internal_op(-1),
retry(0),
+ waited_for_osdmap(false),
_more(0) {
in[0] = in[1] = 0;
}
int64_t pool = mds->osdmap->lookup_pg_pool_name(value);
if (pool < 0) {
dout(10) << " unknown pool " << value << dendl;
- return -EINVAL;
+ return -ENOENT;
}
layout->fl_pg_pool = pool;
}
rest = name.substr(name.find("layout"));
int r = parse_layout_vxattr(rest, value, &dlayout->layout);
if (r < 0) {
+ if (r == -ENOENT) {
+ if (!mdr->waited_for_osdmap) {
+ // send request to get latest map, but don't wait if
+ // we don't get anything newer than what we have
+ mdr->waited_for_osdmap = true;
+ mds->request_osdmap(
+ new C_MDS_RetryRequest(mdcache, mdr));
+ return;
+ }
+ r = -EINVAL;
+ }
reply_request(mdr, r);
return;
}
rest = name.substr(name.find("layout"));
int r = parse_layout_vxattr(rest, value, &layout);
if (r < 0) {
+ if (r == -ENOENT) {
+ if (!mdr->waited_for_osdmap) {
+ // send request to get latest map, but don't wait if
+ // we don't get anything newer than what we have
+ mdr->waited_for_osdmap = true;
+ mds->request_osdmap(
+ new C_MDS_RetryRequest(mdcache, mdr));
+ return;
+ }
+ r = -EINVAL;
+ }
reply_request(mdr, r);
return;
}