mds: test connections to bootstrapping MDS

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
This commit is contained in:
Patrick Donnelly 2021-11-08 14:55:05 -05:00
parent 8dc54deed9
commit 402919cbe6
No known key found for this signature in database
GPG Key ID: BE69BB7D36E459B4
4 changed files with 48 additions and 2 deletions

View File

@ -0,0 +1,5 @@
overrides:
ceph:
conf:
mds:
mds_sleep_rank_change: 5000000.0

View File

@ -441,6 +441,16 @@ class TestFailover(CephFSTestCase):
self.assertEqual(mds_0['gid'], self.fs.get_rank(rank=0)['gid'])
self.fs.rank_freeze(False, rank=0)
def test_connect_bootstrapping(self):
self.config_set("mds", "mds_sleep_rank_change", 10000000.0)
self.config_set("mds", "mds_connect_bootstrapping", True)
self.fs.set_max_mds(2)
self.fs.wait_for_daemons()
self.fs.rank_fail(rank=0)
# rank 0 will get stuck in up:resolve, see https://tracker.ceph.com/issues/53194
self.fs.wait_for_daemons()
class TestStandbyReplay(CephFSTestCase):
CLIENTS_REQUIRED = 0
MDSS_REQUIRED = 4

View File

@ -1409,3 +1409,15 @@ options:
- mds
flags:
- runtime
- name: mds_sleep_rank_change
type: float
level: dev
default: 0.0
flags:
- runtime
- name: mds_connect_bootstrapping
type: bool
level: dev
default: false
flags:
- runtime

View File

@ -2247,9 +2247,16 @@ void MDSRankDispatcher::handle_mds_map(
if (oldstate != state) {
// update messenger.
if (state == MDSMap::STATE_STANDBY_REPLAY) {
auto sleep_rank_change = g_conf().get_val<double>("mds_sleep_rank_change");
if (unlikely(sleep_rank_change > 0)) {
// This is to trigger a race where another rank tries to connect to this
// MDS before an update to the messenger "myname" is processed. This race
// should be closed by ranks holding messages until the rank is out of a
// "bootstrapping" state.
usleep(sleep_rank_change);
} if (state == MDSMap::STATE_STANDBY_REPLAY) {
dout(1) << "handle_mds_map i am now mds." << mds_gid << "." << incarnation
<< " replaying mds." << whoami << "." << incarnation << dendl;
<< " replaying mds." << whoami << "." << incarnation << dendl;
messenger->set_myname(entity_name_t::MDS(mds_gid));
} else {
dout(1) << "handle_mds_map i am now mds." << whoami << "." << incarnation << dendl;
@ -2437,6 +2444,18 @@ void MDSRankDispatcher::handle_mds_map(
}
}
// for testing...
if (unlikely(g_conf().get_val<bool>("mds_connect_bootstrapping"))) {
std::set<mds_rank_t> bootstrapping;
mdsmap->get_mds_set(bootstrapping, MDSMap::STATE_REPLAY);
mdsmap->get_mds_set(bootstrapping, MDSMap::STATE_CREATING);
mdsmap->get_mds_set(bootstrapping, MDSMap::STATE_STARTING);
for (const auto& rank : bootstrapping) {
auto m = make_message<MMDSMap>(monc->get_fsid(), *mdsmap);
send_message_mds(std::move(m), rank);
}
}
// did someone go active?
if (state >= MDSMap::STATE_CLIENTREPLAY &&
oldstate >= MDSMap::STATE_CLIENTREPLAY) {