dout(10) << " slave request " << *mdr << " uncommitted, will resolve shortly" << dendl;
add_ambiguous_slave_update(p->first, mdr->slave_to_mds);
}
+ } else if (mdr->slave_request) {
+ MMDSSlaveRequest *slave_req = mdr->slave_request;
+ // FIXME: Slave rename request can arrive after we notice mds failure.
+ // This can cause mds to crash (does not affect integrity of FS).
+ if (slave_req->get_op() == MMDSSlaveRequest::OP_RENAMEPREP &&
+ slave_req->srcdn_auth == who)
+ slave_req->mark_interrupted();
}
// failed node is slave?
#include "Beacon.h"
-#define CEPH_MDS_PROTOCOL 29 /* cluster internal */
+#define CEPH_MDS_PROTOCOL 30 /* cluster internal */
class MonClient;
req->destdnpath.push_dentry(dn->name);
if (straydn)
mdcache->replicate_stray(straydn, who, req->stray);
+
+ req->srcdn_auth = mdr->more()->srcdn_auth_mds;
// srcdn auth will verify our current witness list is sufficient
req->witnesses = witnesse;
<< " " << mdr->slave_request->srcdnpath
<< " to " << mdr->slave_request->destdnpath
<< dendl;
-
+
+ if (mdr->slave_request->is_interrupted()) {
+ dout(10) << " slave request interrupted, sending noop reply" << dendl;
+ MMDSSlaveRequest *reply= new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RENAMEPREPACK);
+ reply->mark_interrupted();
+ mds->send_message_mds(reply, mdr->slave_to_mds);
+ mdr->slave_request->put();
+ mdr->slave_request = 0;
+ return;
+ }
+
// discover destdn
filepath destpath(mdr->slave_request->destdnpath);
dout(10) << " dest " << destpath << dendl;
// witnessed? or add extra witnesses?
assert(mdr->more()->witnessed.count(from) == 0);
- if (ack->witnesses.empty()) {
+ if (ack->is_interrupted()) {
+ dout(10) << " slave request interrupted, noop" << dendl;
+ } else if (ack->witnesses.empty()) {
mdr->more()->witnessed.insert(from);
if (!ack->is_not_journaled())
mdr->more()->has_journaled_slaves = true;
static const unsigned FLAG_NOTJOURNALED = 1<<2;
static const unsigned FLAG_EROFS = 1<<3;
static const unsigned FLAG_ABORT = 1<<4;
+ static const unsigned FLAG_INTERRUPTED = 1<<5;
// for locking
__u16 lock_type; // lock object type
bufferlist inode_export;
version_t inode_export_v;
bufferlist srci_replica;
+ mds_rank_t srcdn_auth;
utime_t op_stamp;
bufferlist stray; // stray dir + dentry
bool is_error_rofs() { return (flags & FLAG_EROFS); }
bool is_abort() { return (flags & FLAG_ABORT); }
void mark_abort() { flags |= FLAG_ABORT; }
+ bool is_interrupted() { return (flags & FLAG_INTERRUPTED); }
+ void mark_interrupted() { flags |= FLAG_INTERRUPTED; }
void set_lock_type(int t) { lock_type = t; }
MMDSSlaveRequest(metareqid_t ri, __u32 att, int o) :
Message(MSG_MDS_SLAVE_REQUEST),
reqid(ri), attempt(att), op(o), flags(0), lock_type(0),
- inode_export_v(0) { }
+ inode_export_v(0), srcdn_auth(MDS_RANK_NONE) { }
private:
~MMDSSlaveRequest() override {}
::encode(op_stamp, payload);
::encode(inode_export, payload);
::encode(inode_export_v, payload);
+ ::encode(srcdn_auth, payload);
::encode(srci_replica, payload);
::encode(stray, payload);
}
::decode(op_stamp, p);
::decode(inode_export, p);
::decode(inode_export_v, p);
+ ::decode(srcdn_auth, p);
::decode(srci_replica, p);
::decode(stray, p);
}