]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
os/bluestore: simplify and fix SharedBlob::put() 22170/head
authorSage Weil <sage@redhat.com>
Mon, 21 May 2018 15:06:37 +0000 (10:06 -0500)
committerKefu Chai <kchai@redhat.com>
Wed, 23 May 2018 06:56:03 +0000 (14:56 +0800)
commite2e8512e6f278072a8b12f534e0cc554f52ba55d
treedc0b11c228bddb74e707a89e31b2f821e2d38ac3
parent0c00c7847a27bc1d222ef05fef637fce04c1d04b
os/bluestore: simplify and fix SharedBlob::put()

There is a narrow race possible:

A: lookup foo
A: put on foo
A:   foo --nref == 0
B: lookup foo
B: put foo
B:   foo --nref == 0
B: try_remove() succeeds, removes
A: try_remove() tries to remove foo again, probably crashes

We could fix this by flagging the object in some way to indicate it was
removed (maybe clearing parent?), but then we need to be careful about
dereferencing foo to get parent from put().

Fix this by moving to a simpler model: make lookup fail if nref == 0.
This eliminates the races around put() entirely because once nref reaches
0 it never goes up again.

Fixes: http://tracker.ceph.com/issues/24211
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 8c8944b2c45ca9dc5b8fd4db1590e1d24206c0b3)
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h