ondisk_status.up = false;
ondisk_status.last_update = ceph_clock_now();
- int r = cls_get_request_origin(hctx, &ondisk_status.origin);
+ std::string group_id;
+ int r = group_get_group_id(hctx, global_group_id, &group_id);
+ if (r < 0) {
+ return 0;
+ }
+
+ cls::rbd::MirrorGroup group;
+ r = group_get(hctx, group_id, &group);
+ if (r < 0) {
+ return 0;
+ }
+
+ if (group.state != cls::rbd::MIRROR_GROUP_STATE_ENABLED) {
+ return 0;
+ }
+
+ r = cls_get_request_origin(hctx, &ondisk_status.origin);
ceph_assert(r == 0);
bufferlist bl;
register_watch(on_finish);
});
+ remove_down_image_status(on_finish);
+}
+
+template <typename I>
+void MirrorStatusWatcher<I>::remove_down_image_status(Context *on_finish) {
+ dout(20) << dendl;
+
librados::ObjectWriteOperation op;
librbd::cls_client::mirror_image_status_remove_down(&op);
- librados::AioCompletion *aio_comp = create_rados_callback(on_finish);
+ auto comp = create_rados_callback(
+ new LambdaContext([this, on_finish](int r) {
+ handle_remove_down_image_status(r, on_finish);
+ }));
- int r = m_ioctx.aio_operate(RBD_MIRRORING, aio_comp, &op);
+ int r = m_ioctx.aio_operate(RBD_MIRRORING, comp, &op);
ceph_assert(r == 0);
- aio_comp->release();
+ comp->release();
+}
+
+template <typename I>
+void MirrorStatusWatcher<I>::handle_remove_down_image_status(int r,
+ Context *on_finish) {
+ dout(20) << "r=" << r << dendl;
+
+ remove_down_group_status(on_finish);
+}
+
+template <typename I>
+void MirrorStatusWatcher<I>::remove_down_group_status(Context *on_finish) {
+ dout(20) << dendl;
+
+ librados::ObjectWriteOperation op;
+ librbd::cls_client::mirror_group_status_remove_down(&op);
+ auto comp = create_rados_callback(
+ new LambdaContext([this, on_finish](int r) {
+ handle_remove_down_group_status(r, on_finish);
+ }));
+
+ int r = m_ioctx.aio_operate(RBD_MIRRORING, comp, &op);
+ ceph_assert(r == 0);
+ comp->release();
+}
+
+template <typename I>
+void MirrorStatusWatcher<I>::handle_remove_down_group_status(int r,
+ Context *on_finish) {
+ dout(20) << "r=" << r << dendl;
+
+ on_finish->complete(r);
}
template <typename I>
~MirrorStatusWatcher() override;
void init(Context *on_finish);
+ void remove_down_image_status(Context *on_finish);
+ void handle_remove_down_image_status(int r, Context *on_finish);
+ void remove_down_group_status(Context *on_finish);
+ void handle_remove_down_group_status(int r, Context *on_finish);
void shut_down(Context *on_finish);
protected: