1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "common/dout.h"
5 #include "common/errno.h"
6 #include "common/Timer.h"
7 #include "journal/Settings.h"
8 #include "include/ceph_assert.h"
9 #include "librbd/Utils.h"
10 #include "librbd/journal/RemoveRequest.h"
12 #define dout_subsys ceph_subsys_rbd
14 #define dout_prefix *_dout << "librbd::Journal::RemoveRequest: "
18 using util::create_context_callback
;
23 RemoveRequest
<I
>::RemoveRequest(IoCtx
&ioctx
, const std::string
&image_id
,
24 const std::string
&client_id
,
25 ContextWQ
*op_work_queue
,
27 : m_ioctx(ioctx
), m_image_id(image_id
), m_image_client_id(client_id
),
28 m_op_work_queue(op_work_queue
), m_on_finish(on_finish
) {
29 m_cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
33 void RemoveRequest
<I
>::send() {
34 ldout(m_cct
, 20) << this << " " << __func__
<< dendl
;
40 void RemoveRequest
<I
>::stat_journal() {
41 ldout(m_cct
, 20) << this << " " << __func__
<< dendl
;
43 ImageCtx::get_timer_instance(m_cct
, &m_timer
, &m_timer_lock
);
44 m_journaler
= new Journaler(m_op_work_queue
, m_timer
, m_timer_lock
, m_ioctx
,
45 m_image_id
, m_image_client_id
, {}, nullptr);
47 using klass
= RemoveRequest
<I
>;
48 Context
*ctx
= create_context_callback
<klass
, &klass::handle_stat_journal
>(this);
50 m_journaler
->exists(ctx
);
54 Context
*RemoveRequest
<I
>::handle_stat_journal(int *result
) {
55 ldout(m_cct
, 20) << __func__
<< ": r=" << *result
<< dendl
;
57 if ((*result
< 0) && (*result
!= -ENOENT
)) {
58 lderr(m_cct
) << "failed to stat journal header: " << cpp_strerror(*result
) << dendl
;
59 shut_down_journaler(*result
);
63 if (*result
== -ENOENT
) {
64 shut_down_journaler(0);
73 void RemoveRequest
<I
>::init_journaler() {
74 ldout(m_cct
, 20) << this << " " << __func__
<< dendl
;
76 using klass
= RemoveRequest
<I
>;
77 Context
*ctx
= create_context_callback
<klass
, &klass::handle_init_journaler
>(this);
79 m_journaler
->init(ctx
);
83 Context
*RemoveRequest
<I
>::handle_init_journaler(int *result
) {
84 ldout(m_cct
, 20) << __func__
<< ": r=" << *result
<< dendl
;
86 if ((*result
< 0) && (*result
!= -ENOENT
)) {
87 lderr(m_cct
) << "failed to init journaler: " << cpp_strerror(*result
) << dendl
;
88 shut_down_journaler(*result
);
97 void RemoveRequest
<I
>::remove_journal() {
98 ldout(m_cct
, 20) << this << " " << __func__
<< dendl
;
100 using klass
= RemoveRequest
<I
>;
101 Context
*ctx
= create_context_callback
<klass
, &klass::handle_remove_journal
>(this);
103 m_journaler
->remove(true, ctx
);
107 Context
*RemoveRequest
<I
>::handle_remove_journal(int *result
) {
108 ldout(m_cct
, 20) << __func__
<< ": r=" << *result
<< dendl
;
111 lderr(m_cct
) << "failed to remove journal: " << cpp_strerror(*result
) << dendl
;
114 shut_down_journaler(*result
);
119 void RemoveRequest
<I
>::shut_down_journaler(int r
) {
120 ldout(m_cct
, 20) << this << " " << __func__
<< dendl
;
124 using klass
= RemoveRequest
<I
>;
125 Context
*ctx
= create_context_callback
<klass
, &klass::handle_journaler_shutdown
>(this);
127 m_journaler
->shut_down(ctx
);
131 Context
*RemoveRequest
<I
>::handle_journaler_shutdown(int *result
) {
132 ldout(m_cct
, 20) << __func__
<< ": r=" << *result
<< dendl
;
135 lderr(m_cct
) << "failed to shut down journaler: " << cpp_strerror(*result
) << dendl
;
140 if (m_r_saved
== 0) {
141 ldout(m_cct
, 20) << "done." << dendl
;
144 m_on_finish
->complete(m_r_saved
);
150 } // namespace journal
151 } // namespace librbd
153 template class librbd::journal::RemoveRequest
<librbd::ImageCtx
>;