Fixes: https://tracker.ceph.com/issues/44159
Signed-off-by: Mykola Golub <mgolub@suse.com>
(cherry picked from commit
cfb4f423a42d0265cb78ebb4eb8cc6924d6f45fa)
Conflicts:
src/tools/rbd_mirror/InstanceReplayer.h (ceph::mutex vs Mutex)
src/tools/rbd_mirror/InstanceReplayer.cc (Mutex::Locker vs std::lock_guard)
src/tools/rbd_mirror/LeaderWatcher.cc (Mutex::Locker vs std::lock_guard)
src/tools/rbd_mirror/NamespaceReplayer.cc (does not exist)
src/tools/rbd_mirror/PoolReplayer.cc (code from NamespaceReplayer is here)
src/test/rbd_mirror/test_mock_PoolReplayer.cc (does not exist)
assert(m_image_replayers.empty());
}
+template <typename I>
+bool InstanceReplayer<I>::is_blacklisted() const {
+ Mutex::Locker locker(m_lock);
+ return m_blacklisted;
+}
+
template <typename I>
int InstanceReplayer<I>::init() {
C_SaferCond init_ctx;
} else if (image_replayer->is_blacklisted()) {
derr << "global_image_id=" << global_image_id << ": blacklisted detected "
<< "during image replay" << dendl;
+ m_blacklisted = true;
return;
} else if (image_replayer->is_finished()) {
// TODO temporary until policy integrated
int64_t local_pool_id);
~InstanceReplayer();
+ bool is_blacklisted() const;
+
int init();
void shut_down();
std::string m_local_mirror_uuid;
int64_t m_local_pool_id;
- Mutex m_lock;
+ mutable Mutex m_lock;
AsyncOpTracker m_async_op_tracker;
std::map<std::string, ImageReplayer<ImageCtxT> *> m_image_replayers;
Peers m_peers;
Context *m_image_state_check_task = nullptr;
Context *m_on_shut_down = nullptr;
bool m_manual_stop = false;
+ bool m_blacklisted = false;
void wait_for_ops();
void handle_wait_for_ops(int r);
m_work_queue->queue(ctx, 0);
}
+template <typename I>
+bool LeaderWatcher<I>::is_blacklisted() const {
+ Mutex::Locker locker(m_lock);
+
+ return m_blacklisted;
+}
+
template <typename I>
bool LeaderWatcher<I>::is_leader() const {
Mutex::Locker locker(m_lock);
bufferlist::iterator iter = bl.begin();
decode(notify_message, iter);
} catch (const buffer::error &err) {
- derr << ": error decoding image notification: " << err.what() << dendl;
+ derr << "error decoding image notification: " << err.what() << dendl;
ctx->complete(0);
return;
}
void LeaderWatcher<I>::handle_rewatch_complete(int r) {
dout(5) << "r=" << r << dendl;
- if (r != -EBLACKLISTED) {
- m_leader_lock->reacquire_lock(nullptr);
+ if (r == -EBLACKLISTED) {
+ dout(1) << "blacklisted detected" << dendl;
+ m_blacklisted = true;
+ return;
}
+
+ m_leader_lock->reacquire_lock(nullptr);
}
template <typename I>
void init(Context *on_finish);
void shut_down(Context *on_finish);
+ bool is_blacklisted() const;
bool is_leader() const;
bool is_releasing_leader() const;
bool get_leader_instance_id(std::string *instance_id) const;
Instances<ImageCtxT> *m_instances = nullptr;
librbd::managed_lock::Locker m_locker;
+ bool m_blacklisted = false;
+
AsyncOpTracker m_timer_op_tracker;
Context *m_timer_task = nullptr;
C_TimerGate *m_timer_gate = nullptr;
}
Mutex::Locker locker(m_lock);
- if ((m_local_pool_watcher && m_local_pool_watcher->is_blacklisted()) ||
+ if (m_leader_watcher->is_blacklisted() ||
+ m_instance_replayer->is_blacklisted() ||
+ (m_local_pool_watcher && m_local_pool_watcher->is_blacklisted()) ||
(m_remote_pool_watcher && m_remote_pool_watcher->is_blacklisted())) {
m_blacklisted = true;
m_stopping = true;