osd/ReplicatedPG: fix trim of in-flight hit_sets

We normally need to stat the hit_set to know how many bytes to adjust the
stats by.  If the hit_set was just written, we will get ENOENT.

Get the obc instead, which will either get the in-memory copy (because the
repop is still in flight) or load it off of disk.

Fixes: #8283
Backport: firefly
Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2014-05-02 16:41:26 -07:00
parent 5a6ae2a978
commit 72fdd557c3

View File

@ -10924,15 +10924,11 @@ void ReplicatedPG::hit_set_trim(RepGather *repop, unsigned max)
agent_state->remove_oldest_hit_set();
updated_hit_set_hist.history.pop_front();
struct stat st;
int r = osd->store->stat(
coll,
ghobject_t(oid, ghobject_t::NO_GEN, pg_whoami.shard),
&st);
assert(r == 0);
ObjectContextRef obc = get_object_context(oid, false);
assert(obc);
--repop->ctx->delta_stats.num_objects;
--repop->ctx->delta_stats.num_objects_hit_set_archive;
repop->ctx->delta_stats.num_bytes -= st.st_size;
repop->ctx->delta_stats.num_bytes -= obc->obs.oi.size;
}
}