return stripe_count * (1ull << order);
}
- uint64_t ImageCtx::get_num_objects() const
- {
- uint64_t period = get_stripe_period();
- uint64_t num_periods = (size + period - 1) / period;
- return num_periods * stripe_count;
- }
-
int ImageCtx::is_snap_protected(snap_t in_snap_id,
bool *is_protected) const
{
uint64_t get_current_size() const;
uint64_t get_object_size() const;
string get_object_name(uint64_t num) const;
- uint64_t get_num_objects() const;
uint64_t get_stripe_unit() const;
uint64_t get_stripe_count() const;
uint64_t get_stripe_period() const;
ictx->snap_lock.put_read();
ictx->md_lock.put_read();
info.obj_size = 1ULL << obj_order;
- info.num_objs = rbd_howmany(info.size, ictx->get_object_size());
+ info.num_objs = Striper::get_num_objects(ictx->layout, info.size);
info.order = obj_order;
memcpy(&info.block_name_prefix, ictx->object_prefix.c_str(),
min((size_t)RBD_MAX_BLOCK_NAME_SIZE,
uint64_t delete_off = MIN(num_period * period, size);
// first object we can delete free and clear
uint64_t delete_start = num_period * ictx->get_stripe_count();
- uint64_t num_objects = ictx->get_num_objects();
+ uint64_t num_objects = Striper::get_num_objects(ictx->layout, size);
uint64_t object_size = ictx->get_object_size();
ldout(cct, 10) << "trim_image " << size << " -> " << newsize
int rollback_image(ImageCtx *ictx, uint64_t snap_id,
ProgressContext& prog_ctx)
{
- uint64_t numseg = ictx->get_num_objects();
+ uint64_t numseg = Striper::get_num_objects(ictx->layout, ictx->get_current_size());
uint64_t bsize = ictx->get_object_size();
int r;
CephContext *cct = ictx->cct;
}
uint64_t object_size;
- uint64_t period;
uint64_t overlap;
- uint64_t overlap_periods;
uint64_t overlap_objects;
::SnapContext snapc;
assert(ictx->parent_md.overlap <= ictx->size);
object_size = ictx->get_object_size();
- period = ictx->get_stripe_period();
overlap = ictx->parent_md.overlap;
- overlap_periods = (overlap + period - 1) / period;
- overlap_objects = overlap_periods * ictx->get_stripe_count();
+ overlap_objects = Striper::get_num_objects(ictx->layout, overlap);
}
SimpleThrottle throttle(cct->_conf->rbd_concurrent_management_ops, false);
<< trunc_size << "->" << obj_trunc_size << dendl;
return obj_trunc_size;
}
+uint64_t Striper::get_num_objects(const ceph_file_layout& layout, uint64_t size)
+{
+ __u32 object_size = layout.fl_object_size;
+ __u32 stripe_unit = layout.fl_stripe_unit;
+ __u32 stripe_count = layout.fl_stripe_count;
+ uint64_t period = stripe_count * object_size;
+ uint64_t num_periods = (size + period - 1) / period;
+ uint64_t remainder_bytes = size % period;
+ uint64_t remainder_objs = 0;
+ if ((remainder_bytes > 0) && (remainder_bytes < stripe_count * stripe_unit))
+ remainder_objs = stripe_count - ((remainder_bytes + stripe_unit - 1) / stripe_unit);
+ return num_periods * stripe_count - remainder_objs;
+}
// StripedReadResult