They were supposed to be used to pass a list of peer images.
It has turned out unnecessary.
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
MOCK_METHOD0(restart, void());
MOCK_METHOD0(flush, void());
MOCK_METHOD2(print_status, void(Formatter *, stringstream *));
- MOCK_METHOD1(set_remote_images, void(const PeerImages &));
+ MOCK_METHOD3(add_remote_image, void(const std::string &,
+ const std::string &,
+ librados::IoCtx &));
MOCK_METHOD2(remove_remote_image, void(const std::string &,
const std::string &));
MOCK_METHOD0(remote_images_empty, bool());
"local_mirror_uuid", m_local_io_ctx.get_id());
std::string global_image_id("global_image_id");
- rbd::mirror::instance_watcher::PeerImageIds peer_image_ids =
- {{"remote_mirror_uuid", "remote_image_id"}};
EXPECT_CALL(mock_image_replayer, get_global_image_id())
.WillRepeatedly(ReturnRef(global_image_id));
InSequence seq;
instance_replayer.init();
- instance_replayer.set_peers({{"remote_mirror_uuid", m_remote_io_ctx}});
+ instance_replayer.add_peer("remote_mirror_uuid", m_remote_io_ctx);
// Acquire
C_SaferCond on_acquire;
- EXPECT_CALL(mock_image_replayer, set_remote_images(_));
+ EXPECT_CALL(mock_image_replayer, add_remote_image("remote_mirror_uuid",
+ "remote_image_id", _));
EXPECT_CALL(mock_image_replayer, is_stopped())
.WillOnce(Return(true));
EXPECT_CALL(mock_image_replayer, start(nullptr, false));
- instance_replayer.acquire_image(global_image_id, peer_image_ids, &on_acquire);
+ instance_replayer.acquire_image(global_image_id, "remote_mirror_uuid",
+ "remote_image_id", &on_acquire);
ASSERT_EQ(0, on_acquire.wait());
// Release
.WillOnce(Return(true));
EXPECT_CALL(mock_image_replayer, destroy());
- instance_replayer.release_image("global_image_id", peer_image_ids, false,
- &on_release);
+ instance_replayer.release_image("global_image_id", "remote_mirror_uuid",
+ "remote_image_id", false, &on_release);
ASSERT_EQ(0, on_release.wait());
instance_replayer.shut_down();
add_library(rbd_mirror_types STATIC
- instance_watcher/Types.cc
leader_watcher/Types.cc)
set(rbd_mirror_internal
librados::IoCtx &io_ctx) {
Mutex::Locker locker(m_lock);
- PeerImage remote_image(mirror_uuid, io_ctx, image_id);
+ RemoteImage remote_image(mirror_uuid, image_id, io_ctx);
auto it = m_remote_images.find(remote_image);
if (it == m_remote_images.end()) {
m_remote_images.insert(remote_image);
m_remote_images.erase({mirror_uuid, image_id});
}
-template <typename I>
-void ImageReplayer<I>::set_remote_images(const PeerImages &remote_images) {
- Mutex::Locker locker(m_lock);
- m_remote_images = remote_images;
-}
-
template <typename I>
bool ImageReplayer<I>::remote_images_empty() const {
Mutex::Locker locker(m_lock);
librados::IoCtx &remote_io_ctx);
void remove_remote_image(const std::string &remote_mirror_uuid,
const std::string &remote_image_id);
- void set_remote_images(const PeerImages &remote_images);
-
bool remote_images_empty() const;
inline int64_t get_local_pool_id() const {
bool on_replay_interrupted();
private:
+ struct RemoteImage {
+ std::string mirror_uuid;
+ std::string image_id;
+ librados::IoCtx io_ctx;
+
+ RemoteImage() {
+ }
+ RemoteImage(const std::string &mirror_uuid,
+ const std::string &image_id)
+ : mirror_uuid(mirror_uuid), image_id(image_id) {
+ }
+ RemoteImage(const std::string &mirror_uuid,
+ const std::string &image_id,
+ librados::IoCtx &io_ctx)
+ : mirror_uuid(mirror_uuid), image_id(image_id), io_ctx(io_ctx) {
+ }
+
+ inline bool operator<(const RemoteImage &rhs) const {
+ if (mirror_uuid != rhs.mirror_uuid) {
+ return mirror_uuid < rhs.mirror_uuid;
+ } else {
+ return image_id < rhs.image_id;
+ }
+ }
+ inline bool operator==(const RemoteImage &rhs) const {
+ return (mirror_uuid == rhs.mirror_uuid && image_id == rhs.image_id);
+ }
+ };
+
+ typedef std::set<RemoteImage> RemoteImages;
+
typedef typename librbd::journal::TypeTraits<ImageCtxT>::Journaler Journaler;
typedef boost::optional<State> OptionalState;
std::shared_ptr<ImageDeleter> m_image_deleter;
ImageSyncThrottlerRef<ImageCtxT> m_image_sync_throttler;
- PeerImages m_remote_images;
- PeerImage m_remote_image;
+ RemoteImages m_remote_images;
+ RemoteImage m_remote_image;
RadosRef m_local;
std::string m_local_mirror_uuid;
}
template <typename I>
-void InstanceReplayer<I>::set_peers(const Peers &peers) {
- dout(20) << dendl;
+void InstanceReplayer<I>::add_peer(std::string mirror_uuid,
+ librados::IoCtx io_ctx) {
+ dout(20) << mirror_uuid << dendl;
Mutex::Locker locker(m_lock);
- m_peers = peers;
+ auto result = m_peers.insert(Peer(mirror_uuid, io_ctx)).second;
+ assert(result);
+}
+
+template <typename I>
+void InstanceReplayer<I>::remove_peer(std::string mirror_uuid) {
+ dout(20) << mirror_uuid << dendl;
+
+ Mutex::Locker locker(m_lock);
+ auto result = m_peers.erase(Peer(mirror_uuid));
+ assert(result > 0);
}
template <typename I>
}
template <typename I>
-void InstanceReplayer<I>::acquire_image(
- const std::string &global_image_id,
- const instance_watcher::PeerImageIds &peers, Context *on_finish) {
- dout(20) << "global_image_id=" << global_image_id << dendl;
+void InstanceReplayer<I>::acquire_image(const std::string &global_image_id,
+ const std::string &peer_mirror_uuid,
+ const std::string &peer_image_id,
+ Context *on_finish) {
+ dout(20) << "global_image_id=" << global_image_id << ", peer_mirror_uuid="
+ << peer_mirror_uuid << ", peer_image_id=" << peer_image_id << dendl;
Mutex::Locker locker(m_lock);
auto image_replayer = it->second;
- PeerImages remote_images;
- for (auto &peer : peers) {
- auto it = m_peers.find(Peer(peer.mirror_uuid));
- assert(it != m_peers.end());
- auto io_ctx = it->io_ctx;
- remote_images.insert({peer.mirror_uuid, io_ctx, peer.image_id});
- }
+ auto iter = m_peers.find(Peer(peer_mirror_uuid));
+ assert(iter != m_peers.end());
+ auto io_ctx = iter->io_ctx;
- image_replayer->set_remote_images(remote_images);
+ image_replayer->add_remote_image(peer_mirror_uuid, peer_image_id, io_ctx);
start_image_replayer(image_replayer);
}
template <typename I>
-void InstanceReplayer<I>::release_image(
- const std::string &global_image_id,
- const instance_watcher::PeerImageIds &peers, bool schedule_delete,
- Context *on_finish) {
- dout(20) << "global_image_id=" << global_image_id << ", "
- << "schedule_delete=" << schedule_delete << dendl;
+void InstanceReplayer<I>::release_image(const std::string &global_image_id,
+ const std::string &peer_mirror_uuid,
+ const std::string &peer_image_id,
+ bool schedule_delete,
+ Context *on_finish) {
+ dout(20) << "global_image_id=" << global_image_id << ", peer_mirror_uuid="
+ << peer_mirror_uuid << ", peer_image_id=" << peer_image_id << dendl;
Mutex::Locker locker(m_lock);
auto image_replayer = it->second;
- for (auto &peer : peers) {
- image_replayer->remove_remote_image(peer.mirror_uuid, peer.image_id);
- }
+ image_replayer->remove_remote_image(peer_mirror_uuid, peer_image_id);
if (!image_replayer->remote_images_empty()) {
dout(20) << global_image_id << ": still has remote images" << dendl;
#include "common/AsyncOpTracker.h"
#include "common/Formatter.h"
#include "common/Mutex.h"
-#include "tools/rbd_mirror/instance_watcher/Types.h"
#include "types.h"
namespace librbd { class ImageCtx; }
void init(Context *on_finish);
void shut_down(Context *on_finish);
- void set_peers(const Peers &peers);
+ void add_peer(std::string mirror_uuid, librados::IoCtx io_ctx);
+ void remove_peer(std::string mirror_uuid);
void acquire_image(const std::string &global_image_id,
- const instance_watcher::PeerImageIds &peers,
+ const std::string &peer_mirror_uuid,
+ const std::string &peer_image_id,
Context *on_finish);
void release_image(const std::string &global_image_id,
- const instance_watcher::PeerImageIds &peers,
+ const std::string &peer_mirror_uuid,
+ const std::string &peer_image_id,
bool schedule_delete, Context *on_finish);
void release_all(Context *on_finish);
* @endverbatim
*/
+ struct Peer {
+ std::string mirror_uuid;
+ librados::IoCtx io_ctx;
+
+ Peer() {
+ }
+
+ Peer(const std::string &mirror_uuid) : mirror_uuid(mirror_uuid) {
+ }
+
+ Peer(const std::string &mirror_uuid, librados::IoCtx &io_ctx)
+ : mirror_uuid(mirror_uuid), io_ctx(io_ctx) {
+ }
+
+ inline bool operator<(const Peer &rhs) const {
+ return mirror_uuid < rhs.mirror_uuid;
+ }
+ inline bool operator==(const Peer &rhs) const {
+ return mirror_uuid == rhs.mirror_uuid;
+ }
+ };
+
+ typedef std::set<Peer> Peers;
+
Threads<ImageCtxT> *m_threads;
std::shared_ptr<ImageDeleter> m_image_deleter;
ImageSyncThrottlerRef<ImageCtxT> m_image_sync_throttler;
m_image_sync_throttler, m_local_rados,
local_mirror_uuid, m_local_pool_id));
m_instance_replayer->init();
+ m_instance_replayer->add_peer(m_peer.uuid, m_remote_io_ctx);
m_leader_watcher.reset(new LeaderWatcher<>(m_threads, m_local_io_ctx,
&m_leader_listener));
return;
}
- m_instance_replayer->set_peers({{mirror_uuid, m_remote_io_ctx}});
+ if (m_peer.uuid != mirror_uuid) {
+ m_instance_replayer->remove_peer(m_peer.uuid);
+ m_instance_replayer->add_peer(mirror_uuid, m_remote_io_ctx);
+ m_peer.uuid = mirror_uuid;
+ }
// first callback will be a full directory -- so see if we need to remove
// any local images that no longer exist on the remote side
C_Gather *gather_ctx = new C_Gather(g_ceph_context, ctx);
for (auto &image_id : removed_image_ids) {
- m_instance_replayer->release_image(image_id.global_id,
- {{mirror_uuid, image_id.id}}, true,
+ m_instance_replayer->release_image(image_id.global_id, mirror_uuid,
+ image_id.id, true,
gather_ctx->new_sub());
}
for (auto &image_id : added_image_ids) {
- m_instance_replayer->acquire_image(image_id.global_id,
- {{mirror_uuid, image_id.id}},
- gather_ctx->new_sub());
+ m_instance_replayer->acquire_image(image_id.global_id, mirror_uuid,
+ image_id.id, gather_ctx->new_sub());
}
gather_ctx->activate();
+++ /dev/null
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-
-#include "Types.h"
-#include "common/Formatter.h"
-
-namespace rbd {
-namespace mirror {
-namespace instance_watcher {
-
-void PeerImageId::encode(bufferlist &bl) const {
- ::encode(mirror_uuid, bl);
- ::encode(image_id, bl);
-}
-
-void PeerImageId::decode(bufferlist::iterator &iter) {
- ::decode(mirror_uuid, iter);
- ::decode(image_id, iter);
-}
-
-void PeerImageId::dump(Formatter *f) const {
- f->dump_string("mirror_uuid", mirror_uuid);
- f->dump_string("image_id", image_id);
-}
-
-} // namespace instance_watcher
-} // namespace mirror
-} // namespace rbd
+++ /dev/null
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-
-#ifndef RBD_MIRROR_INSTANCE_WATCHER_TYPES_H
-#define RBD_MIRROR_INSTANCE_WATCHER_TYPES_H
-
-#include <string>
-#include <set>
-#include <boost/variant.hpp>
-
-#include "include/buffer_fwd.h"
-#include "include/encoding.h"
-#include "include/int_types.h"
-
-namespace ceph { class Formatter; }
-
-namespace rbd {
-namespace mirror {
-namespace instance_watcher {
-
-struct PeerImageId {
- std::string mirror_uuid;
- std::string image_id;
-
- inline bool operator<(const PeerImageId &rhs) const {
- return mirror_uuid < rhs.mirror_uuid;
- }
-
- inline bool operator==(const PeerImageId &rhs) const {
- return (mirror_uuid == rhs.mirror_uuid && image_id == rhs.image_id);
- }
-
- void encode(bufferlist& bl) const;
- void decode(bufferlist::iterator& it);
- void dump(Formatter *f) const;
-};
-
-WRITE_CLASS_ENCODER(PeerImageId);
-
-typedef std::set<PeerImageId> PeerImageIds;
-
-} // namespace instance_watcher
-} // namespace mirror
-} // namespace librbd
-
-#endif // RBD_MIRROR_INSTANCE_WATCHER_TYPES_H
typedef std::set<ImageId> ImageIds;
-struct Peer {
- std::string mirror_uuid;
- librados::IoCtx io_ctx;
-
- Peer() {
- }
-
- Peer(const std::string &mirror_uuid) : mirror_uuid(mirror_uuid) {
- }
-
- Peer(const std::string &mirror_uuid, librados::IoCtx &io_ctx)
- : mirror_uuid(mirror_uuid), io_ctx(io_ctx) {
- }
-
- inline bool operator<(const Peer &rhs) const {
- return mirror_uuid < rhs.mirror_uuid;
- }
- inline bool operator==(const Peer &rhs) const {
- return mirror_uuid == rhs.mirror_uuid;
- }
-};
-
-typedef std::set<Peer> Peers;
-
-struct PeerImage : public Peer {
- std::string image_id;
-
- PeerImage() {
- }
- PeerImage(const std::string &mirror_uuid, const std::string &image_id)
- : Peer(mirror_uuid), image_id(image_id) {
- }
- PeerImage(const std::string &mirror_uuid, librados::IoCtx &io_ctx,
- const std::string &image_id)
- : Peer(mirror_uuid, io_ctx), image_id(image_id) {
- }
-
- inline bool operator<(const PeerImage &rhs) const {
- if (mirror_uuid != rhs.mirror_uuid) {
- return mirror_uuid < rhs.mirror_uuid;
- } else {
- return image_id < rhs.image_id;
- }
- }
- inline bool operator==(const PeerImage &rhs) const {
- return (mirror_uuid == rhs.mirror_uuid && image_id == rhs.image_id);
- }
-};
-
-typedef std::set<PeerImage> PeerImages;
-
struct peer_t {
peer_t() = default;
peer_t(const std::string &uuid, const std::string &cluster_name,