#include "tools/rbd_mirror/image_replayer/CloseImageRequest.h"
#include "tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.h"
#include "tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.h"
+#include "tools/rbd_mirror/image_replayer/Utils.h"
#include "tools/rbd_mirror/image_replayer/journal/EventPreprocessor.h"
#include "tools/rbd_mirror/image_replayer/journal/ReplayStatusFormatter.h"
// name. When the image name becomes known on start the asok commands will be
// re-registered using "remote_pool_name/remote_image_name" name.
- m_name = admin_socket_hook_name(global_image_id);
+ m_image_spec = image_replayer::util::compute_image_spec(
+ local_io_ctx, global_image_id);
register_admin_socket_hook();
}
std::lock_guard l{m_lock};
f->open_object_section("image_replayer");
- f->dump_string("name", m_name);
+ f->dump_string("name", m_image_spec);
f->dump_string("state", to_string(m_state));
f->close_section();
}
ceph_assert(m_perf_counters == nullptr);
- dout(15) << "registered asok hook: " << m_name << dendl;
- asok_hook = new ImageReplayerAdminSocketHook<I>(g_ceph_context, m_name,
- this);
+ dout(15) << "registered asok hook: " << m_image_spec << dendl;
+ asok_hook = new ImageReplayerAdminSocketHook<I>(
+ g_ceph_context, m_image_spec, this);
int r = asok_hook->register_commands();
if (r == 0) {
m_asok_hook = asok_hook;
CephContext *cct = static_cast<CephContext *>(m_local_io_ctx.cct());
- auto prio = cct->_conf.get_val<int64_t>("rbd_mirror_image_perf_stats_prio");
- PerfCountersBuilder plb(g_ceph_context, "rbd_mirror_image_" + m_name,
+ auto prio = cct->_conf.get_val<int64_t>(
+ "rbd_mirror_image_perf_stats_prio");
+ PerfCountersBuilder plb(g_ceph_context,
+ "rbd_mirror_image_" + m_image_spec,
l_rbd_mirror_first, l_rbd_mirror_last);
plb.add_u64_counter(l_rbd_mirror_replay, "replay", "Replays", "r", prio);
plb.add_u64_counter(l_rbd_mirror_replay_bytes, "replay_bytes",
{
std::lock_guard locker{m_lock};
- auto name = admin_socket_hook_name(m_local_image_name);
- if (m_asok_hook != nullptr && m_name == name) {
+ auto image_spec = image_replayer::util::compute_image_spec(
+ m_local_io_ctx, m_local_image_name);
+ if (m_asok_hook != nullptr && m_image_spec == image_spec) {
return;
}
- m_name = name;
+ m_image_spec = image_spec;
}
unregister_admin_socket_hook();
register_admin_socket_hook();
}
-template <typename I>
-std::string ImageReplayer<I>::admin_socket_hook_name(
- const std::string &image_name) const {
- std::string name = m_local_io_ctx.get_namespace();
- if (!name.empty()) {
- name += "/";
- }
-
- return m_local_io_ctx.get_pool_name() + "/" + name + image_name;
-}
-
template <typename I>
std::ostream &operator<<(std::ostream &os, const ImageReplayer<I> &replayer)
{
bool is_running() { std::lock_guard l{m_lock}; return is_running_(); }
bool is_replaying() { std::lock_guard l{m_lock}; return is_replaying_(); }
- std::string get_name() { std::lock_guard l{m_lock}; return m_name; };
+ std::string get_name() { std::lock_guard l{m_lock}; return m_image_spec; };
void set_state_description(int r, const std::string &desc);
// TODO temporary until policy handles release of image replayers
std::string m_local_image_id;
std::string m_local_image_name;
- std::string m_name;
+ std::string m_image_spec;
mutable ceph::mutex m_lock;
State m_state = STATE_STOPPED;
void register_admin_socket_hook();
void unregister_admin_socket_hook();
void reregister_admin_socket_hook();
-
- std::string admin_socket_hook_name(const std::string &image_name) const;
};
} // namespace mirror
// vim: ts=8 sw=2 smarttab
#include "tools/rbd_mirror/image_replayer/Utils.h"
+#include "include/rados/librados.hpp"
#include "common/debug.h"
#include "common/errno.h"
#include "cls/journal/cls_journal_types.h"
namespace image_replayer {
namespace util {
+std::string compute_image_spec(librados::IoCtx& io_ctx,
+ const std::string& image_name) {
+ std::string name = io_ctx.get_namespace();
+ if (!name.empty()) {
+ name += "/";
+ }
+
+ return io_ctx.get_pool_name() + "/" + name + image_name;
+}
+
bool decode_client_meta(const cls::journal::Client& client,
librbd::journal::MirrorPeerClientMeta* client_meta) {
dout(15) << dendl;