From: Sage Weil Date: Mon, 5 Dec 2016 18:44:32 +0000 (-0500) Subject: os/bluestore: flush before enumerating omap values X-Git-Tag: v11.1.0~45^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1e042a9bbb48d0d33a1b1455a023bdafc11ea889;p=ceph.git os/bluestore: flush before enumerating omap values For a few update ops we enumerate omap keys (to remove them). Make sure we flush the pipeline before doing so or else we may lose keys inserted by a previous transaction that hasn't yet committed. Fixes: http://tracker.ceph.com/issues/18140 Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 83e15e7126eb..c558f5f74db8 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -8263,6 +8263,7 @@ int BlueStore::_do_remove( if (r < 0) return r; if (o->onode.has_omap()) { + o->flush(); _do_omap_clear(txc, o->onode.nid); } o->exists = false; @@ -8397,6 +8398,7 @@ int BlueStore::_omap_clear(TransContext *txc, dout(15) << __func__ << " " << c->cid << " " << o->oid << dendl; int r = 0; if (o->onode.has_omap()) { + o->flush(); _do_omap_clear(txc, o->onode.nid); o->onode.clear_omap_flag(); txc->write_onode(o); @@ -8501,6 +8503,7 @@ int BlueStore::_omap_rmkey_range(TransContext *txc, if (!o->onode.has_omap()) { goto out; } + o->flush(); it = db->get_iterator(PREFIX_OMAP); get_omap_key(o->onode.nid, first, &key_first); get_omap_key(o->onode.nid, last, &key_last); @@ -8587,6 +8590,7 @@ int BlueStore::_clone(TransContext *txc, // clone omap if (newo->onode.has_omap()) { dout(20) << __func__ << " clearing old omap data" << dendl; + newo->flush(); _do_omap_clear(txc, newo->onode.nid); } if (oldo->onode.has_omap()) {