1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "crimson/common/exception.h"
5 #include "crimson/osd/osdmap_gate.h"
6 #include "crimson/osd/shard_services.h"
7 #include "common/Formatter.h"
10 seastar::logger
& logger() {
11 return crimson::get_logger(ceph_subsys_osd
);
15 namespace crimson::osd
{
17 template <OSDMapGateType OSDMapGateTypeV
>
18 void OSDMapGate
<OSDMapGateTypeV
>::OSDMapBlocker::dump_detail(Formatter
*f
) const
20 f
->open_object_section("OSDMapGate");
21 f
->dump_int("epoch", epoch
);
25 template <OSDMapGateType OSDMapGateTypeV
>
26 seastar::future
<epoch_t
> OSDMapGate
<OSDMapGateTypeV
>::wait_for_map(
27 typename
OSDMapBlocker::BlockingEvent::TriggerI
&& trigger
,
29 ShardServices
*shard_services
)
31 if (__builtin_expect(stopping
, false)) {
32 return seastar::make_exception_future
<epoch_t
>(
33 crimson::common::system_shutdown_exception());
35 if (current
>= epoch
) {
36 return seastar::make_ready_future
<epoch_t
>(current
);
38 logger().info("evt epoch is {}, i have {}, will wait", epoch
, current
);
39 auto &blocker
= waiting_peering
.emplace(
40 epoch
, std::make_pair(blocker_type
, epoch
)).first
->second
;
41 auto fut
= blocker
.promise
.get_shared_future();
43 return trigger
.maybe_record_blocking(
44 shard_services
->osdmap_subscribe(current
, true).then(
45 [fut
=std::move(fut
)]() mutable {
46 return std::move(fut
);
50 return trigger
.maybe_record_blocking(std::move(fut
), blocker
);
55 template <OSDMapGateType OSDMapGateTypeV
>
56 void OSDMapGate
<OSDMapGateTypeV
>::got_map(epoch_t epoch
) {
58 auto first
= waiting_peering
.begin();
59 auto last
= waiting_peering
.upper_bound(epoch
);
60 std::for_each(first
, last
, [epoch
](auto& blocked_requests
) {
61 blocked_requests
.second
.promise
.set_value(epoch
);
63 waiting_peering
.erase(first
, last
);
66 template <OSDMapGateType OSDMapGateTypeV
>
67 seastar::future
<> OSDMapGate
<OSDMapGateTypeV
>::stop() {
68 logger().info("osdmap::stop");
70 auto first
= waiting_peering
.begin();
71 auto last
= waiting_peering
.end();
72 std::for_each(first
, last
, [](auto& blocked_requests
) {
73 blocked_requests
.second
.promise
.set_exception(
74 crimson::common::system_shutdown_exception());
76 return seastar::now();
79 template class OSDMapGate
<OSDMapGateType::PG
>;
80 template class OSDMapGate
<OSDMapGateType::OSD
>;
82 } // namespace crimson::osd