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 void OSDMapGate::OSDMapBlocker::dump_detail(Formatter
*f
) const
19 f
->open_object_section("OSDMapGate");
20 f
->dump_int("epoch", epoch
);
24 blocking_future
<epoch_t
> OSDMapGate::wait_for_map(epoch_t epoch
)
26 if (__builtin_expect(stopping
, false)) {
27 return make_exception_blocking_future
<epoch_t
>(
28 crimson::common::system_shutdown_exception());
30 if (current
>= epoch
) {
31 return make_ready_blocking_future
<epoch_t
>(current
);
33 logger().info("evt epoch is {}, i have {}, will wait", epoch
, current
);
34 auto &blocker
= waiting_peering
.emplace(
35 epoch
, make_pair(blocker_type
, epoch
)).first
->second
;
36 auto fut
= blocker
.promise
.get_shared_future();
38 return blocker
.make_blocking_future(
39 (*shard_services
).get().osdmap_subscribe(current
, true).then(
40 [fut
=std::move(fut
)]() mutable {
41 return std::move(fut
);
44 return blocker
.make_blocking_future(std::move(fut
));
49 void OSDMapGate::got_map(epoch_t epoch
) {
51 auto first
= waiting_peering
.begin();
52 auto last
= waiting_peering
.upper_bound(epoch
);
53 std::for_each(first
, last
, [epoch
](auto& blocked_requests
) {
54 blocked_requests
.second
.promise
.set_value(epoch
);
56 waiting_peering
.erase(first
, last
);
59 seastar::future
<> OSDMapGate::stop() {
60 logger().info("osdmap::stop");
62 auto first
= waiting_peering
.begin();
63 auto last
= waiting_peering
.end();
64 std::for_each(first
, last
, [](auto& blocked_requests
) {
65 blocked_requests
.second
.promise
.set_exception(
66 crimson::common::system_shutdown_exception());
68 return seastar::now();