}
int image_status_set(cls_method_context_t hctx, const string &global_image_id,
- const cls::rbd::MirrorImageStatus &status) {
- cls::rbd::MirrorImageStatusOnDisk ondisk_status(status);
+ const cls::rbd::MirrorImageSiteStatus &status) {
+ cls::rbd::MirrorImageSiteStatusOnDisk ondisk_status(status);
ondisk_status.up = false;
ondisk_status.last_update = ceph_clock_now();
return r;
}
- cls::rbd::MirrorImageStatusOnDisk ondisk_status;
+ cls::rbd::MirrorImageSiteStatusOnDisk ondisk_status;
try {
auto it = bl.cbegin();
decode(ondisk_status, it);
return -EIO;
}
-
- *status = static_cast<cls::rbd::MirrorImageStatus>(ondisk_status);
- status->up = (watchers.find(ondisk_status.origin) != watchers.end());
+ ondisk_status.fsid = cls::rbd::MirrorImageSiteStatus::LOCAL_FSID;
+ ondisk_status.up = (watchers.find(ondisk_status.origin) != watchers.end());
+ *status = {{ondisk_status}};
return 0;
}
cls::rbd::MirrorImageStatus status;
image_status_get(hctx, mirror_image.global_image_id, watchers, &status);
- cls::rbd::MirrorImageStatusState state = status.up ? status.state :
- cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN;
+ cls::rbd::MirrorImageSiteStatus local_status;
+ r = status.get_local_mirror_image_site_status(&local_status);
+ cls::rbd::MirrorImageStatusState state = (r >= 0 && local_status.up ?
+ local_status.state : cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN);
(*states)[state]++;
}
break;
}
- cls::rbd::MirrorImageStatusOnDisk status;
+ cls::rbd::MirrorImageSiteStatusOnDisk status;
try {
auto it = list_it.second.cbegin();
status.decode_meta(it);
return r;
}
- cls::rbd::MirrorImageStatusOnDisk ondisk_status;
+ cls::rbd::MirrorImageSiteStatusOnDisk ondisk_status;
try {
auto it = bl.cbegin();
decode(ondisk_status, it);
/**
* Input:
* @param global_image_id (std::string)
- * @param status (cls::rbd::MirrorImageStatus)
+ * @param status (cls::rbd::MirrorImageSiteStatus)
*
* Output:
* @returns 0 on success, negative error code on failure
int mirror_image_status_set(cls_method_context_t hctx, bufferlist *in,
bufferlist *out) {
string global_image_id;
- cls::rbd::MirrorImageStatus status;
+ cls::rbd::MirrorImageSiteStatus status;
try {
auto it = in->cbegin();
decode(global_image_id, it);
int mirror_image_status_set(librados::IoCtx *ioctx,
const std::string &global_image_id,
- const cls::rbd::MirrorImageStatus &status) {
+ const cls::rbd::MirrorImageSiteStatus &status) {
librados::ObjectWriteOperation op;
mirror_image_status_set(&op, global_image_id, status);
return ioctx->operate(RBD_MIRRORING, &op);
void mirror_image_status_set(librados::ObjectWriteOperation *op,
const std::string &global_image_id,
- const cls::rbd::MirrorImageStatus &status) {
+ const cls::rbd::MirrorImageSiteStatus &status) {
bufferlist bl;
encode(global_image_id, bl);
encode(status, bl);
const std::string &image_id);
int mirror_image_status_set(librados::IoCtx *ioctx,
const std::string &global_image_id,
- const cls::rbd::MirrorImageStatus &status);
+ const cls::rbd::MirrorImageSiteStatus &status);
void mirror_image_status_set(librados::ObjectWriteOperation *op,
const std::string &global_image_id,
- const cls::rbd::MirrorImageStatus &status);
+ const cls::rbd::MirrorImageSiteStatus &status);
int mirror_image_status_get(librados::IoCtx *ioctx,
const std::string &global_image_id,
cls::rbd::MirrorImageStatus *status);
return os;
}
-void MirrorImageStatus::encode(bufferlist &bl) const {
- ENCODE_START(1, 1, bl);
- encode(state, bl);
- encode(description, bl);
- encode(last_update, bl);
- encode(up, bl);
+const std::string MirrorImageSiteStatus::LOCAL_FSID(""); // empty fsid
+
+void MirrorImageSiteStatus::encode_meta(uint8_t version, bufferlist &bl) const {
+ if (version >= 2) {
+ ceph::encode(fsid, bl);
+ }
+ cls::rbd::encode(state, bl);
+ ceph::encode(description, bl);
+ ceph::encode(last_update, bl);
+ ceph::encode(up, bl);
+}
+
+void MirrorImageSiteStatus::decode_meta(uint8_t version,
+ bufferlist::const_iterator &it) {
+ if (version < 2) {
+ fsid = LOCAL_FSID;
+ } else {
+ ceph::decode(fsid, it);
+ }
+
+ cls::rbd::decode(state, it);
+ ceph::decode(description, it);
+ ::decode(last_update, it);
+ ceph::decode(up, it);
+}
+
+void MirrorImageSiteStatus::encode(bufferlist &bl) const {
+ // break compatibility when site-name is provided
+ uint8_t version = (fsid == LOCAL_FSID ? 1 : 2);
+ ENCODE_START(version, version, bl);
+ encode_meta(version, bl);
ENCODE_FINISH(bl);
}
-void MirrorImageStatus::decode(bufferlist::const_iterator &it) {
- DECODE_START(1, it);
- decode(state, it);
- decode(description, it);
- decode(last_update, it);
- decode(up, it);
+void MirrorImageSiteStatus::decode(bufferlist::const_iterator &it) {
+ DECODE_START(2, it);
+ decode_meta(struct_v, it);
DECODE_FINISH(it);
}
-void MirrorImageStatus::dump(Formatter *f) const {
+void MirrorImageSiteStatus::dump(Formatter *f) const {
f->dump_string("state", state_to_string());
f->dump_string("description", description);
f->dump_stream("last_update") << last_update;
}
-std::string MirrorImageStatus::state_to_string() const {
+std::string MirrorImageSiteStatus::state_to_string() const {
std::stringstream ss;
ss << (up ? "up+" : "down+") << state;
return ss.str();
}
-void MirrorImageStatus::generate_test_instances(
- std::list<MirrorImageStatus*> &o) {
- o.push_back(new MirrorImageStatus());
- o.push_back(new MirrorImageStatus(MIRROR_IMAGE_STATUS_STATE_REPLAYING));
- o.push_back(new MirrorImageStatus(MIRROR_IMAGE_STATUS_STATE_ERROR, "error"));
+void MirrorImageSiteStatus::generate_test_instances(
+ std::list<MirrorImageSiteStatus*> &o) {
+ o.push_back(new MirrorImageSiteStatus());
+ o.push_back(new MirrorImageSiteStatus("", MIRROR_IMAGE_STATUS_STATE_REPLAYING,
+ ""));
+ o.push_back(new MirrorImageSiteStatus("", MIRROR_IMAGE_STATUS_STATE_ERROR,
+ "error"));
+ o.push_back(new MirrorImageSiteStatus("2fb68ca9-1ba0-43b3-8cdf-8c5a9db71e65",
+ MIRROR_IMAGE_STATUS_STATE_STOPPED, ""));
}
-bool MirrorImageStatus::operator==(const MirrorImageStatus &rhs) const {
+bool MirrorImageSiteStatus::operator==(const MirrorImageSiteStatus &rhs) const {
return state == rhs.state && description == rhs.description && up == rhs.up;
}
-std::ostream& operator<<(std::ostream& os, const MirrorImageStatus& status) {
- os << "["
+std::ostream& operator<<(std::ostream& os,
+ const MirrorImageSiteStatus& status) {
+ os << "{"
<< "state=" << status.state_to_string() << ", "
<< "description=" << status.description << ", "
- << "last_update=" << status.last_update << "]";
+ << "last_update=" << status.last_update << "]}";
return os;
}
-void MirrorImageStatusOnDisk::encode_meta(bufferlist &bl,
- uint64_t features) const {
+void MirrorImageSiteStatusOnDisk::encode_meta(bufferlist &bl,
+ uint64_t features) const {
ENCODE_START(1, 1, bl);
encode(origin, bl, features);
ENCODE_FINISH(bl);
}
-void MirrorImageStatusOnDisk::encode(bufferlist &bl, uint64_t features) const {
+void MirrorImageSiteStatusOnDisk::encode(bufferlist &bl,
+ uint64_t features) const {
encode_meta(bl, features);
- cls::rbd::MirrorImageStatus::encode(bl);
+ cls::rbd::MirrorImageSiteStatus::encode(bl);
}
-void MirrorImageStatusOnDisk::decode_meta(bufferlist::const_iterator &it) {
+void MirrorImageSiteStatusOnDisk::decode_meta(bufferlist::const_iterator &it) {
DECODE_START(1, it);
decode(origin, it);
DECODE_FINISH(it);
}
-void MirrorImageStatusOnDisk::decode(bufferlist::const_iterator &it) {
+void MirrorImageSiteStatusOnDisk::decode(bufferlist::const_iterator &it) {
decode_meta(it);
- cls::rbd::MirrorImageStatus::decode(it);
+ cls::rbd::MirrorImageSiteStatus::decode(it);
+}
+
+void MirrorImageSiteStatusOnDisk::generate_test_instances(
+ std::list<MirrorImageSiteStatusOnDisk*> &o) {
+ o.push_back(new MirrorImageSiteStatusOnDisk());
+ o.push_back(new MirrorImageSiteStatusOnDisk(
+ {"", MIRROR_IMAGE_STATUS_STATE_ERROR, "error"}));
+ o.push_back(new MirrorImageSiteStatusOnDisk(
+ {"siteA", MIRROR_IMAGE_STATUS_STATE_STOPPED, ""}));
+}
+
+int MirrorImageStatus::get_local_mirror_image_site_status(
+ MirrorImageSiteStatus* status) const {
+ auto it = std::find_if(
+ mirror_image_site_statuses.begin(),
+ mirror_image_site_statuses.end(),
+ [](const MirrorImageSiteStatus& status) {
+ return status.fsid == MirrorImageSiteStatus::LOCAL_FSID;
+ });
+ if (it == mirror_image_site_statuses.end()) {
+ return -ENOENT;
+ }
+
+ *status = *it;
+ return 0;
}
-void MirrorImageStatusOnDisk::generate_test_instances(
- std::list<MirrorImageStatusOnDisk*> &o) {
- o.push_back(new MirrorImageStatusOnDisk());
- o.push_back(new MirrorImageStatusOnDisk(
- {MIRROR_IMAGE_STATUS_STATE_ERROR, "error"}));
+void MirrorImageStatus::encode(bufferlist &bl) const {
+ // don't break compatibility for extra site statuses
+ ENCODE_START(2, 1, bl);
+
+ // local site status
+ MirrorImageSiteStatus local_status;
+ int r = get_local_mirror_image_site_status(&local_status);
+ local_status.encode_meta(1, bl);
+
+ bool local_status_valid = (r >= 0);
+ encode(local_status_valid, bl);
+
+ // remote site statuses
+ __u32 n = mirror_image_site_statuses.size();
+ if (local_status_valid) {
+ --n;
+ }
+ encode(n, bl);
+
+ for (auto& status : mirror_image_site_statuses) {
+ if (status.fsid == MirrorImageSiteStatus::LOCAL_FSID) {
+ continue;
+ }
+ status.encode_meta(2, bl);
+ }
+ ENCODE_FINISH(bl);
+}
+
+void MirrorImageStatus::decode(bufferlist::const_iterator &it) {
+ DECODE_START(2, it);
+
+ // local site status
+ MirrorImageSiteStatus local_status;
+ local_status.decode_meta(1, it);
+
+ if (struct_v < 2) {
+ mirror_image_site_statuses.push_back(local_status);
+ } else {
+ bool local_status_valid;
+ decode(local_status_valid, it);
+
+ __u32 n;
+ decode(n, it);
+ if (local_status_valid) {
+ ++n;
+ }
+
+ mirror_image_site_statuses.resize(n);
+ for (auto status_it = mirror_image_site_statuses.begin();
+ status_it != mirror_image_site_statuses.end(); ++status_it) {
+ if (local_status_valid &&
+ status_it == mirror_image_site_statuses.begin()) {
+ *status_it = local_status;
+ continue;
+ }
+
+ // remote site status
+ status_it->decode_meta(struct_v, it);
+ }
+ }
+ DECODE_FINISH(it);
+}
+
+void MirrorImageStatus::dump(Formatter *f) const {
+ MirrorImageSiteStatus local_status;
+ int r = get_local_mirror_image_site_status(&local_status);
+ if (r >= 0) {
+ local_status.dump(f);
+ }
+
+ f->open_array_section("remotes");
+ for (auto& status : mirror_image_site_statuses) {
+ if (status.fsid == MirrorImageSiteStatus::LOCAL_FSID) {
+ continue;
+ }
+
+ f->open_object_section("remote");
+ status.dump(f);
+ f->close_section();
+ }
+ f->close_section();
+}
+
+bool MirrorImageStatus::operator==(const MirrorImageStatus &rhs) const {
+ return (mirror_image_site_statuses == rhs.mirror_image_site_statuses);
+}
+
+void MirrorImageStatus::generate_test_instances(
+ std::list<MirrorImageStatus*> &o) {
+ o.push_back(new MirrorImageStatus());
+ o.push_back(new MirrorImageStatus({{"", MIRROR_IMAGE_STATUS_STATE_ERROR, ""}}));
+ o.push_back(new MirrorImageStatus({{"", MIRROR_IMAGE_STATUS_STATE_STOPPED, ""},
+ {"siteA", MIRROR_IMAGE_STATUS_STATE_REPLAYING, ""}}));
+}
+
+std::ostream& operator<<(std::ostream& os,
+ const MirrorImageStatus& status) {
+ os << "{";
+ MirrorImageSiteStatus local_status;
+ int r = status.get_local_mirror_image_site_status(&local_status);
+ if (r >= 0) {
+ os << "state=" << local_status.state_to_string() << ", "
+ << "description=" << local_status.description << ", "
+ << "last_update=" << local_status.last_update << ", ";
+ }
+
+ os << "remotes=[";
+ for (auto& remote_status : status.mirror_image_site_statuses) {
+ if (remote_status.fsid == MirrorImageSiteStatus::LOCAL_FSID) {
+ continue;
+ }
+
+ os << "{"
+ << "fsid=" << remote_status.fsid << ", "
+ << "state=" << remote_status.state_to_string() << ", "
+ << "description=" << remote_status.description << ", "
+ << "last_update=" << remote_status.last_update
+ << "}";
+ }
+ os << "]}";
+ return os;
}
void ParentImageSpec::encode(bufferlist& bl) const {
encode(static_cast<uint8_t>(state), bl);
}
-inline void decode(MirrorImageStatusState &state, bufferlist::const_iterator& it)
+inline void decode(MirrorImageStatusState &state,
+ bufferlist::const_iterator& it)
{
uint8_t int_state;
using ceph::decode;
std::ostream& operator<<(std::ostream& os, const MirrorImageStatusState& state);
-struct MirrorImageStatus {
- MirrorImageStatus() {}
- MirrorImageStatus(MirrorImageStatusState state,
- const std::string &description = "")
- : state(state), description(description) {}
+struct MirrorImageSiteStatus {
+ static const std::string LOCAL_FSID;
+
+ MirrorImageSiteStatus() {}
+ MirrorImageSiteStatus(const std::string& fsid,
+ MirrorImageStatusState state,
+ const std::string &description)
+ : fsid(fsid), state(state), description(description) {
+ }
+ std::string fsid = LOCAL_FSID;
MirrorImageStatusState state = MIRROR_IMAGE_STATUS_STATE_UNKNOWN;
std::string description;
utime_t last_update;
bool up = false;
+ void encode_meta(uint8_t version, bufferlist &bl) const;
+ void decode_meta(uint8_t version, bufferlist::const_iterator &it);
+
void encode(bufferlist &bl) const;
void decode(bufferlist::const_iterator &it);
void dump(Formatter *f) const;
std::string state_to_string() const;
- static void generate_test_instances(std::list<MirrorImageStatus*> &o);
+ bool operator==(const MirrorImageSiteStatus &rhs) const;
- bool operator==(const MirrorImageStatus &rhs) const;
+ static void generate_test_instances(std::list<MirrorImageSiteStatus*> &o);
};
+WRITE_CLASS_ENCODER(MirrorImageSiteStatus);
-std::ostream& operator<<(std::ostream& os, const MirrorImageStatus& status);
-
-WRITE_CLASS_ENCODER(MirrorImageStatus);
+std::ostream& operator<<(std::ostream& os, const MirrorImageSiteStatus& status);
-struct MirrorImageStatusOnDisk : cls::rbd::MirrorImageStatus {
+struct MirrorImageSiteStatusOnDisk : cls::rbd::MirrorImageSiteStatus {
entity_inst_t origin;
- MirrorImageStatusOnDisk() {
+ MirrorImageSiteStatusOnDisk() {
}
- MirrorImageStatusOnDisk(const cls::rbd::MirrorImageStatus &status) :
- cls::rbd::MirrorImageStatus(status) {
+ MirrorImageSiteStatusOnDisk(const cls::rbd::MirrorImageSiteStatus &status) :
+ cls::rbd::MirrorImageSiteStatus(status) {
}
void encode_meta(bufferlist &bl, uint64_t features) const;
void encode(bufferlist &bl, uint64_t features) const;
void decode(bufferlist::const_iterator &it);
- static void generate_test_instances(std::list<MirrorImageStatusOnDisk*> &o);
+ static void generate_test_instances(
+ std::list<MirrorImageSiteStatusOnDisk*> &o);
};
-WRITE_CLASS_ENCODER_FEATURES(MirrorImageStatusOnDisk)
+WRITE_CLASS_ENCODER_FEATURES(MirrorImageSiteStatusOnDisk)
+
+struct MirrorImageStatus {
+ typedef std::list<MirrorImageSiteStatus> MirrorImageSiteStatuses;
+
+ MirrorImageStatus() {}
+ MirrorImageStatus(const MirrorImageSiteStatuses& statuses)
+ : mirror_image_site_statuses(statuses) {
+ }
+
+ MirrorImageSiteStatuses mirror_image_site_statuses;
+
+ int get_local_mirror_image_site_status(MirrorImageSiteStatus* status) const;
+
+ void encode(bufferlist &bl) const;
+ void decode(bufferlist::const_iterator &it);
+ void dump(Formatter *f) const;
+
+ bool operator==(const MirrorImageStatus& rhs) const;
+
+ static void generate_test_instances(std::list<MirrorImageStatus*> &o);
+};
+WRITE_CLASS_ENCODER(MirrorImageStatus);
+
+std::ostream& operator<<(std::ostream& os, const MirrorImageStatus& status);
struct ParentImageSpec {
int64_t pool_id = -1;
}
mirror_image_status->name = image_name;
+
+ cls::rbd::MirrorImageSiteStatus local_status;
+ r = mirror_image_status_internal.get_local_mirror_image_site_status(
+ &local_status);
+ if (r < 0) {
+ on_finish->complete(r);
+ return;
+ }
+
mirror_image_status->state = static_cast<mirror_image_status_state_t>(
- mirror_image_status_internal.state);
- mirror_image_status->description = mirror_image_status_internal.description;
- mirror_image_status->last_update =
- mirror_image_status_internal.last_update.sec();
- mirror_image_status->up = mirror_image_status_internal.up;
+ local_status.state);
+ mirror_image_status->description = local_status.description;
+ mirror_image_status->last_update = local_status.last_update.sec();
+ mirror_image_status->up = local_status.up;
C_ImageGetInfo::finish(0);
}
};
return r;
}
- cls::rbd::MirrorImageStatus unknown_status(
+ cls::rbd::MirrorImageSiteStatus unknown_status(
+ cls::rbd::MirrorImageSiteStatus::LOCAL_FSID,
cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "status not found");
for (auto it = images_.begin(); it != images_.end(); ++it) {
<< "using image id as name" << dendl;
image_name = image_id;
}
+
+ auto s = unknown_status;
auto s_it = statuses_.find(image_id);
- auto &s = s_it != statuses_.end() ? s_it->second : unknown_status;
+ if (s_it != statuses_.end()) {
+ s_it->second.get_local_mirror_image_site_status(&s);
+ }
+
(*images)[image_id] = mirror_image_status_t{
image_name,
mirror_image_info_t{
template <typename I>
void GetStatusRequest<I>::send() {
*m_mirror_image_status = cls::rbd::MirrorImageStatus(
- cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "status not found");
+ {{cls::rbd::MirrorImageSiteStatus::LOCAL_FSID,
+ cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "status not found"}});
get_info();
}
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id2", image2));
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id3", image3));
- cls::rbd::MirrorImageStatus status1(cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN);
- cls::rbd::MirrorImageStatus status2(cls::rbd::MIRROR_IMAGE_STATUS_STATE_REPLAYING);
- cls::rbd::MirrorImageStatus status3(cls::rbd::MIRROR_IMAGE_STATUS_STATE_ERROR);
+ cls::rbd::MirrorImageSiteStatus status1(
+ "", cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "");
+ cls::rbd::MirrorImageSiteStatus status2(
+ "", cls::rbd::MIRROR_IMAGE_STATUS_STATE_REPLAYING, "");
+ cls::rbd::MirrorImageSiteStatus status3(
+ "", cls::rbd::MIRROR_IMAGE_STATUS_STATE_ERROR, "");
ASSERT_EQ(0, mirror_image_status_set(&ioctx, "uuid1", status1));
images.clear();
// Test status is down due to RBD_MIRRORING is not watched
status1.up = false;
- ASSERT_EQ(statuses["image_id1"], status1);
+ ASSERT_EQ(statuses["image_id1"], cls::rbd::MirrorImageStatus{{status1}});
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid1", &read_status));
- ASSERT_EQ(read_status, status1);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status1}});
// Test status summary. All statuses are unknown due to down.
states.clear();
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid1", &read_status));
status1.up = true;
- ASSERT_EQ(read_status, status1);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status1}});
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid2", &read_status));
status2.up = true;
- ASSERT_EQ(read_status, status2);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status2}});
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid3", &read_status));
status3.up = true;
- ASSERT_EQ(read_status, status3);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status3}});
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, "", 1024, &images, &statuses));
ASSERT_EQ(3U, images.size());
ASSERT_EQ(3U, statuses.size());
- ASSERT_EQ(statuses["image_id1"], status1);
- ASSERT_EQ(statuses["image_id2"], status2);
- ASSERT_EQ(statuses["image_id3"], status3);
+ ASSERT_EQ(statuses["image_id1"], cls::rbd::MirrorImageStatus{{status1}});
+ ASSERT_EQ(statuses["image_id2"], cls::rbd::MirrorImageStatus{{status2}});
+ ASSERT_EQ(statuses["image_id3"], cls::rbd::MirrorImageStatus{{status3}});
read_instance = {};
ASSERT_EQ(0, mirror_image_instance_get(&ioctx, "uuid1", &read_instance));
ASSERT_EQ(0, mirror_image_status_remove_down(&ioctx));
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid1", &read_status));
- ASSERT_EQ(read_status, status1);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status1}});
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, "", 1024, &images, &statuses));
ASSERT_EQ(3U, images.size());
ASSERT_EQ(3U, statuses.size());
- ASSERT_EQ(statuses["image_id1"], status1);
- ASSERT_EQ(statuses["image_id2"], status2);
- ASSERT_EQ(statuses["image_id3"], status3);
+ ASSERT_EQ(statuses["image_id1"], cls::rbd::MirrorImageStatus{{status1}});
+ ASSERT_EQ(statuses["image_id2"], cls::rbd::MirrorImageStatus{{status2}});
+ ASSERT_EQ(statuses["image_id3"], cls::rbd::MirrorImageStatus{{status3}});
states.clear();
ASSERT_EQ(0, mirror_image_status_get_summary(&ioctx, &states));
ASSERT_EQ(0, mirror_image_status_set(&ioctx, "uuid1", status1));
ASSERT_EQ(0, mirror_image_status_set(&ioctx, "uuid3", status3));
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid3", &read_status));
- ASSERT_EQ(read_status, status3);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status3}});
states.clear();
ASSERT_EQ(0, mirror_image_status_get_summary(&ioctx, &states));
ASSERT_EQ(0, mirror_image_status_list(&ioctx, "", 1024, &images, &statuses));
ASSERT_EQ(3U, images.size());
ASSERT_EQ(3U, statuses.size());
- ASSERT_EQ(statuses["image_id1"], status1);
- ASSERT_EQ(statuses["image_id2"], status2);
- ASSERT_EQ(statuses["image_id3"], status3);
+ ASSERT_EQ(statuses["image_id1"], cls::rbd::MirrorImageStatus{{status1}});
+ ASSERT_EQ(statuses["image_id2"], cls::rbd::MirrorImageStatus{{status2}});
+ ASSERT_EQ(statuses["image_id3"], cls::rbd::MirrorImageStatus{{status3}});
ioctx.unwatch2(watch_handle);
ASSERT_EQ(3U, images.size());
ASSERT_EQ(3U, statuses.size());
status1.up = false;
- ASSERT_EQ(statuses["image_id1"], status1);
+ ASSERT_EQ(statuses["image_id1"], cls::rbd::MirrorImageStatus{{status1}});
status2.up = false;
- ASSERT_EQ(statuses["image_id2"], status2);
+ ASSERT_EQ(statuses["image_id2"], cls::rbd::MirrorImageStatus{{status2}});
status3.up = false;
- ASSERT_EQ(statuses["image_id3"], status3);
+ ASSERT_EQ(statuses["image_id3"], cls::rbd::MirrorImageStatus{{status3}});
ASSERT_EQ(0, mirror_image_status_get(&ioctx, "uuid1", &read_status));
- ASSERT_EQ(read_status, status1);
+ ASSERT_EQ(read_status, cls::rbd::MirrorImageStatus{{status1}});
states.clear();
ASSERT_EQ(0, mirror_image_status_get_summary(&ioctx, &states));
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::MirrorImageStatus status(cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN);
+ cls::rbd::MirrorImageSiteStatus status(
+ "", cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN, "");
ASSERT_EQ(0, mirror_image_set(&ioctx, id, image));
ASSERT_EQ(0, mirror_image_status_set(&ioctx, uuid, status));
}
TYPE(cls::rbd::MirrorImage)
TYPE(cls::rbd::MirrorImageMap)
TYPE(cls::rbd::MirrorImageStatus)
-TYPE_FEATUREFUL(cls::rbd::MirrorImageStatusOnDisk)
+TYPE(cls::rbd::MirrorImageSiteStatus)
+TYPE_FEATUREFUL(cls::rbd::MirrorImageSiteStatusOnDisk)
TYPE(cls::rbd::GroupImageSpec)
TYPE(cls::rbd::GroupImageStatus)
TYPE(cls::rbd::GroupSnapshot)
state = *opt_state;
}
- cls::rbd::MirrorImageStatus status;
+ cls::rbd::MirrorImageSiteStatus status;
status.up = true;
switch (state) {
case STATE_STARTING: