]>
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 assert(m_watch_lock
.is_wlocked());
38 ceph_assert(m_watch_lock
.is_wlocked());
39 if (*m_watch_handle
== 0) {
44 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
45 ldout(cct
, 10) << dendl
;
47 uint64_t watch_handle
= 0;
48 std::swap(*m_watch_handle
, watch_handle
);
50 librados::AioCompletion
*aio_comp
= create_rados_callback
<
51 RewatchRequest
, &RewatchRequest::handle_unwatch
>(this);
52 int r
= m_ioctx
.aio_unwatch(watch_handle
, aio_comp
);
57 void RewatchRequest::handle_unwatch(int r
) {
58 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
59 ldout(cct
, 10) << "r=" << r
<< dendl
;
61 if (r
== -EBLACKLISTED
) {
62 lderr(cct
) << "client blacklisted" << dendl
;
66 lderr(cct
) << "failed to unwatch: " << cpp_strerror(r
) << dendl
;
71 void RewatchRequest::rewatch() {
72 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
73 ldout(cct
, 10) << dendl
;
75 librados::AioCompletion
*aio_comp
= create_rados_callback
<
76 RewatchRequest
, &RewatchRequest::handle_rewatch
>(this);
77 int r
= m_ioctx
.aio_watch(m_oid
, aio_comp
, &m_rewatch_handle
, m_watch_ctx
);
82 void RewatchRequest::handle_rewatch(int r
) {
83 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
84 ldout(cct
, 10) << "r=" << r
<< dendl
;
86 lderr(cct
) << "failed to watch object: " << cpp_strerror(r
)
92 RWLock::WLocker
watch_locker(m_watch_lock
);
93 *m_watch_handle
= m_rewatch_handle
;
99 void RewatchRequest::finish(int r
) {
100 CephContext
*cct
= reinterpret_cast<CephContext
*>(m_ioctx
.cct());
101 ldout(cct
, 10) << "r=" << r
<< dendl
;
103 m_on_finish
->complete(r
);
107 } // namespace watcher
108 } // namespace librbd