return s_instance;
}
+ MOCK_METHOD0(is_blacklisted, bool());
+
MOCK_METHOD0(start, void());
MOCK_METHOD0(stop, void());
MOCK_METHOD0(restart, void());
return s_instance;
}
+ MOCK_METHOD0(is_blacklisted, bool());
MOCK_METHOD0(is_leader, bool());
MOCK_METHOD0(release_leader, void());
Return(r)));
}
+ void expect_instance_replayer_is_blacklisted(
+ MockInstanceReplayer &mock_instance_replayer, bool blacklisted) {
+ EXPECT_CALL(mock_instance_replayer, is_blacklisted())
+ .WillRepeatedly(Return(blacklisted));
+ }
+
void expect_instance_replayer_init(MockInstanceReplayer& mock_instance_replayer) {
EXPECT_CALL(mock_instance_replayer, init());
}
EXPECT_CALL(mock_instance_watcher, shut_down());
}
+ void expect_leader_watcher_is_blacklisted(
+ MockLeaderWatcher &mock_leader_watcher, bool blacklisted) {
+ EXPECT_CALL(mock_leader_watcher, is_blacklisted())
+ .WillRepeatedly(Return(blacklisted));
+ }
+
void expect_leader_watcher_init(MockLeaderWatcher& mock_leader_watcher,
int r) {
EXPECT_CALL(mock_leader_watcher, init())
peer_spec.mon_host = "123";
peer_spec.key = "234";
+ auto mock_instance_replayer = new MockInstanceReplayer();
+ expect_instance_replayer_is_blacklisted(*mock_instance_replayer, false);
+
+ auto mock_leader_watcher = new MockLeaderWatcher();
+ expect_leader_watcher_is_blacklisted(*mock_leader_watcher, false);
+
InSequence seq;
auto& mock_cluster = get_mock_cluster();
expect_mirror_uuid_get(mock_local_io_ctx, "uuid", 0);
- auto mock_instance_replayer = new MockInstanceReplayer();
expect_instance_replayer_init(*mock_instance_replayer);
expect_instance_replayer_add_peer(*mock_instance_replayer, "uuid");
expect_service_daemon_add_or_update_instance_id_attribute(
*mock_instance_watcher, mock_service_daemon);
- auto mock_leader_watcher = new MockLeaderWatcher();
expect_leader_watcher_init(*mock_leader_watcher, 0);
MockThreads mock_threads(m_threads);
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
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 {
+ std::lock_guard locker{m_lock};
+ return m_blacklisted;
+}
+
template <typename I>
bool LeaderWatcher<I>::is_leader() const {
Mutex::Locker 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;
}
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;