for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
it != lock->get_parent()->replicas_end();
++it) {
- if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
+ if (mds->is_cluster_degraded() &&
+ mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
continue;
MLock *m = new MLock(lock, msg, mds->get_nodeid());
mds->send_message_mds(m, it->first);
for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
it != lock->get_parent()->replicas_end();
++it) {
- if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
+ if (mds->is_cluster_degraded() &&
+ mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
continue;
MLock *m = new MLock(lock, msg, mds->get_nodeid());
m->set_data(data);
dout(10) << "requesting remote auth_pins from mds." << p->first << dendl;
// wait for active auth
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(p->first)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(p->first)) {
dout(10) << " mds." << p->first << " is not active" << dendl;
if (mdr->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(p->first, new C_MDS_RetryRequest(mdcache, mdr));
}
for (set<mds_rank_t>::iterator p = slaves.begin(); p != slaves.end(); ++p) {
- if (mds->mdsmap->get_state(*p) >= MDSMap::STATE_REJOIN) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->get_state(*p) >= MDSMap::STATE_REJOIN) {
dout(10) << "_drop_non_rdlocks dropping remote locks on mds." << *p << dendl;
MMDSSlaveRequest *slavereq = new MMDSSlaveRequest(mut->reqid, mut->attempt,
MMDSSlaveRequest::OP_DROPLOCKS);
return;
}
- if (mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
switch (lock->get_state()) {
case LOCK_SYNC_LOCK:
mds->send_message_mds(new MLock(lock, LOCK_AC_LOCKACK, mds->get_nodeid()),
} else {
// request rdlock state change from auth
mds_rank_t auth = lock->get_parent()->authority().first;
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
dout(10) << "requesting rdlock from auth on "
<< *lock << " on " << *lock->get_parent() << dendl;
mds->send_message_mds(new MLock(lock, LOCK_AC_REQRDLOCK, mds->get_nodeid()), auth);
// replica.
// auth should be auth_pinned (see acquire_locks wrlock weird mustpin case).
mds_rank_t auth = lock->get_parent()->authority().first;
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
dout(10) << "requesting scatter from auth on "
<< *lock << " on " << *lock->get_parent() << dendl;
mds->send_message_mds(new MLock(lock, LOCK_AC_REQSCATTER, mds->get_nodeid()), auth);
dout(7) << "remote_wrlock_start mds." << target << " on " << *lock << " on " << *lock->get_parent() << dendl;
// wait for active target
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(target)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(target)) {
dout(7) << " mds." << target << " is not active" << dendl;
if (mut->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(target, new C_MDS_RetryRequest(mdcache, mut));
dout(7) << "remote_wrlock_finish releasing remote wrlock on mds." << target
<< " " << *lock->get_parent() << dendl;
- if (mds->mdsmap->get_state(target) >= MDSMap::STATE_REJOIN) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->get_state(target) >= MDSMap::STATE_REJOIN) {
MMDSSlaveRequest *slavereq = new MMDSSlaveRequest(mut->reqid, mut->attempt,
MMDSSlaveRequest::OP_UNWRLOCK);
slavereq->set_lock_type(lock->get_type());
// wait for active auth
mds_rank_t auth = lock->get_parent()->authority().first;
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(auth)) {
dout(7) << " mds." << auth << " is not active" << dendl;
if (mut->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(auth, new C_MDS_RetryRequest(mdcache, mut));
// tell auth
dout(7) << "xlock_finish releasing remote xlock on " << *lock->get_parent() << dendl;
mds_rank_t auth = lock->get_parent()->authority().first;
- if (mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
MMDSSlaveRequest *slavereq = new MMDSSlaveRequest(mut->reqid, mut->attempt,
MMDSSlaveRequest::OP_UNXLOCK);
slavereq->set_lock_type(lock->get_type());
}
mds_rank_t auth = in->authority().first;
- if (mds->mdsmap->get_state(auth) == MDSMap::STATE_REJOIN) {
+ if (mds->is_cluster_degraded() &&
+ mds->mdsmap->get_state(auth) == MDSMap::STATE_REJOIN) {
mds->wait_for_active_peer(auth, new C_MDL_RequestInodeFileCaps(this, in));
return;
}
in->replica_caps_wanted = wanted;
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(auth))
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(auth))
mds->send_message_mds(new MInodeFileCaps(in->ino(), in->replica_caps_wanted),
auth);
}
<< *lock << " on " << *p << dendl;
// request unscatter?
mds_rank_t auth = lock->get_parent()->authority().first;
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(auth))
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(auth))
mds->send_message_mds(new MLock(lock, LOCK_AC_NUDGE, mds->get_nodeid()), auth);
// wait...
{
utime_t now = ceph_clock_now();
- if (mds->mdsmap->is_degraded()) {
+ if (mds->is_cluster_degraded()) {
dout(10) << "send_heartbeat degraded" << dendl;
return;
}
return;
}
- if (mds->mdsmap->is_degraded()) {
+ if (mds->is_cluster_degraded()) {
dout(10) << " degraded, ignoring" << dendl;
goto out;
}
for (map<mds_rank_t, MCacheExpire*>::iterator it = expiremap.begin();
it != expiremap.end();
++it) {
- if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN ||
- (mds->mdsmap->get_state(it->first) == MDSMap::STATE_REJOIN &&
- rejoin_sent.count(it->first) == 0)) {
+ if (mds->is_cluster_degraded() &&
+ (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN ||
+ (mds->mdsmap->get_state(it->first) == MDSMap::STATE_REJOIN &&
+ rejoin_sent.count(it->first) == 0))) {
it->second->put();
continue;
}
mds_rank_t auth = diri->authority().first;
- if (mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->get_state(auth) >= MDSMap::STATE_REJOIN) {
discover_dir_frag(diri, approxfg, fin);
} else {
// mds is down or recovering. forge a replica!
dout(7) << "can_fragment: read-only FS, no fragmenting for now" << dendl;
return false;
}
- if (mds->mdsmap->is_degraded()) {
+ if (mds->is_cluster_degraded()) {
dout(7) << "can_fragment: cluster degraded, no fragmenting for now" << dendl;
return false;
}
g_conf->osd_num_op_tracker_shard),
last_state(MDSMap::STATE_BOOT),
state(MDSMap::STATE_BOOT),
- stopping(false),
+ cluster_degraded(false), stopping(false),
purge_queue(g_ceph_context, whoami_,
mdsmap_->get_metadata_pool(), objecter,
new FunctionContext(
}
}
- if (oldmap->is_degraded() && !mdsmap->is_degraded() && state >= MDSMap::STATE_ACTIVE)
+ cluster_degraded = mdsmap->is_degraded();
+ if (oldmap->is_degraded() && !cluster_degraded && state >= MDSMap::STATE_ACTIVE) {
dout(1) << "cluster recovered." << dendl;
+ }
// did someone go active?
if (oldstate >= MDSMap::STATE_CLIENTREPLAY &&
// The state assigned to me by the MDSMap
MDSMap::DaemonState state;
+ bool cluster_degraded;
+
MDSMap::DaemonState get_state() const { return state; }
MDSMap::DaemonState get_want_state() const { return beacon.get_want_state(); }
bool is_stopping() const { return state == MDSMap::STATE_STOPPING; }
bool is_any_replay() const { return (is_replay() || is_standby_replay()); }
bool is_stopped() const { return mdsmap->is_stopped(whoami); }
+ bool is_cluster_degraded() const { return cluster_degraded; }
void handle_write_error(int err);
it->second.state = EXPORT_CANCELLED;
dir->unfreeze_tree(); // cancel the freeze
dir->auth_unpin(this);
- if (notify_peer && mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer)) // tell them.
+ if (notify_peer &&
+ (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer))) // tell them.
mds->send_message_mds(new MExportDirCancel(dir->dirfrag(), it->second.tid), it->second.peer);
break;
dout(10) << "export state=freezing : canceling freeze" << dendl;
it->second.state = EXPORT_CANCELLED;
dir->unfreeze_tree(); // cancel the freeze
- if (notify_peer && mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer)) // tell them.
+ if (notify_peer &&
+ (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer))) // tell them.
mds->send_message_mds(new MExportDirCancel(dir->dirfrag(), it->second.tid), it->second.peer);
break;
dir->unfreeze_tree();
cache->adjust_subtree_auth(dir, mds->get_nodeid());
cache->try_subtree_merge(dir);
- if (notify_peer && mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer)) // tell them.
+ if (notify_peer &&
+ (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer))) // tell them.
mds->send_message_mds(new MExportDirCancel(dir->dirfrag(), it->second.tid), it->second.peer);
break;
dout(7) << "read-only FS, no exports for now" << dendl;
return;
}
- if (mds->mdsmap->is_degraded()) {
+ if (mds->is_cluster_degraded()) {
dout(7) << "cluster degraded, no exports for now" << dendl;
return;
}
p != dir->replicas_end();
++p) {
if (p->first == it->second.peer) continue;
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(p->first))
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(p->first))
continue; // only if active
it->second.warning_ack_waiting.insert(p->first);
it->second.notify_ack_waiting.insert(p->first); // we'll eventually get a notifyack, too!
export_finish(dir); // skip notify/notify_ack stage.
} else {
// notify peer to send cap import messages to clients
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(stat.peer)) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(stat.peer)) {
mds->send_message_mds(new MExportDirFinish(dir->dirfrag(), false, stat.tid), stat.peer);
} else {
dout(7) << "not sending MExportDirFinish, dest has failed" << dendl;
}
// send finish/commit to new auth
- if (mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer)) {
+ if (!mds->is_cluster_degraded() ||
+ mds->mdsmap->is_clientreplay_or_active_or_stopping(it->second.peer)) {
mds->send_message_mds(new MExportDirFinish(dir->dirfrag(), true, it->second.tid), it->second.peer);
} else {
dout(7) << "not sending MExportDirFinish last, dest has failed" << dendl;
import_state_t& stat = import_state[dir->dirfrag()];
for (set<mds_rank_t>::iterator p = stat.bystanders.begin();
p != stat.bystanders.end(); ) {
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(*p)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(*p)) {
// this can happen if both exporter and bystander fail in the same mdsmap epoch
stat.bystanders.erase(p++);
continue;
// 1. send LinkPrepare to dest (journal nlink++ prepare)
mds_rank_t linkauth = targeti->authority().first;
if (mdr->more()->witnessed.count(linkauth) == 0) {
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(linkauth)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(linkauth)) {
dout(10) << " targeti auth mds." << linkauth << " is not active" << dendl;
if (mdr->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(linkauth, new C_MDS_RetryRequest(mdcache, mdr));
bool Server::_rmdir_prepare_witness(MDRequestRef& mdr, mds_rank_t who, vector<CDentry*>& trace, CDentry *straydn)
{
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
dout(10) << "_rmdir_prepare_witness mds." << who << " is not active" << dendl;
if (mdr->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(who, new C_MDS_RetryRequest(mdcache, mdr));
bool Server::_rename_prepare_witness(MDRequestRef& mdr, mds_rank_t who, set<mds_rank_t> &witnesse,
vector<CDentry*>& srctrace, vector<CDentry*>& dsttrace, CDentry *straydn)
{
- if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
+ if (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
dout(10) << "_rename_prepare_witness mds." << who << " is not active" << dendl;
if (mdr->more()->waiting_on_slave.empty())
mds->wait_for_active_peer(who, new C_MDS_RetryRequest(mdcache, mdr));
// make sure bystanders have received all lock related messages
for (set<mds_rank_t>::iterator p = srcdnrep.begin(); p != srcdnrep.end(); ++p) {
if (*p == mdr->slave_to_mds ||
- !mds->mdsmap->is_clientreplay_or_active_or_stopping(*p))
+ (mds->is_cluster_degraded() &&
+ !mds->mdsmap->is_clientreplay_or_active_or_stopping(*p)))
continue;
MMDSSlaveRequest *notify = new MMDSSlaveRequest(mdr->reqid, mdr->attempt,
MMDSSlaveRequest::OP_RENAMENOTIFY);