]>
git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/watcher/RewatchRequest.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "librbd/watcher/RewatchRequest.h"
5 #include "common/RWLock.h"
6 #include "common/errno.h"
7 #include "librbd/Utils.h"
9 #define dout_subsys ceph_subsys_rbd
11 #define dout_prefix *_dout << "librbd::watcher::RewatchRequest: " \
12 << this << " " << __func__ << " "
16 using util::create_context_callback
;
17 using util::create_rados_callback
;
23 RewatchRequest::RewatchRequest(librados::IoCtx
& ioctx
, const string
& oid
,
25 librados::WatchCtx2
*watch_ctx
,
26 uint64_t *watch_handle
, Context
*on_finish
)
27 : m_ioctx(ioctx
), m_oid(oid
), m_watch_lock(watch_lock
),
28 m_watch_ctx(watch_ctx
), m_watch_handle(watch_handle
),
29 m_on_finish(on_finish
) {
32 void RewatchRequest::send() {
36 void RewatchRequest::unwatch() {
37 ceph_assert(m_watch_lock
.is_wlocked());
38 if (*m_watch_handle
== 0) {
43 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
44 ldout(cct
, 10) << dendl
;
46 uint64_t watch_handle
= 0;
47 std::swap(*m_watch_handle
, watch_handle
);
49 librados::AioCompletion
*aio_comp
= create_rados_callback
<
50 RewatchRequest
, &RewatchRequest::handle_unwatch
>(this);
51 int r
= m_ioctx
.aio_unwatch(watch_handle
, aio_comp
);
56 void RewatchRequest::handle_unwatch(int r
) {
57 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
58 ldout(cct
, 10) << "r=" << r
<< dendl
;
60 if (r
== -EBLACKLISTED
) {
61 lderr(cct
) << "client blacklisted" << dendl
;
65 lderr(cct
) << "failed to unwatch: " << cpp_strerror(r
) << dendl
;
70 void RewatchRequest::rewatch() {
71 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
72 ldout(cct
, 10) << dendl
;
74 librados::AioCompletion
*aio_comp
= create_rados_callback
<
75 RewatchRequest
, &RewatchRequest::handle_rewatch
>(this);
76 int r
= m_ioctx
.aio_watch(m_oid
, aio_comp
, &m_rewatch_handle
, m_watch_ctx
);
81 void RewatchRequest::handle_rewatch(int r
) {
82 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
83 ldout(cct
, 10) << "r=" << r
<< dendl
;
85 lderr(cct
) << "failed to watch object: " << cpp_strerror(r
)
91 RWLock::WLocker
watch_locker(m_watch_lock
);
92 *m_watch_handle
= m_rewatch_handle
;
98 void RewatchRequest::finish(int r
) {
99 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
100 ldout(cct
, 10) << "r=" << r
<< dendl
;
102 m_on_finish
->complete(r
);
106 } // namespace watcher
107 } // namespace librbd