From efde8d440b482e3fd90c6b60ef5118f408afd0fa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 May 2018 08:24:54 -0500 Subject: [PATCH] os/bluestore: move txc on_commits assignment into ctor This avoids adjusting the oncommits without a lock after the txc is queued on the sequencer. This is a bit defensive since the ObjectStore caller doesn't call flush_commit() at the same time as queue_transaction(), but the could change in the future. Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 11 ++++++----- src/os/bluestore/BlueStore.h | 9 +++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index a4a150cebf0db..31370abc4d9c7 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -8337,9 +8337,10 @@ void BlueStore::get_db_statistics(Formatter *f) } BlueStore::TransContext *BlueStore::_txc_create( - Collection *c, OpSequencer *osr) + Collection *c, OpSequencer *osr, + list *on_commits) { - TransContext *txc = new TransContext(cct, c, osr); + TransContext *txc = new TransContext(cct, c, osr, on_commits); txc->t = db->get_transaction(); osr->queue_new(txc); dout(20) << __func__ << " osr " << osr << " = " << txc @@ -9434,7 +9435,7 @@ int BlueStore::_deferred_replay() r = -EIO; goto out; } - TransContext *txc = _txc_create(ch.get(), osr); + TransContext *txc = _txc_create(ch.get(), osr, nullptr); txc->deferred_txn = deferred_txn; txc->state = TransContext::STATE_KV_DONE; _txc_state_proc(txc); @@ -9481,8 +9482,8 @@ int BlueStore::queue_transactions( dout(10) << __func__ << " ch " << c << " " << c->cid << dendl; // prepare - TransContext *txc = _txc_create(static_cast(ch.get()), osr); - txc->oncommits.swap(on_commit); + TransContext *txc = _txc_create(static_cast(ch.get()), osr, + &on_commit); for (vector::iterator p = tls.begin(); p != tls.end(); ++p) { txc->bytes += (*p).get_num_bytes(); diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index a1e10712a597b..98ed011062588 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1593,12 +1593,16 @@ public: uint64_t last_nid = 0; ///< if non-zero, highest new nid we allocated uint64_t last_blobid = 0; ///< if non-zero, highest new blobid we allocated - explicit TransContext(CephContext* cct, Collection *c, OpSequencer *o) + explicit TransContext(CephContext* cct, Collection *c, OpSequencer *o, + list *on_commits) : ch(c), osr(o), ioc(cct, this), start(ceph_clock_now()) { last_stamp = start; + if (on_commits) { + oncommits.swap(*on_commits); + } } ~TransContext() { delete deferred_txn; @@ -2018,7 +2022,8 @@ private: template void _dump_extent_map(ExtentMap& em); template void _dump_transaction(Transaction *t); - TransContext *_txc_create(Collection *c, OpSequencer *osr); + TransContext *_txc_create(Collection *c, OpSequencer *osr, + list *on_commits); void _txc_update_store_statfs(TransContext *txc); void _txc_add_transaction(TransContext *txc, Transaction *t); void _txc_calc_cost(TransContext *txc); -- 2.39.5