return -EINVAL;
}
- if (boost::get<cls::rbd::UnknownSnapshotNamespace>(
- &snap_meta.snapshot_namespace) != nullptr) {
+ if (std::holds_alternative<cls::rbd::UnknownSnapshotNamespace>(
+ snap_meta.snapshot_namespace)) {
CLS_ERR("Unknown snapshot namespace provided");
return -EINVAL;
}
return r;
}
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
if (mirror_ns == nullptr) {
CLS_LOG(5, "mirror_image_snapshot_unlink_peer " \
// should remove the snapshot instead.
auto search_lambda = [snap_id](const cls_rbd_snap& snap_meta) {
if (snap_meta.id > snap_id &&
- boost::get<cls::rbd::MirrorSnapshotNamespace>(
- &snap_meta.snapshot_namespace) != nullptr) {
+ std::holds_alternative<cls::rbd::MirrorSnapshotNamespace>(
+ snap_meta.snapshot_namespace)) {
return -EEXIST;
}
return 0;
return r;
}
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
if (mirror_ns == nullptr) {
CLS_LOG(5, "mirror_image_snapshot_set_copy_progress " \
}
}
-class EncodeSnapshotNamespaceVisitor : public boost::static_visitor<void> {
+class EncodeSnapshotNamespaceVisitor {
public:
explicit EncodeSnapshotNamespaceVisitor(bufferlist &bl) : m_bl(bl) {
}
bufferlist &m_bl;
};
-class DecodeSnapshotNamespaceVisitor : public boost::static_visitor<void> {
+class DecodeSnapshotNamespaceVisitor {
public:
DecodeSnapshotNamespaceVisitor(bufferlist::const_iterator &iter)
: m_iter(iter) {
bufferlist::const_iterator &m_iter;
};
-class DumpSnapshotNamespaceVisitor : public boost::static_visitor<void> {
+class DumpSnapshotNamespaceVisitor {
public:
explicit DumpSnapshotNamespaceVisitor(Formatter *formatter, const std::string &key)
: m_formatter(formatter), m_key(key) {}
std::string m_key;
};
-class GetTypeVisitor : public boost::static_visitor<SnapshotNamespaceType> {
+class GetTypeVisitor {
public:
template <typename T>
inline SnapshotNamespaceType operator()(const T&) const {
SnapshotNamespaceType get_snap_namespace_type(
const SnapshotNamespace& snapshot_namespace) {
- return static_cast<SnapshotNamespaceType>(boost::apply_visitor(
- GetTypeVisitor(), snapshot_namespace));
+ return static_cast<SnapshotNamespaceType>(snapshot_namespace.visit(
+ GetTypeVisitor()));
}
void SnapshotInfo::encode(bufferlist& bl) const {
void SnapshotInfo::dump(Formatter *f) const {
f->dump_unsigned("id", id);
f->open_object_section("namespace");
- boost::apply_visitor(DumpSnapshotNamespaceVisitor(f, "type"),
- snapshot_namespace);
+ snapshot_namespace.visit(DumpSnapshotNamespaceVisitor(f, "type"));
f->close_section();
f->dump_string("name", name);
f->dump_unsigned("image_size", image_size);
void SnapshotNamespace::encode(bufferlist& bl) const {
ENCODE_START(1, 1, bl);
- boost::apply_visitor(EncodeSnapshotNamespaceVisitor(bl), *this);
+ visit(EncodeSnapshotNamespaceVisitor(bl));
ENCODE_FINISH(bl);
}
*this = UnknownSnapshotNamespace();
break;
}
- boost::apply_visitor(DecodeSnapshotNamespaceVisitor(p), *this);
+ visit(DecodeSnapshotNamespaceVisitor(p));
DECODE_FINISH(p);
}
void SnapshotNamespace::dump(Formatter *f) const {
- boost::apply_visitor(
- DumpSnapshotNamespaceVisitor(f, "snapshot_namespace_type"), *this);
+ visit(DumpSnapshotNamespaceVisitor(f, "snapshot_namespace_type"));
}
void SnapshotNamespace::generate_test_instances(std::list<SnapshotNamespace*> &o) {
"uuid", 123)));
}
+std::ostream& operator<<(std::ostream& os, const SnapshotNamespace& ns) {
+ return ns.visit([&os](const auto& val) -> std::ostream& {
+ return os << val;
+ });
+}
+
std::ostream& operator<<(std::ostream& os, const SnapshotNamespaceType& type) {
switch (type) {
case SNAPSHOT_NAMESPACE_TYPE_USER:
#ifndef CEPH_CLS_RBD_TYPES_H
#define CEPH_CLS_RBD_TYPES_H
-#include <boost/variant.hpp>
#include "include/int_types.h"
#include "include/buffer.h"
#include "include/encoding.h"
#include <iosfwd>
#include <string>
#include <set>
+#include <variant>
#define RBD_GROUP_REF "rbd_group_ref"
return true;
}
+ inline bool operator!=(const UserSnapshotNamespace& usn) const {
+ return false;
+ }
+
inline bool operator<(const UserSnapshotNamespace& usn) const {
return false;
}
group_snapshot_id == gsn.group_snapshot_id;
}
+ inline bool operator!=(const GroupSnapshotNamespace& gsn) const {
+ return !operator==(gsn);
+ }
+
inline bool operator<(const GroupSnapshotNamespace& gsn) const {
if (group_pool != gsn.group_pool) {
return group_pool < gsn.group_pool;
inline bool operator==(const TrashSnapshotNamespace& usn) const {
return true;
}
+ inline bool operator!=(const TrashSnapshotNamespace& usn) const {
+ return false;
+ }
inline bool operator<(const TrashSnapshotNamespace& usn) const {
return false;
}
snap_seqs == rhs.snap_seqs;
}
+ inline bool operator!=(const MirrorSnapshotNamespace& rhs) const {
+ return !operator==(rhs);
+ }
+
inline bool operator<(const MirrorSnapshotNamespace& rhs) const {
if (state != rhs.state) {
return state < rhs.state;
return true;
}
+ inline bool operator!=(const UnknownSnapshotNamespace& gsn) const {
+ return false;
+ }
+
inline bool operator<(const UnknownSnapshotNamespace& gsn) const {
return false;
}
std::ostream& operator<<(std::ostream& os, const MirrorSnapshotNamespace& ns);
std::ostream& operator<<(std::ostream& os, const UnknownSnapshotNamespace& ns);
-typedef boost::variant<UserSnapshotNamespace,
- GroupSnapshotNamespace,
- TrashSnapshotNamespace,
- MirrorSnapshotNamespace,
- UnknownSnapshotNamespace> SnapshotNamespaceVariant;
+typedef std::variant<UserSnapshotNamespace,
+ GroupSnapshotNamespace,
+ TrashSnapshotNamespace,
+ MirrorSnapshotNamespace,
+ UnknownSnapshotNamespace> SnapshotNamespaceVariant;
struct SnapshotNamespace : public SnapshotNamespaceVariant {
using SnapshotNamespaceVariant::SnapshotNamespaceVariant;
void decode(ceph::buffer::list::const_iterator& it);
void dump(ceph::Formatter *f) const;
- static void generate_test_instances(std::list<SnapshotNamespace*> &o);
-
- inline bool operator==(const SnapshotNamespaceVariant& sn) const {
- return static_cast<const SnapshotNamespaceVariant&>(*this) == sn;
+ template <typename F>
+ decltype(auto) visit(F&& f) const & {
+ return std::visit(std::forward<F>(f), static_cast<const SnapshotNamespaceVariant&>(*this));
}
- inline bool operator<(const SnapshotNamespaceVariant& sn) const {
- return static_cast<const SnapshotNamespaceVariant&>(*this) < sn;
- }
- inline bool operator!=(const SnapshotNamespaceVariant& sn) const {
- return !(*this == sn);
+ template <typename F>
+ decltype(auto) visit(F&& f) & {
+ return std::visit(std::forward<F>(f), static_cast<SnapshotNamespaceVariant&>(*this));
}
+ static void generate_test_instances(std::list<SnapshotNamespace*> &o);
};
WRITE_CLASS_ENCODER(SnapshotNamespace);
+std::ostream& operator<<(std::ostream& os, const SnapshotNamespace& ns);
+
SnapshotNamespaceType get_snap_namespace_type(
const SnapshotNamespace& snapshot_namespace);
deferment_end_time == rhs.deferment_end_time);
}
};
+
WRITE_CLASS_ENCODER(TrashImageSpec);
struct MirrorImageMap {
struct SnapKeyComparator {
inline bool operator()(const SnapKey& lhs, const SnapKey& rhs) const {
// only compare by namespace type and name
- if (lhs.first.which() != rhs.first.which()) {
- return lhs.first.which() < rhs.first.which();
+ if (lhs.first.index() != rhs.first.index()) {
+ return lhs.first.index() < rhs.first.index();
}
return lhs.second < rhs.second;
}
auto request_type = exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL;
// rbd-mirror needs to accept forced promotion orphan snap create requests
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&payload.snap_namespace);
if (mirror_ns != nullptr && mirror_ns->is_orphan()) {
request_type = exclusive_lock::OPERATION_REQUEST_TYPE_FORCE_PROMOTION;
for (; it != ictx->snap_ids.end(); ++it) {
if (it->first.first == in_snap_namespace) {
return it->second;
- } else if (boost::get<cls::rbd::GroupSnapshotNamespace>(&it->first.first) ==
- nullptr) {
+ } else if (!std::holds_alternative<cls::rbd::GroupSnapshotNamespace>(
+ it->first.first)) {
break;
}
}
{
std::shared_lock image_locker{img_ctx->image_lock};
for (auto &it : img_ctx->snap_info) {
- auto info = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto info = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it.second.snap_namespace);
if (info && info->mirror_peer_uuids.count(uuid)) {
snap_ids.push_back(it.first);
namespace {
-class GetGroupVisitor : public boost::static_visitor<int> {
+class GetGroupVisitor {
public:
CephContext* cct;
librados::IoCtx *image_ioctx;
}
};
-class GetTrashVisitor : public boost::static_visitor<int> {
+class GetTrashVisitor {
public:
std::string* original_name;
}
};
-class GetMirrorVisitor : public boost::static_visitor<int> {
+class GetMirrorVisitor {
public:
snap_mirror_namespace_t *mirror_snap;
}
GetGroupVisitor ggv = GetGroupVisitor(ictx->cct, &ictx->md_ctx, group_snap);
- r = boost::apply_visitor(ggv, snap_info->snap_namespace);
+ r = snap_info->snap_namespace.visit(ggv);
if (r < 0) {
return r;
}
}
auto visitor = GetTrashVisitor(original_name);
- r = boost::apply_visitor(visitor, snap_info->snap_namespace);
+ r = snap_info->snap_namespace.visit(visitor);
if (r < 0) {
return r;
}
}
auto gmv = GetMirrorVisitor(mirror_snap);
- r = boost::apply_visitor(gmv, snap_info->snap_namespace);
+ r = snap_info->snap_namespace.visit(gmv);
if (r < 0) {
return r;
}
return;
}
- if (boost::get<cls::rbd::UserSnapshotNamespace>(&snap_namespace) ==
- nullptr) {
+ if (!std::holds_alternative<cls::rbd::UserSnapshotNamespace>(snap_namespace)) {
continue;
}
if (m_snap_seqs.find(src_snap_id) == m_snap_seqs.end()) {
// the source snapshot is not in our mapping table, ...
- if (boost::get<cls::rbd::UserSnapshotNamespace>(&snap_namespace) !=
- nullptr) {
+ if (std::holds_alternative<cls::rbd::UserSnapshotNamespace>(snap_namespace)) {
// ... create it since it's a user snapshot
break;
} else if (src_snap_id == m_src_snap_id_end) {
*m_primary_mirror_uuid = "";
for (auto it = snap_info.rbegin(); it != snap_info.rend(); it++) {
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it->second.snap_namespace);
if (mirror_ns != nullptr) {
size_t count = 0;
uint64_t unlink_snap_id = 0;
for (auto &snap_it : m_image_ctx->snap_info) {
- auto info = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto info = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap_it.second.snap_namespace);
if (info == nullptr) {
continue;
snap_it != m_image_ctx->snap_info.end(); ++snap_it) {
if (snap_it->first == m_snap_id) {
r = 0;
- mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap_it->second.snap_namespace);
- } else if (boost::get<cls::rbd::MirrorSnapshotNamespace>(
- &snap_it->second.snap_namespace) != nullptr) {
+ } else if (std::holds_alternative<cls::rbd::MirrorSnapshotNamespace>(
+ snap_it->second.snap_namespace)) {
ldout(cct, 15) << "located newer mirror snapshot" << dendl;
m_newer_mirror_snapshots = true;
break;
return;
}
- auto info = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto info = std::get<cls::rbd::MirrorSnapshotNamespace>(
snap_namespace);
info.mirror_peer_uuids.erase(m_mirror_peer_uuid);
uint64_t *rollback_snap_id) {
for (; it != end; it++) {
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
- &it->second.snap_namespace);
- if (mirror_ns->state != cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY) {
+ auto mirror_ns = std::get<cls::rbd::MirrorSnapshotNamespace>(
+ it->second.snap_namespace);
+ if (mirror_ns.state != cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY) {
break;
}
- if (mirror_ns->complete) {
+ if (mirror_ns.complete) {
break;
}
}
for (auto it = image_ctx->snap_info.rbegin();
it != image_ctx->snap_info.rend(); it++) {
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it->second.snap_namespace);
if (mirror_ns == nullptr) {
continue;
for (auto it = image_ctx->snap_info.rbegin();
it != image_ctx->snap_info.rend(); it++) {
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it->second.snap_namespace);
if (mirror_ns != nullptr) {
ldout(cct, 20) << "previous mirror snapshot snap_id=" << it->first << " "
template <typename I>
Context *SnapshotCreateRequest<I>::send_create_image_state() {
I &image_ctx = this->m_image_ctx;
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&m_snap_namespace);
if (mirror_ns == nullptr || !mirror_ns->is_primary()) {
update_snap_context();
cls::rbd::SnapshotInfo snap;
ASSERT_EQ(0, snapshot_get(&ioctx, oid, 1, &snap));
- auto sn = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto sn = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
ASSERT_NE(nullptr, sn);
ASSERT_EQ(primary, *sn);
ASSERT_EQ(-ENOENT, mirror_image_snapshot_unlink_peer(&ioctx, oid, 1,
"peer1"));
ASSERT_EQ(0, snapshot_get(&ioctx, oid, 1, &snap));
- sn = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ sn = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
ASSERT_NE(nullptr, sn);
ASSERT_EQ(1U, sn->mirror_peer_uuids.size());
ASSERT_EQ(-ERESTART,
mirror_image_snapshot_unlink_peer(&ioctx, oid, 1, "peer2"));
ASSERT_EQ(0, snapshot_get(&ioctx, oid, 1, &snap));
- sn = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ sn = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
ASSERT_NE(nullptr, sn);
ASSERT_EQ(1U, sn->mirror_peer_uuids.size());
ASSERT_EQ(1U, sn->mirror_peer_uuids.count("peer2"));
ASSERT_EQ(0, snapshot_get(&ioctx, oid, 2, &snap));
- auto nsn = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto nsn = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
ASSERT_NE(nullptr, nsn);
ASSERT_EQ(non_primary, *nsn);
ASSERT_EQ(0, mirror_image_snapshot_set_copy_progress(&ioctx, oid, 2, true,
10));
ASSERT_EQ(0, snapshot_get(&ioctx, oid, 2, &snap));
- nsn = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ nsn = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap.snapshot_namespace);
ASSERT_NE(nullptr, nsn);
ASSERT_TRUE(nsn->complete);
}
if (protect) {
- EXPECT_TRUE(boost::get<cls::rbd::UserSnapshotNamespace>(&snap_ns) !=
- nullptr);
+ EXPECT_TRUE(std::holds_alternative<cls::rbd::UserSnapshotNamespace>(snap_ns));
r = image_ctx->operations->snap_protect(snap_ns, snap_name.c_str());
if (r < 0) {
return r;
auto it = mock_image_ctx.snap_info.find(snap_id);
ASSERT_NE(it, mock_image_ctx.snap_info.end());
auto info =
- boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it->second.snap_namespace);
ASSERT_NE(nullptr, info);
ASSERT_EQ(is_linked, info->mirror_peer_uuids.erase(
auto it = mock_image_ctx.snap_info.find(snap_id);
EXPECT_NE(it, mock_image_ctx.snap_info.end());
auto info =
- boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&it->second.snap_namespace);
EXPECT_NE(nullptr, info);
EXPECT_NE(0, info->mirror_peer_uuids.erase(
return r;
}
- auto ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap_info.snapshot_namespace);
if (ns != nullptr) {
*mirror_snap_id = snap_id;
auto snap_id = snap_it->first;
const auto& snap_info = snap_it->second;
- auto user_ns = boost::get<cls::rbd::UserSnapshotNamespace>(
+ auto user_ns = std::get_if<cls::rbd::UserSnapshotNamespace>(
&snap_info.snap_namespace);
if (user_ns == nullptr) {
dout(20) << "snapshot " << snap_id << " is not a user snapshot" << dendl;
auto snap_id = snap_it->first;
const auto& snap_info = snap_it->second;
- auto user_ns = boost::get<cls::rbd::UserSnapshotNamespace>(
+ auto user_ns = std::get_if<cls::rbd::UserSnapshotNamespace>(
&snap_info.snap_namespace);
if (user_ns == nullptr) {
dout(20) << "snapshot " << snap_id << " is not a user snapshot" << dendl;
auto snap_id = snap_it->first;
const auto& snap_info = snap_it->second;
- auto user_ns = boost::get<cls::rbd::UserSnapshotNamespace>(
+ auto user_ns = std::get_if<cls::rbd::UserSnapshotNamespace>(
&snap_info.snap_namespace);
if (user_ns == nullptr) {
dout(20) << "snapshot " << snap_id << " is not a user snapshot" << dendl;
auto snap_id = snap_it->first;
const auto& snap_info = snap_it->second;
- auto user_ns = boost::get<cls::rbd::UserSnapshotNamespace>(
+ auto user_ns = std::get_if<cls::rbd::UserSnapshotNamespace>(
&snap_info.snap_namespace);
if (user_ns == nullptr) {
dout(20) << "snapshot " << snap_id << " is not a user snapshot" << dendl;
for (auto snap_it = m_remote_image_ctx->snap_info.begin();
snap_it != m_remote_image_ctx->snap_info.end(); ++snap_it) {
auto snap_id = snap_it->first;
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap_it->second.snap_namespace);
if (mirror_ns == nullptr || !mirror_ns->is_non_primary()) {
continue;
for (auto snap_info_it = image_ctx->snap_info.rbegin();
snap_info_it != image_ctx->snap_info.rend(); ++snap_info_it) {
const auto& snap_ns = snap_info_it->second.snap_namespace;
- auto mirror_ns = boost::get<
+ auto mirror_ns = std::get_if<
cls::rbd::MirrorSnapshotNamespace>(&snap_ns);
if (mirror_ns == nullptr || !mirror_ns->complete) {
continue;
for (auto snap_info_it = local_image_ctx->snap_info.begin();
snap_info_it != local_image_ctx->snap_info.end(); ++snap_info_it) {
const auto& snap_ns = snap_info_it->second.snap_namespace;
- auto mirror_ns = boost::get<
+ auto mirror_ns = std::get_if<
cls::rbd::MirrorSnapshotNamespace>(&snap_ns);
if (mirror_ns == nullptr) {
continue;
for (auto snap_info_it = remote_image_ctx->snap_info.begin();
snap_info_it != remote_image_ctx->snap_info.end(); ++snap_info_it) {
const auto& snap_ns = snap_info_it->second.snap_namespace;
- auto mirror_ns = boost::get<
+ auto mirror_ns = std::get_if<
cls::rbd::MirrorSnapshotNamespace>(&snap_ns);
if (mirror_ns == nullptr) {
continue;
snap_namespace = snap_info->snap_namespace;
snap_name = snap_info->name;
- ceph_assert(boost::get<cls::rbd::MirrorSnapshotNamespace>(
- &snap_namespace) != nullptr);
+ ceph_assert(std::holds_alternative<cls::rbd::MirrorSnapshotNamespace>(
+ snap_namespace));
}
}
return;
}
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&local_snap_info_it->second.snap_namespace);
ceph_assert(mirror_ns != nullptr);
// we can ignore all non-user snapshots since image state only includes
// user snapshots
- if (boost::get<cls::rbd::UserSnapshotNamespace>(
- &remote_snap_info.snap_namespace) == nullptr) {
+ if (!std::holds_alternative<cls::rbd::UserSnapshotNamespace>(
+ remote_snap_info.snap_namespace)) {
continue;
}
// come at or after the snapshot we are searching against
for (auto snap_it = local_snap_infos.lower_bound(local_snap_id);
snap_it != local_snap_infos.end(); ++snap_it) {
- auto mirror_ns = boost::get<cls::rbd::MirrorSnapshotNamespace>(
+ auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
&snap_it->second.snap_namespace);
if (mirror_ns == nullptr || !mirror_ns->is_non_primary()) {
continue;