#include "mon/NVMeofGwMap.h"
class MNVMeofGwMap final : public Message {
+private:
+ static constexpr int VERSION = 1;
+
protected:
std::map<NvmeGroupKey, NvmeGwMap> map;
epoch_t gwmap_epoch;
void decode_payload() override {
auto p = payload.cbegin();
+ int version;
+ decode(version, p);
+ ceph_assert(version == VERSION);
decode(gwmap_epoch, p);
decode(map, p);
}
void encode_payload(uint64_t features) override {
using ceph::encode;
+ encode(VERSION, payload);
encode(gwmap_epoch, payload);
encode(map, payload);
}
Dispatcher(g_ceph_context),
osdmap_epoch(0),
gwmap_epoch(0),
+ last_map_time(std::chrono::steady_clock::now()),
monc{g_ceph_context, poolctx},
client_messenger(Messenger::create(g_ceph_context, "async", entity_name_t::CLIENT(-1), "client", getpid())),
objecter{g_ceph_context, client_messenger.get(), &monc, poolctx},
monc.send_mon_message(std::move(m));
}
+void NVMeofGwMonitorClient::disconnect_panic()
+{
+ auto disconnect_panic_duration = g_conf().get_val<std::chrono::seconds>("mon_nvmeofgw_beacon_grace").count();
+ auto now = std::chrono::steady_clock::now();
+ auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(now - last_map_time).count();
+ if (elapsed_seconds > disconnect_panic_duration) {
+ dout(4) << "Triggering a panic upon disconnection from the monitor, elapsed " << elapsed_seconds << ", configured disconnect panic duration " << disconnect_panic_duration << dendl;
+ throw std::runtime_error("Lost connection to the monitor (mon).");
+ }
+}
+
void NVMeofGwMonitorClient::tick()
{
dout(0) << dendl;
+
+ disconnect_panic();
send_beacon();
timer.add_event_after(
void NVMeofGwMonitorClient::handle_nvmeof_gw_map(ceph::ref_t<MNVMeofGwMap> nmap)
{
+ last_map_time = std::chrono::steady_clock::now(); // record time of last monitor message
+
auto &new_map = nmap->get_map();
gwmap_epoch = nmap->get_gwmap_epoch();
auto group_key = std::make_pair(pool, group);
std::string server_cert;
std::string client_cert;
epoch_t osdmap_epoch; // last awaited osdmap_epoch
- epoch_t gwmap_epoch; // last received gw map epoch
+ epoch_t gwmap_epoch; // last received gw map epoch
+ std::chrono::time_point<std::chrono::steady_clock>
+ last_map_time; // used to panic on disconnect
protected:
ceph::async::io_context_pool poolctx;
void shutdown();
int main(std::vector<const char *> args);
void tick();
+ void disconnect_panic();
void handle_nvmeof_gw_map(ceph::ref_t<MNVMeofGwMap> m);
};