void GroupUnlinkPeerRequest<I>::unlink_peer() {
ldout(m_cct, 10) << "rbd_mirroring_max_mirroring_snapshots = " << m_max_snaps << dendl;
- uint64_t count = 0;
- auto unlink_snap = m_group_snaps.end();
// First pass : cleanup snaps that have no peer_uuids or are incomplete
for (auto peer: *m_mirror_peer_uuids){
for (auto it = m_group_snaps.begin(); it != m_group_snaps.end(); it++) {
(ns->mirror_peer_uuids.count(peer) != 0 &&
ns->is_primary() &&
it->state == cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE)){
- unlink_snap = it;
- process_snapshot(*unlink_snap, peer);
+ process_snapshot(*it, peer);
return;
}
}
}
for (auto peer: *m_mirror_peer_uuids){
+ uint64_t count = 0;
+ auto unlink_snap = m_group_snaps.end();
for (auto it = m_group_snaps.begin(); it != m_group_snaps.end(); it++) {
auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
&it->snapshot_namespace);
std::string mirror_peer_uuid) {
ldout(m_cct, 10) << "snap id: " << group_snap.id << dendl;
bool found = false;
- bool has_newer_mirror_snap = false;
+ m_has_newer_mirror_snap = false;
for (auto it = m_group_snaps.begin(); it != m_group_snaps.end(); it++) {
if (it->id == group_snap.id) {
found = true;
} else if (found) {
auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
- &it->snapshot_namespace);
+ &it->snapshot_namespace);
if (ns != nullptr) {
- has_newer_mirror_snap = true;
- break;
+ m_has_newer_mirror_snap = true;
+ break;
}
}
}
if (!found) {
ldout(m_cct, 15) << "missing snapshot: snap_id=" << group_snap.id << dendl;
finish(-ENOENT);
- return;
+ return;
}
- if (has_newer_mirror_snap) {
- remove_group_snapshot(group_snap);
+ const auto& ns = std::get<cls::rbd::GroupSnapshotNamespaceMirror>(
+ group_snap.snapshot_namespace);
+ if (ns.mirror_peer_uuids.empty()) {
+ remove_group_snapshot(group_snap);
} else {
remove_peer_uuid(group_snap, mirror_peer_uuid);
}
std::string mirror_peer_uuid) {
ldout(m_cct, 10) << dendl;
- auto aio_comp = create_rados_callback<
- GroupUnlinkPeerRequest<I>,
- &GroupUnlinkPeerRequest<I>::handle_remove_peer_uuid>(this);
+ auto aio_comp = create_rados_callback(
+ new LambdaContext([this, group_snap](int r) {
+ handle_remove_peer_uuid(r, group_snap);
+ }));
auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
&group_snap.snapshot_namespace);
}
template <typename I>
-void GroupUnlinkPeerRequest<I>::handle_remove_peer_uuid(int r) {
+void GroupUnlinkPeerRequest<I>::handle_remove_peer_uuid(
+ int r, cls::rbd::GroupSnapshot group_snap) {
ldout(m_cct, 10) << "r=" << r << dendl;
if (r < 0) {
finish(r);
return;
}
- list_group_snaps();
+
+ if (m_has_newer_mirror_snap) {
+ remove_group_snapshot(group_snap);
+ } else {
+ list_group_snaps();
+ }
}