return s_instance;
}
+ MOCK_METHOD0(is_blacklisted, bool());
MOCK_METHOD0(is_leader, bool());
MOCK_METHOD0(release_leader, void());
}));
}
+ void expect_leader_watcher_is_blacklisted(
+ MockLeaderWatcher &mock_leader_watcher, bool blacklisted) {
+ EXPECT_CALL(mock_leader_watcher, is_blacklisted())
+ .WillRepeatedly(Return(blacklisted));
+ }
+
void expect_namespace_replayer_is_blacklisted(
MockNamespaceReplayer &mock_namespace_replayer,
bool blacklisted) {
auto mock_leader_watcher = new MockLeaderWatcher();
expect_leader_watcher_get_leader_instance_id(*mock_leader_watcher);
+ expect_leader_watcher_is_blacklisted(*mock_leader_watcher, false);
InSequence seq;
auto mock_leader_watcher = new MockLeaderWatcher();
expect_leader_watcher_get_leader_instance_id(*mock_leader_watcher);
expect_leader_watcher_list_instances(*mock_leader_watcher);
+ expect_leader_watcher_is_blacklisted(*mock_leader_watcher, false);
InSequence seq;
auto mock_leader_watcher = new MockLeaderWatcher();
expect_leader_watcher_get_leader_instance_id(*mock_leader_watcher);
expect_leader_watcher_list_instances(*mock_leader_watcher);
+ expect_leader_watcher_is_blacklisted(*mock_leader_watcher, false);
auto& mock_cluster = get_mock_cluster();
auto mock_local_rados_client = mock_cluster.do_create_rados_client(
auto mock_leader_watcher = new MockLeaderWatcher();
expect_leader_watcher_get_leader_instance_id(*mock_leader_watcher);
expect_leader_watcher_list_instances(*mock_leader_watcher);
+ expect_leader_watcher_is_blacklisted(*mock_leader_watcher, false);
auto& mock_cluster = get_mock_cluster();
auto mock_local_rados_client = mock_cluster.do_create_rados_client(
ceph_assert(m_image_replayers.empty());
}
+template <typename I>
+bool InstanceReplayer<I>::is_blacklisted() const {
+ std::lock_guard 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
PoolMetaCache* pool_meta_cache);
~InstanceReplayer();
+ bool is_blacklisted() const;
+
int init();
void shut_down();
journal::CacheManagerHandler *m_cache_manager_handler;
PoolMetaCache* m_pool_meta_cache;
- ceph::mutex m_lock;
+ mutable ceph::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 {
+ std::lock_guard locker{m_lock};
+ return m_blacklisted;
+}
+
template <typename I>
bool LeaderWatcher<I>::is_leader() const {
std::lock_guard locker{m_lock};
auto iter = bl.cbegin();
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;
template <typename I>
bool NamespaceReplayer<I>::is_blacklisted() const {
std::lock_guard locker{m_lock};
- return (m_local_pool_watcher &&
+ return 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());
std::unique_lock locker{m_lock};
- if (m_default_namespace_replayer->is_blacklisted()) {
+ if (m_leader_watcher->is_blacklisted() ||
+ m_default_namespace_replayer->is_blacklisted()) {
m_blacklisted = true;
m_stopping = true;
}