Program Listing for File DomainManager.cpp

Return to documentation for file (BackendLibfabric/DomainManager.cpp)

#include "DomainManager.hpp"

#include <tracy/Tracy.hpp>

#include <rdma/fabric.h>
#include <rdma/fi_domain.h>

#include "Issues.hpp"
#include "Helpers.hpp"

netio3::libfabric::DomainManager::DomainManager(const NetworkConfig& config,
                                                const EndPointAddress& address,
                                                std::uint64_t flags) :
  m_info(create_info(config.mode, address, flags)),
  m_fabric(create_fabric()),
  m_domain(create_domain())
{}

netio3::libfabric::FiInfoUniquePtr netio3::libfabric::DomainManager::create_info(
  NetworkMode mode,
  const EndPointAddress& address,
  std::uint64_t flags)
{
  ZoneScoped;
  try {
    return FiInfoUniquePtr{get_fi_info(address, mode, flags)};
  } catch (const LibfabricFiInfoError& e) {
    throw LibfabricDomainError(std::format("Failed to get info on local interface {}", e.what()));
  }
}

std::uint64_t netio3::libfabric::DomainManager::get_next_mr_key()
{
  ZoneScoped;
  if (std::strcmp(m_info->fabric_attr->prov_name, "sockets") == 0) {
    return m_mr_key++;
  }
  return 0;
}

netio3::libfabric::FiCloseUniquePtr<fid_fabric> netio3::libfabric::DomainManager::create_fabric()
{
  ZoneScoped;
  fid_fabric* fabric{nullptr};
  if (auto ret = fi_fabric(m_info->fabric_attr, &fabric, nullptr)) {
    throw LibfabricDomainError(ERS_HERE,
                               std::format("Failed to open fabric - {}", fi_strerror(-ret)));
  }
  return FiCloseUniquePtr<fid_fabric>(
    fabric, FiCloseDeleter<fid_fabric>("Failed to close Fabric"));
}

netio3::libfabric::FiCloseUniquePtr<fid_domain> netio3::libfabric::DomainManager::create_domain() const
{
  ZoneScoped;
  fid_domain* domain = nullptr;
  if (auto ret = fi_domain(m_fabric.get(), m_info.get(), &domain, nullptr)) {
    throw LibfabricDomainError(
      ERS_HERE, std::format("Cannot open send domain {} - {}", ret, fi_strerror(-ret)));
  }
  return FiCloseUniquePtr<fid_domain>(domain, FiCloseDeleter<fid_domain>("Failed to close Domain"));
}