}
void MirrorImage::encode(bufferlist &bl) const {
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
encode(global_image_id, bl);
encode(static_cast<uint8_t>(state), bl);
+ encode(static_cast<uint8_t>(mode), bl);
ENCODE_FINISH(bl);
}
void MirrorImage::decode(bufferlist::const_iterator &it) {
uint8_t int_state;
- DECODE_START(1, it);
+ DECODE_START(2, it);
decode(global_image_id, it);
decode(int_state, it);
state = static_cast<MirrorImageState>(int_state);
+ if (struct_v >= 2) {
+ uint8_t int_mode;
+ decode(int_mode, it);
+ mode = static_cast<MirrorImageMode>(int_mode);
+ }
DECODE_FINISH(it);
}
void MirrorImage::dump(Formatter *f) const {
+ f->dump_stream("mode") << mode;
f->dump_string("global_image_id", global_image_id);
- f->dump_int("state", state);
+ f->dump_stream("state") << state;
}
void MirrorImage::generate_test_instances(std::list<MirrorImage*> &o) {
o.push_back(new MirrorImage());
- o.push_back(new MirrorImage("uuid-123", MIRROR_IMAGE_STATE_ENABLED));
- o.push_back(new MirrorImage("uuid-abc", MIRROR_IMAGE_STATE_DISABLING));
+ o.push_back(new MirrorImage(MIRROR_IMAGE_MODE_JOURNAL, "uuid-123",
+ MIRROR_IMAGE_STATE_ENABLED));
+ o.push_back(new MirrorImage(MIRROR_IMAGE_MODE_SNAPSHOT, "uuid-abc",
+ MIRROR_IMAGE_STATE_DISABLING));
}
bool MirrorImage::operator==(const MirrorImage &rhs) const {
- return global_image_id == rhs.global_image_id && state == rhs.state;
+ return mode == rhs.mode && global_image_id == rhs.global_image_id &&
+ state == rhs.state;
}
bool MirrorImage::operator<(const MirrorImage &rhs) const {
- return global_image_id < rhs.global_image_id ||
- (global_image_id == rhs.global_image_id && state < rhs.state);
+ if (mode != rhs.mode) {
+ return mode < rhs.mode;
+ }
+ if (global_image_id != rhs.global_image_id) {
+ return global_image_id < rhs.global_image_id;
+ }
+ return state < rhs.state;
+}
+
+std::ostream& operator<<(std::ostream& os, const MirrorImageMode& mirror_mode) {
+ switch (mirror_mode) {
+ case MIRROR_IMAGE_MODE_JOURNAL:
+ os << "journal";
+ break;
+ case MIRROR_IMAGE_MODE_SNAPSHOT:
+ os << "snapshot";
+ break;
+ default:
+ os << "unknown (" << static_cast<uint32_t>(mirror_mode) << ")";
+ break;
+ }
+ return os;
}
std::ostream& operator<<(std::ostream& os, const MirrorImageState& mirror_state) {
case MIRROR_IMAGE_STATE_ENABLED:
os << "enabled";
break;
+ case MIRROR_IMAGE_STATE_DISABLED:
+ os << "disabled";
+ break;
default:
os << "unknown (" << static_cast<uint32_t>(mirror_state) << ")";
break;
std::ostream& operator<<(std::ostream& os, const MirrorImage& mirror_image) {
os << "["
+ << "mode=" << mirror_image.mode << ", "
<< "global_image_id=" << mirror_image.global_image_id << ", "
<< "state=" << mirror_image.state << "]";
return os;
void MirrorPrimarySnapshotNamespace::encode(bufferlist& bl) const {
using ceph::encode;
encode(demoted, bl);
- encode(mirror_peers, bl);
+ encode(mirror_peer_uuids, bl);
}
void MirrorPrimarySnapshotNamespace::decode(bufferlist::const_iterator& it) {
using ceph::decode;
decode(demoted, it);
- decode(mirror_peers, it);
+ decode(mirror_peer_uuids, it);
}
void MirrorPrimarySnapshotNamespace::dump(Formatter *f) const {
f->dump_bool("demoted", demoted);
- f->open_array_section("mirror_peers");
- for (auto &peer : mirror_peers) {
- f->dump_string("mirror_peer", peer);
+ f->open_array_section("mirror_peer_uuids");
+ for (auto &peer : mirror_peer_uuids) {
+ f->dump_string("mirror_peer_uuid", peer);
}
f->close_section();
}
encode(primary_mirror_uuid, bl);
encode(primary_snap_id, bl);
encode(copied, bl);
- encode(copy_progress, bl);
+ encode(last_copied_object_number, bl);
}
void MirrorNonPrimarySnapshotNamespace::decode(bufferlist::const_iterator& it) {
decode(primary_mirror_uuid, it);
decode(primary_snap_id, it);
decode(copied, it);
- decode(copy_progress, it);
+ decode(last_copied_object_number, it);
}
void MirrorNonPrimarySnapshotNamespace::dump(Formatter *f) const {
f->dump_string("primary_mirror_uuid", primary_mirror_uuid);
f->dump_unsigned("primary_snap_id", primary_snap_id);
f->dump_bool("copied", copied);
- f->dump_unsigned("copy_progress", copy_progress);
+ f->dump_unsigned("last_copied_object_number", last_copied_object_number);
}
class EncodeSnapshotNamespaceVisitor : public boost::static_visitor<void> {
const MirrorPrimarySnapshotNamespace& ns) {
os << "[" << SNAPSHOT_NAMESPACE_TYPE_MIRROR_PRIMARY << " "
<< "demoted=" << ns.demoted << ", "
- << "mirror_peers=" << ns.mirror_peers
+ << "mirror_peer_uuids=" << ns.mirror_peer_uuids
<< "]";
return os;
}
<< "primary_mirror_uuid=" << ns.primary_mirror_uuid << ", "
<< "primary_snap_id=" << ns.primary_snap_id << ", "
<< "copied=" << ns.copied << ", "
- << "copy_progress=" << ns.copy_progress
+ << "last_copied_object_number=" << ns.last_copied_object_number
<< "]";
return os;
}
WRITE_CLASS_ENCODER(MirrorPeer);
+enum MirrorImageMode {
+ MIRROR_IMAGE_MODE_JOURNAL = 0,
+ MIRROR_IMAGE_MODE_SNAPSHOT = 1,
+};
+
enum MirrorImageState {
MIRROR_IMAGE_STATE_DISABLING = 0,
MIRROR_IMAGE_STATE_ENABLED = 1,
};
struct MirrorImage {
- MirrorImage() {}
- MirrorImage(const std::string &global_image_id, MirrorImageState state)
- : global_image_id(global_image_id), state(state) {}
+ MirrorImage() {
+ }
+ MirrorImage(MirrorImageMode mode, const std::string &global_image_id,
+ MirrorImageState state)
+ : mode(mode), global_image_id(global_image_id), state(state) {
+ }
+ MirrorImageMode mode = MIRROR_IMAGE_MODE_JOURNAL;
std::string global_image_id;
MirrorImageState state = MIRROR_IMAGE_STATE_DISABLING;
bool operator<(const MirrorImage &rhs) const;
};
+std::ostream& operator<<(std::ostream& os, const MirrorImageMode& mirror_mode);
std::ostream& operator<<(std::ostream& os, const MirrorImageState& mirror_state);
std::ostream& operator<<(std::ostream& os, const MirrorImage& mirror_image);
SNAPSHOT_NAMESPACE_TYPE_MIRROR_PRIMARY;
bool demoted = false;
- std::set<std::string> mirror_peers;
+ std::set<std::string> mirror_peer_uuids;
MirrorPrimarySnapshotNamespace() {
}
MirrorPrimarySnapshotNamespace(bool demoted,
- const std::set<std::string> &mirror_peers)
- : demoted(demoted), mirror_peers(mirror_peers) {
+ const std::set<std::string> &mirror_peer_uuids)
+ : demoted(demoted), mirror_peer_uuids(mirror_peer_uuids) {
}
void encode(bufferlist& bl) const;
std::string primary_mirror_uuid;
snapid_t primary_snap_id = CEPH_NOSNAP;
bool copied = false;
- uint64_t copy_progress = 0;
+ uint64_t last_copied_object_number = 0;
MirrorNonPrimarySnapshotNamespace() {
}
typedef struct {
bool demoted;
- size_t mirror_peers_count;
- char *mirror_peers;
+ size_t mirror_peer_uuids_count;
+ char *mirror_peer_uuids;
} rbd_snap_mirror_primary_namespace_t;
typedef struct {
char *primary_mirror_uuid;
uint64_t primary_snap_id;
bool copied;
- uint64_t copy_progress;
+ uint64_t last_copied_object_number;
} rbd_snap_mirror_non_primary_namespace_t;
typedef enum {
typedef struct {
bool demoted;
- std::set<std::string> mirror_peers;
+ std::set<std::string> mirror_peer_uuids;
} snap_mirror_primary_namespace_t;
typedef struct {
std::string primary_mirror_uuid;
uint64_t primary_snap_id;
bool copied;
- uint64_t copy_progress;
+ uint64_t last_copied_object_number;
} snap_mirror_non_primary_namespace_t;
typedef struct {
inline int operator()(
const cls::rbd::MirrorPrimarySnapshotNamespace& snap_namespace) {
mirror_snap->demoted = snap_namespace.demoted;
- mirror_snap->mirror_peers = snap_namespace.mirror_peers;
+ mirror_snap->mirror_peer_uuids = snap_namespace.mirror_peer_uuids;
return 0;
}
};
mirror_snap->primary_mirror_uuid = snap_namespace.primary_mirror_uuid;
mirror_snap->primary_snap_id = snap_namespace.primary_snap_id;
mirror_snap->copied = snap_namespace.copied;
- mirror_snap->copy_progress = snap_namespace.copy_progress;
+ mirror_snap->last_copied_object_number =
+ snap_namespace.last_copied_object_number;
return 0;
}
};
}
mirror_snap->demoted = mirror_namespace.demoted;
- mirror_snap->mirror_peers_count = mirror_namespace.mirror_peers.size();
+ mirror_snap->mirror_peer_uuids_count =
+ mirror_namespace.mirror_peer_uuids.size();
size_t len = 0;
- for (auto &peer : mirror_namespace.mirror_peers) {
+ for (auto &peer : mirror_namespace.mirror_peer_uuids) {
len += peer.size() + 1;
}
- mirror_snap->mirror_peers = (char *)malloc(len);
- char *p = mirror_snap->mirror_peers;
- for (auto &peer : mirror_namespace.mirror_peers) {
+ mirror_snap->mirror_peer_uuids = (char *)malloc(len);
+ char *p = mirror_snap->mirror_peer_uuids;
+ for (auto &peer : mirror_namespace.mirror_peer_uuids) {
strncpy(p, peer.c_str(), peer.size() + 1);
p += peer.size() + 1;
}
return -ERANGE;
}
- free(mirror_snap->mirror_peers);
+ free(mirror_snap->mirror_peer_uuids);
return 0;
}
}
mirror_snap->primary_mirror_uuid =
- strdup(mirror_namespace.primary_mirror_uuid.c_str());
+ strdup(mirror_namespace.primary_mirror_uuid.c_str());
mirror_snap->primary_snap_id = mirror_namespace.primary_snap_id;
mirror_snap->copied = mirror_namespace.copied;
- mirror_snap->copy_progress = mirror_namespace.copy_progress;
+ mirror_snap->last_copied_object_number =
+ mirror_namespace.last_copied_object_number;
return 0;
}
klass, &klass::handle_notify_mirroring_watcher>(this);
MirroringWatcher<>::notify_image_updated(m_io_ctx,
- cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
- m_image_id,
+ m_mirror_image.state, m_image_id,
m_mirror_image.global_image_id, ctx);
}
ctypedef struct rbd_snap_mirror_primary_namespace_t:
bint demoted
- size_t mirror_peers_count
- char *mirror_peers
+ size_t mirror_peer_uuids_count
+ char *mirror_peer_uuids
ctypedef struct rbd_snap_mirror_non_primary_namespace_t:
char *primary_mirror_uuid
uint64_t primary_snap_id
bint copied
- uint64_t copy_progress
+ uint64_t last_copied_object_number
ctypedef struct rbd_group_info_t:
char *name
* ``demoted`` (bool) - True if snapshot is in demoted state
- * ``mirror_peers`` (list) - mirror peer uuids
+ * ``mirror_peer_uuids`` (list) - mirror peer uuids
"""
cdef:
rbd_snap_mirror_primary_namespace_t sn
raise make_ex(ret, 'error getting snapshot mirror primary '
'namespace for image: %s, snap_id: %d' %
(self.name, snap_id))
- peers = []
- p = sn.mirror_peers
- for i in range(sn.mirror_peers_count):
- peer = decode_cstr(p)
- peers.append(peer)
- p += len(peer) + 1
+ uuids = []
+ cdef char *p = sn.mirror_peer_uuids
+ for i in range(sn.mirror_peer_uuids_count):
+ uuid = decode_cstr(p)
+ uuids.append(uuid)
+ p += len(uuid) + 1
info = {
'demoted' : sn.demoted,
- 'mirror_peers' : peers,
+ 'mirror_peer_uuids' : uuids,
}
rbd_snap_mirror_primary_namespace_cleanup(
&sn, sizeof(rbd_snap_mirror_primary_namespace_t))
* ``copied`` (bool) - True if snapsho is copied
- * ``copy_progress`` (int) - copy progress
+ * ``last_copied_object_number`` (int) - last copied object number
"""
cdef:
rbd_snap_mirror_non_primary_namespace_t sn
'primary_mirror_uuid' : decode_cstr(sn.primary_mirror_uuid),
'primary_snap_id' : sn.primary_snap_id,
'copied' : sn.copied,
- 'copy_progress' : sn.copy_progress,
+ 'last_copied_object_number' : sn.last_copied_object_number,
}
rbd_snap_mirror_non_primary_namespace_cleanup(
&sn, sizeof(rbd_snap_mirror_non_primary_namespace_t))
std::map<std::string, std::string> mirror_image_ids;
ASSERT_EQ(-ENOENT, mirror_image_list(&ioctx, "", 0, &mirror_image_ids));
- cls::rbd::MirrorImage image1("uuid1", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
- cls::rbd::MirrorImage image2("uuid2", cls::rbd::MIRROR_IMAGE_STATE_DISABLING);
- cls::rbd::MirrorImage image3("uuid3", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image1(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid1",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image2(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid2",
+ cls::rbd::MIRROR_IMAGE_STATE_DISABLING);
+ cls::rbd::MirrorImage image3(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid3",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id1", image1));
ASSERT_EQ(-ENOENT, mirror_image_set(&ioctx, "image_id2", image2));
// Test status set
- cls::rbd::MirrorImage image1("uuid1", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
- cls::rbd::MirrorImage image2("uuid2", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
- cls::rbd::MirrorImage image3("uuid3", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image1(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid1",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image2(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid2",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image3(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "uuid3",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id1", image1));
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id2", image2));
for (size_t i = 0; i < N; i++) {
std::string id = "id" + stringify(i);
std::string uuid = "uuid" + stringify(i);
- cls::rbd::MirrorImage image(uuid, cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
+ cls::rbd::MirrorImage image(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, uuid,
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
cls::rbd::MirrorImageSiteStatus status(
"", cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "");
ASSERT_EQ(0, mirror_image_set(&ioctx, id, image));
expect_snap_remove(mock_image_ctx, "snap 2", 0);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, false, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, false, 0);
C_SaferCond ctx;
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, -EBADMSG);
C_SaferCond ctx;
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, -ENOENT);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, false, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_snap_remove(mock_image_ctx, "snap 2", -EPERM);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_snap_remove(mock_image_ctx, "snap 2", 0);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_op_work_queue(mock_image_ctx);
InSequence seq;
- expect_get_mirror_image(mock_image_ctx,
- {"global id", cls::rbd::MIRROR_IMAGE_STATE_ENABLED},
- 0);
+ expect_get_mirror_image(
+ mock_image_ctx, {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "global id",
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, 0);
expect_is_tag_owner(mock_image_ctx, mock_journal, true, 0);
expect_set_mirror_image(mock_image_ctx, 0);
expect_notify_image_updated(mock_image_ctx, mock_mirroring_watcher,
expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
0);
expect_dir_get_name(m_local_io_ctx, "local image name", 0);
- expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
+ expect_mirror_image_get(m_local_io_ctx,
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
librbd::MockJournal mock_journal;
expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
0);
expect_dir_get_name(m_local_io_ctx, "local image name", 0);
- expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
+ expect_mirror_image_get(m_local_io_ctx,
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
librbd::MockJournal mock_journal;
using rbd::mirror::RadosRef;
using rbd::mirror::TestFixture;
using namespace librbd;
+using cls::rbd::MirrorImageMode;
using cls::rbd::MirrorImageState;
m_remote_mirror_uuid, true));
cls::rbd::MirrorImage mirror_image(
- GLOBAL_IMAGE_ID, MirrorImageState::MIRROR_IMAGE_STATE_ENABLED);
+ MirrorImageMode::MIRROR_IMAGE_MODE_JOURNAL, GLOBAL_IMAGE_ID,
+ MirrorImageState::MIRROR_IMAGE_STATE_ENABLED);
EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, m_local_image_id,
mirror_image));
}
GLOBAL_CLONE_IMAGE_ID, m_remote_mirror_uuid));
cls::rbd::MirrorImage mirror_image(
- GLOBAL_CLONE_IMAGE_ID, MirrorImageState::MIRROR_IMAGE_STATE_ENABLED);
+ MirrorImageMode::MIRROR_IMAGE_MODE_JOURNAL, GLOBAL_CLONE_IMAGE_ID,
+ MirrorImageState::MIRROR_IMAGE_STATE_ENABLED);
EXPECT_EQ(0, cls_client::mirror_image_set(&m_local_io_ctx, clone_id,
mirror_image));
EXPECT_EQ(0, ictx->state->close());
r = librbd::cls_client::mirror_image_get_finish(&iter, &mirror_image);
if (r == 0) {
if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
- send_is_tag_owner();
+ if (mirror_image.mode == cls::rbd::MIRROR_IMAGE_MODE_JOURNAL) {
+ send_is_tag_owner();
+ } else if (mirror_image.mode == cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT) {
+ // TODO: get primary state from mirroring snapshots
+ ceph_abort();
+ finish(0);
+ }
return;
} else if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_DISABLING) {
dout(5) << ": image mirroring is being disabled" << dendl;