OPTION(rbd_cache_max_dirty, OPT_LONGLONG, 24<<20) // dirty limit in bytes - set to 0 for write-through caching
OPTION(rbd_cache_target_dirty, OPT_LONGLONG, 16<<20) // target dirty limit in bytes
OPTION(rbd_cache_max_dirty_age, OPT_FLOAT, 1.0) // seconds in cache before writeback starts
+OPTION(rbd_cache_max_dirty_object, OPT_INT, 0) // dirty limit for objects - set to 0 for auto calculate from rbd_cache_size
OPTION(rbd_cache_block_writes_upfront, OPT_BOOL, false) // whether to block writes to the cache before the aio_write call completes (true), or block before the aio completion is called (false)
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)
// size object cache appropriately
if (object_cacher) {
- uint64_t obj = cct->_conf->rbd_cache_size / (1ull << order);
+ uint64_t obj = cct->_conf->rbd_cache_max_dirty_object;
+ if (!obj) {
+ obj = cct->_conf->rbd_cache_size / (1ull << order);
+ obj = obj * 4 + 10;
+ }
ldout(cct, 10) << " cache bytes " << cct->_conf->rbd_cache_size << " order " << (int)order
<< " -> about " << obj << " objects" << dendl;
- object_cacher->set_max_objects(obj * 4 + 10);
+ object_cacher->set_max_objects(obj);
}
ldout(cct, 10) << "init_layout stripe_unit " << stripe_unit
cache_lock.Unlock();
if (unclean) {
lderr(cct) << "could not release all objects from cache: "
- << unclean << " bytes remain" << dendl;
+ << unclean << " bytes remain" << dendl;
return -EBUSY;
}
return r;