os/bluestore: try to unshare blobs from gen objects
OSD EC write pattern clones a to-be-written range to a
gen object and then deletes it shortly after. Try to
unshare the original blob in the nogen object if it is
in the cache so reduce the shared blob tracking overhead
and copy-on-write behavior.
This doesn't make our write pattern perfect, by any
means, since a small overwrite will generally
- clone the range to the gen object
- write the same range, creating a new blob on the
nogen object
- remove the clone, and unshare the original blob
This doesn't fix that the overwrite was written
somewhere else and we probably have two competing blobs.
However, future small writes will find the alternate
blob in _do_small_write and reuse the same allocation,
which is something.