OPTION(bluestore_extent_map_shard_target_size_slop, OPT_DOUBLE, .2)
OPTION(bluestore_extent_map_inline_shard_prealloc_size, OPT_U32, 256)
OPTION(bluestore_cache_trim_interval, OPT_DOUBLE, .1)
+OPTION(bluestore_cache_trim_max_skip_pinned, OPT_U32, 64) // skip this many onodes pinned in cache before we give up
OPTION(bluestore_cache_type, OPT_STR, "2q") // lru, 2q
OPTION(bluestore_2q_cache_kin_ratio, OPT_DOUBLE, .5) // kin page slot size / max page slot size
OPTION(bluestore_2q_cache_kout_ratio, OPT_DOUBLE, .5) // number of kout page slot / total number of page slot
auto p = onode_lru.end();
assert(p != onode_lru.begin());
--p;
+ int skipped = 0;
+ int max_skipped = g_conf->bluestore_cache_trim_max_skip_pinned;
while (num > 0) {
Onode *o = &*p;
int refs = o->nref.load();
if (refs > 1) {
dout(20) << __func__ << " " << o->oid << " has " << refs
- << " refs; stopping with " << num << " left to trim" << dendl;
- break;
+ << " refs, skipping" << dendl;
+ if (++skipped >= max_skipped) {
+ dout(20) << __func__ << " maximum skip pinned reached; stopping with "
+ << num << " left to trim" << dendl;
+ break;
+ }
+
+ if (p == onode_lru.begin()) {
+ break;
+ } else {
+ p--;
+ continue;
+ }
}
dout(30) << __func__ << " rm " << o->oid << dendl;
if (p != onode_lru.begin()) {
auto p = onode_lru.end();
assert(p != onode_lru.begin());
--p;
+ int skipped = 0;
+ int max_skipped = g_conf->bluestore_cache_trim_max_skip_pinned;
while (num > 0) {
Onode *o = &*p;
int refs = o->nref.load();
if (refs > 1) {
dout(20) << __func__ << " " << o->oid << " has " << refs
- << " refs; stopping with " << num << " left to trim" << dendl;
- break;
+ << " refs; skipping" << dendl;
+ if (++skipped >= max_skipped) {
+ dout(20) << __func__ << " maximum skip pinned reached; stopping with "
+ << num << " left to trim" << dendl;
+ break;
+ }
+
+ if (p == onode_lru.begin()) {
+ break;
+ } else {
+ p--;
+ continue;
+ }
}
dout(30) << __func__ << " trim " << o->oid << dendl;
if (p != onode_lru.begin()) {