cls_method_handle_t h_old_snapshot_add;
cls_method_handle_t h_old_snapshot_remove;
cls_method_handle_t h_old_snapshot_rename;
-cls_method_handle_t h_mirror_is_enabled;
-cls_method_handle_t h_mirror_set_enabled;
+cls_method_handle_t h_mirror_mode_get;
+cls_method_handle_t h_mirror_mode_set;
cls_method_handle_t h_mirror_peer_list;
cls_method_handle_t h_mirror_peer_add;
cls_method_handle_t h_mirror_peer_remove;
namespace mirror {
+static const std::string MODE("mirror_mode");
static const std::string PEER_KEY_PREFIX("mirror_peer_");
std::string peer_key(const std::string &uuid) {
return PEER_KEY_PREFIX + uuid;
}
-int is_enabled(cls_method_context_t hctx, bool *enabled) {
- bufferlist bl;
- int r = cls_cxx_map_get_val(hctx, "mirror_enabled", &bl);
- if (r < 0 && r != -ENOENT) {
- CLS_ERR("error reading mirror enabled flag: %s",
- cpp_strerror(r).c_str());
- return r;
- }
-
- if (r == 0) {
- try {
- bufferlist::iterator bl_it = bl.begin();
- ::decode(*enabled, bl_it);
- } catch (const buffer::error &err) {
- CLS_ERR("could not decode flag");
- return -EIO;
- }
- } else {
- *enabled = false;
- }
- return 0;
-}
-
int read_peers(cls_method_context_t hctx,
std::vector<cls::rbd::MirrorPeer> *peers) {
std::string last_read = PEER_KEY_PREFIX;
* none
*
* Output:
- * @param bool: true if enabled
+ * @param cls::rbd::MirrorMode (uint32_t)
* @returns 0 on success, negative error code on failure
*/
-int mirror_is_enabled(cls_method_context_t hctx, bufferlist *in,
- bufferlist *out) {
- bool enabled;
- int r = mirror::is_enabled(hctx, &enabled);
+int mirror_mode_get(cls_method_context_t hctx, bufferlist *in,
+ bufferlist *out) {
+ uint32_t mirror_mode_decode;
+ int r = read_key(hctx, mirror::MODE, &mirror_mode_decode);
if (r < 0) {
return r;
}
- ::encode(enabled, *out);
+ ::encode(mirror_mode_decode, *out);
return 0;
}
/**
* Input:
- * @param enabled (bool)
+ * @param mirror_mode (cls::rbd::MirrorMode) (uint32_t)
*
* Output:
* @returns 0 on success, negative error code on failure
*/
-int mirror_set_enabled(cls_method_context_t hctx, bufferlist *in,
- bufferlist *out) {
- bool enabled;
+int mirror_mode_set(cls_method_context_t hctx, bufferlist *in,
+ bufferlist *out) {
+ uint32_t mirror_mode_decode;
try {
bufferlist::iterator bl_it = in->begin();
- ::decode(enabled, bl_it);
+ ::decode(mirror_mode_decode, bl_it);
} catch (const buffer::error &err) {
return -EINVAL;
}
+ bool enabled;
+ switch (static_cast<cls::rbd::MirrorMode>(mirror_mode_decode)) {
+ case cls::rbd::MIRROR_MODE_DISABLED:
+ enabled = false;
+ break;
+ case cls::rbd::MIRROR_MODE_IMAGE:
+ case cls::rbd::MIRROR_MODE_POOL:
+ enabled = true;
+ break;
+ default:
+ CLS_ERR("invalid mirror mode: %d", mirror_mode_decode);
+ return -EINVAL;
+ }
+
int r;
if (enabled) {
bufferlist bl;
- ::encode(enabled, bl);
+ ::encode(mirror_mode_decode, bl);
- r = cls_cxx_map_set_val(hctx, "mirror_enabled", &bl);
+ r = cls_cxx_map_set_val(hctx, mirror::MODE, &bl);
if (r < 0) {
CLS_ERR("error enabling mirroring: %s", cpp_strerror(r).c_str());
return r;
return -EBUSY;
}
- r = cls_cxx_map_remove_key(hctx, "mirror_enabled");
+ r = cls_cxx_map_remove_key(hctx, mirror::MODE);
if (r < 0 && r != -ENOENT) {
CLS_ERR("error disabling mirroring: %s", cpp_strerror(r).c_str());
return r;
return -EINVAL;
}
- bool enabled;
- int r = mirror::is_enabled(hctx, &enabled);
- if (r < 0) {
+ uint32_t mirror_mode_decode;
+ int r = read_key(hctx, mirror::MODE, &mirror_mode_decode);
+ if (r < 0 && r != -ENOENT) {
return r;
- }
- if (!enabled) {
+ } else if (r == -ENOENT ||
+ mirror_mode_decode == cls::rbd::MIRROR_MODE_DISABLED) {
CLS_ERR("mirroring must be enabled on the pool");
return -EINVAL;
}
old_snapshot_rename, &h_old_snapshot_rename);
/* methods for the rbd_pool_settings object */
- cls_register_cxx_method(h_class, "mirror_is_enabled", CLS_METHOD_RD,
- mirror_is_enabled, &h_mirror_is_enabled);
- cls_register_cxx_method(h_class, "mirror_set_enabled",
+ cls_register_cxx_method(h_class, "mirror_mode_get", CLS_METHOD_RD,
+ mirror_mode_get, &h_mirror_mode_get);
+ cls_register_cxx_method(h_class, "mirror_mode_set",
CLS_METHOD_RD | CLS_METHOD_WR,
- mirror_set_enabled, &h_mirror_set_enabled);
+ mirror_mode_set, &h_mirror_mode_set);
cls_register_cxx_method(h_class, "mirror_peer_list", CLS_METHOD_RD,
mirror_peer_list, &h_mirror_peer_list);
cls_register_cxx_method(h_class, "mirror_peer_add",
return 0;
}
- int mirror_is_enabled(librados::IoCtx *ioctx, bool *enabled) {
+ int mirror_mode_get(librados::IoCtx *ioctx,
+ cls::rbd::MirrorMode *mirror_mode) {
bufferlist in_bl;
bufferlist out_bl;
- int r = ioctx->exec(RBD_POOL_SETTINGS, "rbd", "mirror_is_enabled", in_bl,
+ int r = ioctx->exec(RBD_POOL_SETTINGS, "rbd", "mirror_mode_get", in_bl,
out_bl);
if (r == -ENOENT) {
- *enabled = false;
+ *mirror_mode = cls::rbd::MIRROR_MODE_DISABLED;
return 0;
} else if (r < 0) {
return r;
try {
bufferlist::iterator bl_it = out_bl.begin();
- ::decode(*enabled, bl_it);
+ uint32_t mirror_mode_decode;
+ ::decode(mirror_mode_decode, bl_it);
+ *mirror_mode = static_cast<cls::rbd::MirrorMode>(mirror_mode_decode);
} catch (const buffer::error &err) {
return -EBADMSG;
}
return 0;
}
- int mirror_set_enabled(librados::IoCtx *ioctx, bool enabled) {
+ int mirror_mode_set(librados::IoCtx *ioctx,
+ cls::rbd::MirrorMode mirror_mode) {
bufferlist in_bl;
- ::encode(enabled, in_bl);
+ ::encode(static_cast<uint32_t>(mirror_mode), in_bl);
bufferlist out_bl;
- int r = ioctx->exec(RBD_POOL_SETTINGS, "rbd", "mirror_set_enabled", in_bl,
+ int r = ioctx->exec(RBD_POOL_SETTINGS, "rbd", "mirror_mode_set", in_bl,
out_bl);
if (r < 0) {
return r;
::SnapContext *snapc);
// operations on the rbd_pool_settings object
- int mirror_is_enabled(librados::IoCtx *ioctx, bool *enabled);
- int mirror_set_enabled(librados::IoCtx *ioctx, bool enabled);
+ int mirror_mode_get(librados::IoCtx *ioctx,
+ cls::rbd::MirrorMode *mirror_mode);
+ int mirror_mode_set(librados::IoCtx *ioctx,
+ cls::rbd::MirrorMode mirror_mode);
int mirror_peer_list(librados::IoCtx *ioctx,
std::vector<cls::rbd::MirrorPeer> *peers);
int mirror_peer_add(librados::IoCtx *ioctx, const std::string &cluster_uuid,
client_name == rhs.client_name);
}
+std::ostream& operator<<(std::ostream& os, const MirrorMode& mirror_mode) {
+ switch (mirror_mode) {
+ case MIRROR_MODE_DISABLED:
+ os << "disabled";
+ break;
+ case MIRROR_MODE_IMAGE:
+ os << "image";
+ break;
+ case MIRROR_MODE_POOL:
+ os << "pool";
+ break;
+ default:
+ os << "unknown (" << static_cast<uint32_t>(mirror_mode) << ")";
+ break;
+ }
+ return os;
+}
+
std::ostream& operator<<(std::ostream& os, const MirrorPeer& peer) {
os << "["
<< "cluster_uuid=" << peer.cluster_uuid << ", "
namespace cls {
namespace rbd {
+enum MirrorMode {
+ MIRROR_MODE_DISABLED = 0,
+ MIRROR_MODE_IMAGE = 1,
+ MIRROR_MODE_POOL = 2
+};
+
struct MirrorPeer {
MirrorPeer() {
}
bool operator==(const MirrorPeer &rhs) const;
};
+std::ostream& operator<<(std::ostream& os, const MirrorMode& mirror_mode);
std::ostream& operator<<(std::ostream& os, const MirrorPeer& peer);
WRITE_CLASS_ENCODER(MirrorPeer);
char parent_name[RBD_MAX_IMAGE_NAME_SIZE]; /* deprecated */
} rbd_image_info_t;
+typedef enum {
+ RBD_MIRROR_MODE_DISABLED, /* mirroring is disabled */
+ RBD_MIRROR_MODE_IMAGE, /* mirroring enabled on a per-image basis */
+ RBD_MIRROR_MODE_POOL /* mirroring enabled on all journaled images */
+} rbd_mirror_mode_t;
+
typedef struct {
char *cluster_uuid;
char *cluster_name;
const char *destname);
/* pool mirroring */
-CEPH_RBD_API int rbd_mirror_is_enabled(rados_ioctx_t io_ctx, bool *enabled);
-CEPH_RBD_API int rbd_mirror_set_enabled(rados_ioctx_t io_ctx, bool enabled);
+CEPH_RBD_API int rbd_mirror_mode_get(rados_ioctx_t io_ctx,
+ rbd_mirror_mode_t *mirror_mode);
+CEPH_RBD_API int rbd_mirror_mode_set(rados_ioctx_t io_ctx,
+ rbd_mirror_mode_t mirror_mode);
CEPH_RBD_API int rbd_mirror_peer_add(rados_ioctx_t io_ctx,
const char *cluster_uuid,
const char *cluster_name,
int rename(IoCtx& src_io_ctx, const char *srcname, const char *destname);
// RBD pool mirroring support functions
- int mirror_is_enabled(IoCtx& io_ctx, bool *enabled);
- int mirror_set_enabled(IoCtx& io_ctx, bool enabled);
+ int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode);
+ int mirror_mode_set(IoCtx& io_ctx, rbd_mirror_mode_t mirror_mode);
int mirror_peer_add(IoCtx& io_ctx, const std::string &cluster_uuid,
const std::string &cluster_name,
const std::string &client_name);
return cls_client::metadata_list(&ictx->md_ctx, ictx->header_oid, start, max, pairs);
}
- int mirror_is_enabled(IoCtx& io_ctx, bool *enabled) {
+ int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode) {
CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
ldout(cct, 20) << __func__ << dendl;
- int r = cls_client::mirror_is_enabled(&io_ctx, enabled);
+ cls::rbd::MirrorMode mirror_mode_internal;
+ int r = cls_client::mirror_mode_get(&io_ctx, &mirror_mode_internal);
if (r < 0) {
- lderr(cct) << "Failed to retrieve mirror flag: " << cpp_strerror(r)
+ lderr(cct) << "Failed to retrieve mirror mode: " << cpp_strerror(r)
<< dendl;
return r;
}
+
+ switch (mirror_mode_internal) {
+ case cls::rbd::MIRROR_MODE_DISABLED:
+ case cls::rbd::MIRROR_MODE_IMAGE:
+ case cls::rbd::MIRROR_MODE_POOL:
+ *mirror_mode = static_cast<rbd_mirror_mode_t>(mirror_mode_internal);
+ break;
+ default:
+ lderr(cct) << "Unknown mirror mode ("
+ << static_cast<uint32_t>(mirror_mode_internal) << ")"
+ << dendl;
+ return -EINVAL;
+ }
return 0;
}
- int mirror_set_enabled(IoCtx& io_ctx, bool enabled) {
+ int mirror_mode_set(IoCtx& io_ctx, rbd_mirror_mode_t mirror_mode) {
CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
- ldout(cct, 20) << __func__ << ": enabled=" << enabled << dendl;
+ ldout(cct, 20) << __func__ << dendl;
- int r = cls_client::mirror_set_enabled(&io_ctx, enabled);
- if (r < 0 && r != -ENOENT) {
- lderr(cct) << "Failed to set mirror flag: " << cpp_strerror(r) << dendl;
+ cls::rbd::MirrorMode mirror_mode_internal;
+ switch (mirror_mode) {
+ case RBD_MIRROR_MODE_DISABLED:
+ case RBD_MIRROR_MODE_IMAGE:
+ case RBD_MIRROR_MODE_POOL:
+ mirror_mode_internal = static_cast<cls::rbd::MirrorMode>(
+ mirror_mode);
+ break;
+ default:
+ lderr(cct) << "Unknown mirror mode ("
+ << static_cast<uint32_t>(mirror_mode) << ")" << dendl;
+ return -EINVAL;
+ }
+
+ int r = cls_client::mirror_mode_set(&io_ctx, mirror_mode_internal);
+ if (r < 0) {
+ lderr(cct) << "Failed to set mirror mode: " << cpp_strerror(r) << dendl;
return r;
}
return 0;
int metadata_set(ImageCtx *ictx, const std::string &key, const std::string &value);
int metadata_remove(ImageCtx *ictx, const std::string &key);
- int mirror_is_enabled(IoCtx& io_ctx, bool *enabled);
- int mirror_set_enabled(IoCtx& io_ctx, bool enabled);
+ int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode);
+ int mirror_mode_set(IoCtx& io_ctx, rbd_mirror_mode_t mirror_mode);
int mirror_peer_add(IoCtx& io_ctx, const std::string &cluster_uuid,
const std::string &cluster_name,
const std::string &client_name);
return r;
}
- int RBD::mirror_is_enabled(IoCtx& io_ctx, bool *enabled) {
- return librbd::mirror_is_enabled(io_ctx, enabled);
+ int RBD::mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode) {
+ return librbd::mirror_mode_get(io_ctx, mirror_mode);
}
- int RBD::mirror_set_enabled(IoCtx& io_ctx, bool enabled) {
- return librbd::mirror_set_enabled(io_ctx, enabled);
+ int RBD::mirror_mode_set(IoCtx& io_ctx, rbd_mirror_mode_t mirror_mode) {
+ return librbd::mirror_mode_set(io_ctx, mirror_mode);
}
int RBD::mirror_peer_add(IoCtx& io_ctx, const std::string &cluster_uuid,
}
/* pool mirroring */
-extern "C" int rbd_mirror_is_enabled(rados_ioctx_t p, bool *enabled) {
+extern "C" int rbd_mirror_mode_get(rados_ioctx_t p,
+ rbd_mirror_mode_t *mirror_mode) {
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
- int r = librbd::mirror_is_enabled(io_ctx, enabled);
- if (r < 0) {
- return r;
- }
- return 0;
+ return librbd::mirror_mode_get(io_ctx, mirror_mode);
}
-extern "C" int rbd_mirror_set_enabled(rados_ioctx_t p, bool enabled) {
+extern "C" int rbd_mirror_mode_set(rados_ioctx_t p,
+ rbd_mirror_mode_t mirror_mode) {
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
- return librbd::mirror_set_enabled(io_ctx, enabled);
+ return librbd::mirror_mode_set(io_ctx, mirror_mode);
}
extern "C" int rbd_mirror_peer_add(rados_ioctx_t p,
rbd help mirror pool enable
usage: rbd mirror pool enable [--pool <pool>]
- <pool-name>
+ <pool-name> <mode>
Enable RBD mirroring by default within a pool.
Positional arguments
<pool-name> pool name
+ <mode> mirror mode [image or pool]
Optional arguments
-p [ --pool ] arg pool name
$ rbd bench-write
rbd: image name was not specified
[22]
+ $ rbd mirror pool enable rbd
+ rbd: must specify 'image' or 'pool' mode.
+ [22]
+ $ rbd mirror pool peer add rbd
+ rbd: remote cluster was not specified
+ [22]
+ $ rbd mirror pool peer remove rbd
+ rbd: must specify cluster uuid
+ [22]
+
ASSERT_EQ(-EINVAL, mirror_peer_add(&ioctx, "uuid1", "cluster1", "client"));
- bool enabled;
- ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
- ASSERT_FALSE(enabled);
- ASSERT_EQ(0, mirror_set_enabled(&ioctx, true));
- ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
- ASSERT_TRUE(enabled);
+ cls::rbd::MirrorMode mirror_mode;
+ ASSERT_EQ(0, mirror_mode_get(&ioctx, &mirror_mode));
+ ASSERT_EQ(cls::rbd::MIRROR_MODE_DISABLED, mirror_mode);
+
+ ASSERT_EQ(0, mirror_mode_set(&ioctx, cls::rbd::MIRROR_MODE_IMAGE));
+ ASSERT_EQ(0, mirror_mode_get(&ioctx, &mirror_mode));
+ ASSERT_EQ(cls::rbd::MIRROR_MODE_IMAGE, mirror_mode);
+
+ ASSERT_EQ(0, mirror_mode_set(&ioctx, cls::rbd::MIRROR_MODE_POOL));
+ ASSERT_EQ(0, mirror_mode_get(&ioctx, &mirror_mode));
+ ASSERT_EQ(cls::rbd::MIRROR_MODE_POOL, mirror_mode);
ASSERT_EQ(0, mirror_peer_add(&ioctx, "uuid1", "cluster1", "client"));
ASSERT_EQ(0, mirror_peer_add(&ioctx, "uuid2", "cluster2", "admin"));
{"uuid1", "cluster1", "new client"},
{"uuid3", "new cluster", "admin"}};
ASSERT_EQ(expected_peers, peers);
- ASSERT_EQ(-EBUSY, mirror_set_enabled(&ioctx, false));
+ ASSERT_EQ(-EBUSY, mirror_mode_set(&ioctx, cls::rbd::MIRROR_MODE_DISABLED));
ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid3"));
ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid1"));
expected_peers = {};
ASSERT_EQ(expected_peers, peers);
- ASSERT_EQ(0, mirror_set_enabled(&ioctx, false));
- ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
- ASSERT_FALSE(enabled);
+ ASSERT_EQ(0, mirror_mode_set(&ioctx, cls::rbd::MIRROR_MODE_DISABLED));
+ ASSERT_EQ(0, mirror_mode_get(&ioctx, &mirror_mode));
+ ASSERT_EQ(cls::rbd::MIRROR_MODE_DISABLED, mirror_mode);
}
ASSERT_EQ(-EINVAL, rbd.mirror_peer_add(ioctx, "uuid1", "cluster1", "client"));
- bool enabled;
- ASSERT_EQ(0, rbd.mirror_is_enabled(ioctx, &enabled));
- ASSERT_FALSE(enabled);
- ASSERT_EQ(0, rbd.mirror_set_enabled(ioctx, true));
- ASSERT_EQ(0, rbd.mirror_is_enabled(ioctx, &enabled));
- ASSERT_TRUE(enabled);
+ rbd_mirror_mode_t mirror_mode;
+ ASSERT_EQ(0, rbd.mirror_mode_get(ioctx, &mirror_mode));
+ ASSERT_EQ(RBD_MIRROR_MODE_DISABLED, mirror_mode);
+
+ ASSERT_EQ(0, rbd.mirror_mode_set(ioctx, RBD_MIRROR_MODE_IMAGE));
+ ASSERT_EQ(0, rbd.mirror_mode_get(ioctx, &mirror_mode));
+ ASSERT_EQ(RBD_MIRROR_MODE_IMAGE, mirror_mode);
+
+ ASSERT_EQ(0, rbd.mirror_mode_set(ioctx, RBD_MIRROR_MODE_POOL));
+ ASSERT_EQ(0, rbd.mirror_mode_get(ioctx, &mirror_mode));
+ ASSERT_EQ(RBD_MIRROR_MODE_POOL, mirror_mode);
ASSERT_EQ(0, rbd.mirror_peer_add(ioctx, "uuid1", "cluster1", "client"));
ASSERT_EQ(0, rbd.mirror_peer_add(ioctx, "uuid2", "cluster2", "admin"));
{"uuid3", "new cluster", "admin"}};
ASSERT_EQ(expected_peers, peers);
- ASSERT_EQ(-EBUSY, rbd.mirror_set_enabled(ioctx, false));
+ ASSERT_EQ(-EBUSY, rbd.mirror_mode_set(ioctx, RBD_MIRROR_MODE_DISABLED));
}
if (enable_mirroring) {
librados::IoCtx ioctx;
ASSERT_EQ(0, m_cluster->ioctx_create2(pool_id, ioctx));
- ASSERT_EQ(0, librbd::mirror_set_enabled(ioctx, true));
+ ASSERT_EQ(0, librbd::mirror_mode_set(ioctx, RBD_MIRROR_MODE_POOL));
ASSERT_EQ(0, librbd::mirror_peer_add(ioctx, peer.cluster_uuid,
peer.cluster_name,
peer.client_name));
if (enable_mirroring) {
librados::IoCtx ioctx;
ASSERT_EQ(0, m_cluster->ioctx_create2(pool_id, ioctx));
- ASSERT_EQ(0, librbd::mirror_set_enabled(ioctx, true));
+ ASSERT_EQ(0, librbd::mirror_mode_set(ioctx, RBD_MIRROR_MODE_POOL));
ASSERT_EQ(0, librbd::mirror_peer_add(ioctx, peer.cluster_uuid,
peer.cluster_name,
peer.client_name));
return 0;
}
-void get_enable_disable_arguments(po::options_description *positional,
- po::options_description *options) {
+void get_disable_arguments(po::options_description *positional,
+ po::options_description *options) {
at::add_pool_options(positional, options);
}
-int execute_enable_disable(const po::variables_map &vm, bool enabled) {
- size_t arg_index = 0;
- std::string pool_name = utils::get_pool_name(vm, &arg_index);
+void get_enable_arguments(po::options_description *positional,
+ po::options_description *options) {
+ at::add_pool_options(positional, options);
+ positional->add_options()
+ ("mode", "mirror mode [image or pool]");
+}
+int execute_enable_disable(const std::string &pool_name,
+ rbd_mirror_mode_t mirror_mode) {
librados::Rados rados;
librados::IoCtx io_ctx;
int r = utils::init(pool_name, &rados, &io_ctx);
}
librbd::RBD rbd;
- r = rbd.mirror_set_enabled(io_ctx, enabled);
+ r = rbd.mirror_mode_set(io_ctx, mirror_mode);
if (r < 0) {
return r;
}
}
int execute_disable(const po::variables_map &vm) {
- return execute_enable_disable(vm, false);
+ size_t arg_index = 0;
+ std::string pool_name = utils::get_pool_name(vm, &arg_index);
+
+ return execute_enable_disable(pool_name, RBD_MIRROR_MODE_DISABLED);
}
int execute_enable(const po::variables_map &vm) {
- return execute_enable_disable(vm, true);
+ size_t arg_index = 0;
+ std::string pool_name = utils::get_pool_name(vm, &arg_index);
+
+ rbd_mirror_mode_t mirror_mode;
+ std::string mode = utils::get_positional_argument(vm, arg_index++);
+ if (mode == "image") {
+ mirror_mode = RBD_MIRROR_MODE_IMAGE;
+ } else if (mode == "pool") {
+ mirror_mode = RBD_MIRROR_MODE_POOL;
+ } else {
+ std::cerr << "rbd: must specify 'image' or 'pool' mode." << std::endl;
+ return -EINVAL;
+ }
+
+ return execute_enable_disable(pool_name, mirror_mode);
}
void get_info_arguments(po::options_description *positional,
}
librbd::RBD rbd;
- bool enabled;
- r = rbd.mirror_is_enabled(io_ctx, &enabled);
+ rbd_mirror_mode_t mirror_mode;
+ r = rbd.mirror_mode_get(io_ctx, &mirror_mode);
if (r < 0) {
return r;
}
return r;
}
+ std::string mirror_mode_desc;
+ switch (mirror_mode) {
+ case RBD_MIRROR_MODE_DISABLED:
+ mirror_mode_desc = "disabled";
+ break;
+ case RBD_MIRROR_MODE_IMAGE:
+ mirror_mode_desc = "image";
+ break;
+ case RBD_MIRROR_MODE_POOL:
+ mirror_mode_desc = "pool";
+ break;
+ default:
+ mirror_mode_desc = "unknown";
+ break;
+ }
+
if (formatter != nullptr) {
formatter->open_object_section("mirror");
- formatter->dump_bool("enabled", enabled);
+ formatter->dump_string("mode", mirror_mode_desc);
} else {
- std::cout << "Enabled: " << (enabled ? "true" : "false") << std::endl;
+ std::cout << "Mode: " << mirror_mode_desc << std::endl;
}
format_mirror_peers(config_path, formatter, mirror_peers);
Shell::Action action_disable(
{"mirror", "pool", "disable"}, {},
"Disable RBD mirroring by default within a pool.", "",
- &get_enable_disable_arguments, &execute_disable);
+ &get_disable_arguments, &execute_disable);
Shell::Action action_enable(
{"mirror", "pool", "enable"}, {},
"Enable RBD mirroring by default within a pool.", "",
- &get_enable_disable_arguments, &execute_enable);
+ &get_enable_arguments, &execute_enable);
Shell::Action action_info(
{"mirror", "pool", "info"}, {},
"Show information about the pool mirroring configuration.", {},
continue;
}
- bool enabled;
- r = librbd::mirror_is_enabled(ioctx, &enabled);
+ rbd_mirror_mode_t mirror_mode;
+ r = librbd::mirror_mode_get(ioctx, &mirror_mode);
if (r < 0) {
derr << "could not tell whether mirroring was enabled for " << pool_name
<< " : " << cpp_strerror(r) << dendl;
continue;
}
- if (!enabled) {
+ if (mirror_mode == RBD_MIRROR_MODE_DISABLED) {
dout(10) << "mirroring is disabled for pool " << pool_name << dendl;
continue;
}
// TODO: read mirrored images from mirroring settings object. For
// now just treat all images in a pool with mirroring enabled as mirrored
- bool enabled;
- r = librbd::mirror_is_enabled(ioctx, &enabled);
+ rbd_mirror_mode_t mirror_mode;
+ r = librbd::mirror_mode_get(ioctx, &mirror_mode);
if (r < 0) {
derr << "could not tell whether mirroring was enabled for " << pool_name
<< " : " << cpp_strerror(r) << dendl;
continue;
}
- if (!enabled) {
+ if (mirror_mode == RBD_MIRROR_MODE_DISABLED) {
dout(20) << "pool " << pool_name << " has mirroring disabled" << dendl;
continue;
}