set<int> witnessed; // nodes who have journaled a RenamePrepare
map<MDSCacheObject*,version_t> pvmap;
+ bool has_journaled_slaves;
bool slave_update_journaled;
// for rename
dirfrag_t fragment_base;
More() :
- slave_update_journaled(false),
+ has_journaled_slaves(false), slave_update_journaled(false),
srcdn_auth_mds(-1), inode_import_v(0), rename_inode(0),
is_freeze_authpin(false), is_ambiguous_auth(false),
is_remote_frozen_authpin(false), is_inode_exporter(false),
if (!g_conf->mds_early_reply)
return;
- if (mdr->has_witnesses()) {
- dout(10) << "early_reply - there are witnesses, not allowed." << dendl;
+ if (mdr->has_more() && mdr->more()->has_journaled_slaves) {
+ dout(10) << "early_reply - there are journaled slaves, not allowed." << dendl;
mds->mdlog->flush();
return;
}
// set up commit waiter
mdr->more()->slave_commit = new C_MDS_SlaveLinkCommit(this, mdr, targeti);
+ mdr->more()->slave_update_journaled = true;
submit_mdlog_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti),
mdr, __func__);
mdlog->flush();
// witnessed!
assert(mdr->more()->witnessed.count(from) == 0);
mdr->more()->witnessed.insert(from);
+ assert(!m->is_not_journaled());
+ mdr->more()->has_journaled_slaves = true;
// remove from waiting list
assert(mdr->more()->waiting_on_slave.count(from));
MMDSSlaveRequest *reply = new MMDSSlaveRequest(mdr->reqid, mdr->attempt,
MMDSSlaveRequest::OP_RMDIRPREPACK);
+ reply->mark_not_journaled();
mds->send_message_mds(reply, mdr->slave_to_mds);
// send caps to auth (if we're not already)
mdr->more()->slaves.insert(from);
mdr->more()->witnessed.insert(from);
+ if (!ack->is_not_journaled())
+ mdr->more()->has_journaled_slaves = true;
// remove from waiting list
assert(mdr->more()->waiting_on_slave.count(from));
// prepare ack
MMDSSlaveRequest *reply = NULL;
- if (!mdr->aborted)
+ if (!mdr->aborted) {
reply= new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RENAMEPREPACK);
+ if (!mdr->more()->slave_update_journaled)
+ reply->mark_not_journaled();
+ }
CDentry::linkage_t *srcdnl = srcdn->get_linkage();
CDentry::linkage_t *destdnl = NULL;
assert(mdr->more()->witnessed.count(from) == 0);
if (ack->witnesses.empty()) {
mdr->more()->witnessed.insert(from);
+ if (!ack->is_not_journaled())
+ mdr->more()->has_journaled_slaves = true;
} else {
dout(10) << " extra witnesses (srcdn replicas) are " << ack->witnesses << dendl;
mdr->more()->extra_witnesses.swap(ack->witnesses);
static const unsigned FLAG_NONBLOCK = 1;
static const unsigned FLAG_WOULDBLOCK = 2;
+ static const unsigned FLAG_NOTJOURNALED = 4;
// for locking
__u16 lock_type; // lock object type
bool is_nonblock() { return (flags & FLAG_NONBLOCK); }
void mark_error_wouldblock() { flags |= FLAG_WOULDBLOCK; }
bool is_error_wouldblock() { return (flags & FLAG_WOULDBLOCK); }
+ void mark_not_journaled() { flags |= FLAG_NOTJOURNALED; }
+ bool is_not_journaled() { return (flags & FLAG_NOTJOURNALED); }
void set_lock_type(int t) { lock_type = t; }