OPTION(rbd_concurrent_management_ops, OPT_INT, 10) // how many operations can be in flight for a management operation like deleting or resizing an image
OPTION(rbd_balance_snap_reads, OPT_BOOL, false)
OPTION(rbd_localize_snap_reads, OPT_BOOL, false)
+OPTION(rbd_balance_parent_reads, OPT_BOOL, false)
+OPTION(rbd_localize_parent_reads, OPT_BOOL, true)
/*
* The following options change the behavior for librbd's image creation methods that
snap_lock("librbd::ImageCtx::snap_lock"),
parent_lock("librbd::ImageCtx::parent_lock"),
refresh_lock("librbd::ImageCtx::refresh_lock"),
+ extra_read_flags(0),
old_format(true),
order(0), size(0), features(0),
format_string(NULL),
delete perfcounter;
}
+ void ImageCtx::set_read_flag(unsigned flag) {
+ extra_read_flags |= flag;
+ }
+
int ImageCtx::get_read_flags(snap_t snap_id) {
- int flags = librados::OPERATION_NOFLAG;
+ int flags = librados::OPERATION_NOFLAG | extra_read_flags;
if (snap_id == LIBRADOS_SNAP_HEAD)
return flags;
RWLock parent_lock; // protects parent_md and parent
Mutex refresh_lock; // protects refresh_seq and last_refresh
+ unsigned extra_read_flags;
+
bool old_format;
uint8_t order;
uint64_t size;
void init_layout();
void perf_start(std::string name);
void perf_stop();
+ void set_read_flag(unsigned flag);
int get_read_flags(librados::snap_t snap_id);
int snap_set(std::string in_snap_name);
void snap_unset();
// since we don't know the image and snapshot name, set their ids and
// reset the snap_name and snap_exists fields after we read the header
ictx->parent = new ImageCtx("", parent_image_id, NULL, p_ioctx, true);
+
+ // set rados flags for reading the parent image
+ if (ictx->cct->_conf->rbd_balance_parent_reads)
+ ictx->parent->set_read_flag(librados::OPERATION_BALANCE_READS);
+ else if (ictx->cct->_conf->rbd_localize_parent_reads)
+ ictx->parent->set_read_flag(librados::OPERATION_LOCALIZE_READS);
+
r = open_image(ictx->parent);
if (r < 0) {
lderr(ictx->cct) << "error opening parent image: " << cpp_strerror(r)