stvfe_dskoc_fco: Skip stvfe_wait for critical object reads (e.g. from LRU)

The exp thread is also critical. It must not starve, otherwise lru
starves also because of hitting OC_F_DYING objects.
parent 56a1acd9
...@@ -415,7 +415,7 @@ stvfe_dskoc_fco(struct worker *wrk, ...@@ -415,7 +415,7 @@ stvfe_dskoc_fco(struct worker *wrk,
const struct stevedore *stv, const struct stvfe *stvfe, const struct stevedore *stv, const struct stvfe *stvfe,
struct objcore *oc, unsigned crit) struct objcore *oc, unsigned crit)
{ {
struct stvfe_wait_entry *we; struct stvfe_wait_entry *we = NULL;
struct fellow_cache_res fcr; struct fellow_cache_res fcr;
struct objcore *refoc; struct objcore *refoc;
struct fcoc fcoc = {0}; struct fcoc fcoc = {0};
...@@ -437,10 +437,12 @@ stvfe_dskoc_fco(struct worker *wrk, ...@@ -437,10 +437,12 @@ stvfe_dskoc_fco(struct worker *wrk,
return (fcoc); return (fcoc);
} }
we = stvfe_wait(stvfe->wait, oc->stobj->priv2); if (! crit) {
if (we == NULL ) { we = stvfe_wait(stvfe->wait, oc->stobj->priv2);
counter = &stvfe->stats->c_dsk_obj_get_coalesce; if (we == NULL ) {
goto again; counter = &stvfe->stats->c_dsk_obj_get_coalesce;
goto again;
}
} }
/* we race to get the fco and, if we win the race, /* we race to get the fco and, if we win the race,
...@@ -487,7 +489,8 @@ stvfe_dskoc_fco(struct worker *wrk, ...@@ -487,7 +489,8 @@ stvfe_dskoc_fco(struct worker *wrk,
stvfe->stats->c_dsk_obj_get++; stvfe->stats->c_dsk_obj_get++;
out: out:
stvfe_wait_signal(we, oc->stobj->priv2); if (we)
stvfe_wait_signal(we, oc->stobj->priv2);
return (fcoc); return (fcoc);
} }
...@@ -609,7 +612,7 @@ sfedsk_objfree(struct worker *wrk, struct objcore *dskoc) ...@@ -609,7 +612,7 @@ sfedsk_objfree(struct worker *wrk, struct objcore *dskoc)
stvfe->stats->c_dsk_obj_free_thin++; stvfe->stats->c_dsk_obj_free_thin++;
} }
else if ( else if (
(fcoc = stvfe_dskoc_fco(wrk, stv, stvfe, dskoc, 0)).fco != NULL) { (fcoc = stvfe_dskoc_fco(wrk, stv, stvfe, dskoc, 1)).fco != NULL) {
/* attempt to read to free space */ /* attempt to read to free space */
fellow_cache_obj_delete(stvfe->fc, fcoc.fco, oh->digest); fellow_cache_obj_delete(stvfe->fc, fcoc.fco, oh->digest);
fcoc_fini(stvfe->fc, &fcoc); fcoc_fini(stvfe->fc, &fcoc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment