Skip to content

Commit 94163ec

Browse files
authored
Merge pull request ceph#58136 from xxhdx1985126/wip-66372
crimson/osd/osd: mark down connections to downed osds Reviewed-by: Matan Breizman <[email protected]> Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 4090019 + b480ac9 commit 94163ec

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

src/crimson/net/Messenger.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class Messenger {
5757

5858
virtual void set_auth_server(crimson::auth::AuthServer *) = 0;
5959

60+
virtual seastar::future<> mark_down(const entity_addr_t &addr) = 0;
61+
6062
using bind_ertr = crimson::errorator<
6163
crimson::ct_error::address_in_use, // The address (range) is already bound
6264
crimson::ct_error::address_not_available

src/crimson/net/SocketMessenger.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@ class SocketMessenger final : public Messenger {
152152
Interceptor *interceptor = nullptr;
153153
#endif
154154

155+
seastar::future<> mark_down(const entity_addr_t& a) final {
156+
auto conn = lookup_conn(a);
157+
if (conn) {
158+
return seastar::smp::submit_to(
159+
conn->get_shard_id(),
160+
[conn=conn.get()] {
161+
conn->mark_down();
162+
return seastar::now();
163+
}).then([conn] { return seastar::now(); });
164+
}
165+
return seastar::now();
166+
}
155167
private:
156168
seastar::future<> accept(SocketFRef &&, const entity_addr_t &);
157169

src/crimson/osd/osd.cc

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,14 +1122,33 @@ seastar::future<> OSD::committed_osd_maps(
11221122
ceph_assert(seastar::this_shard_id() == PRIMARY_CORE);
11231123
INFO("osd.{} ({}, {})", whoami, first, last);
11241124
// advance through the new maps
1125+
auto old_map = osdmap;
11251126
return seastar::do_for_each(boost::make_counting_iterator(first),
11261127
boost::make_counting_iterator(last + 1),
1127-
[this](epoch_t cur) {
1128+
[this, old_map, FNAME](epoch_t cur) {
11281129
return pg_shard_manager.get_local_map(
11291130
cur
1130-
).then([this](OSDMapService::local_cached_map_t&& o) {
1131+
).then([this, old_map, FNAME](OSDMapService::local_cached_map_t&& o) {
11311132
osdmap = make_local_shared_foreign(OSDMapService::local_cached_map_t(o));
1132-
return pg_shard_manager.update_map(std::move(o));
1133+
std::set<int> old_osds;
1134+
old_map->get_all_osds(old_osds);
1135+
return seastar::parallel_for_each(
1136+
old_osds,
1137+
[this, FNAME, old_map](auto &osd_id) {
1138+
DEBUG("osd.{}: whoami ? {}, old up ? {} , now down ? {}",
1139+
osd_id, osd_id != whoami,
1140+
old_map->is_up(osd_id), osdmap->is_down(osd_id));
1141+
if (osd_id != whoami &&
1142+
old_map->is_up(osd_id) &&
1143+
osdmap->is_down(osd_id)) {
1144+
DEBUG("osd.{}: mark osd.{} down", whoami, osd_id);
1145+
return cluster_msgr->mark_down(
1146+
osdmap->get_cluster_addrs(osd_id).front());
1147+
}
1148+
return seastar::now();
1149+
}).then([this, o=std::move(o)]() mutable {
1150+
return pg_shard_manager.update_map(std::move(o));
1151+
});
11331152
}).then([this] {
11341153
if (get_shard_services().get_up_epoch() == 0 &&
11351154
osdmap->is_up(whoami) &&
@@ -1170,7 +1189,9 @@ seastar::future<> OSD::committed_osd_maps(
11701189
return seastar::now();
11711190
}
11721191
}
1173-
return fut.then([FNAME, this] {
1192+
return fut.then([this] {
1193+
return update_heartbeat_peers();
1194+
}).then([FNAME, this] {
11741195
return check_osdmap_features().then([FNAME, this] {
11751196
// yay!
11761197
INFO("osd.{}: committed_osd_maps: broadcasting osdmaps up"

0 commit comments

Comments
 (0)