blob: fe1952f543aa3376a4a327e8841786307c0dee46 [file]
#pragma once
#include "MctpEndpoint.hpp"
#include "NVMeIntf.hpp"
#include "NVMeSubsys.hpp"
#include <chrono>
#include <memory>
class NVMeDevice : public std::enable_shared_from_this<NVMeDevice>
{
struct Private
{};
public:
static std::shared_ptr<NVMeDevice>
create(NVMeIntf intf, const std::shared_ptr<NVMeSubsystem>& subsys)
{
return std::make_shared<NVMeDevice>(Private(), std::move(intf), subsys);
}
static std::shared_ptr<NVMeDevice>
create(boost::asio::io_context& io,
const std::shared_ptr<MctpDevice>& dev, NVMeIntf intf,
const std::shared_ptr<NVMeSubsystem>& subsys,
std::chrono::seconds gracePeriod = std::chrono::seconds(5))
{
return std::make_shared<NVMeDevice>(Private(), io, dev, std::move(intf),
subsys, gracePeriod);
}
NVMeDevice(Private /*unused*/, NVMeIntf intf,
const std::shared_ptr<NVMeSubsystem>& subsys) :
intf(std::move(intf)), subsys(subsys)
{}
NVMeDevice(Private /*unused*/, boost::asio::io_context& io,
const std::shared_ptr<MctpDevice>& dev, NVMeIntf intf,
const std::shared_ptr<NVMeSubsystem>& subsys,
std::chrono::seconds gracePeriod) :
dev(dev), intf(std::move(intf)), subsys(subsys), timer(io),
gracePeriod{gracePeriod}
{}
~NVMeDevice() = default;
void start();
void stop();
private:
void setup();
void restart();
void degraded(const std::shared_ptr<MctpEndpoint>& ep);
void available(const std::shared_ptr<MctpEndpoint>& ep);
void removed(const std::shared_ptr<MctpEndpoint>& ep);
void finalize(const std::error_code& ec,
const std::shared_ptr<MctpEndpoint>& ep);
std::shared_ptr<MctpDevice> dev;
NVMeIntf intf;
std::shared_ptr<NVMeSubsystem> subsys;
std::optional<boost::asio::steady_timer> timer;
std::optional<std::chrono::seconds> gracePeriod;
bool recovering{};
bool gracePeriodActive{};
};