From 66aae982772fa2998a2435435cf74e6ecabfbd39 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 9 Apr 2015 09:16:03 -0700 Subject: [PATCH] os/newstore: use overlay even if it is a new object or append This avoids the fsync for small writes. Signed-off-by: Sage Weil --- src/os/newstore/NewStore.cc | 63 ++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/os/newstore/NewStore.cc b/src/os/newstore/NewStore.cc index a84e38a5caf00..689415c571b27 100644 --- a/src/os/newstore/NewStore.cc +++ b/src/os/newstore/NewStore.cc @@ -2980,6 +2980,33 @@ int NewStore::_do_write(TransContext *txc, dout(20) << __func__ << " zero-length write" << dendl; goto out; } + + if ((int)o->onode.overlay_map.size() < g_conf->newstore_overlay_max && + (int)length < g_conf->newstore_overlay_max_length) { + // write an overlay + r = _do_overlay_write(txc, o, offset, length, bl); + if (r < 0) + goto out; + if (offset + length > o->onode.size) { + // make sure the data fragment matches + if (!o->onode.data_map.empty()) { + assert(o->onode.data_map.size() == 1); + fragment_t& f = o->onode.data_map.begin()->second; + assert(f.offset == 0); + assert(f.length == o->onode.size); + r = _clean_fid_tail(txc, f); + if (r < 0) + goto out; + f.length = offset + length; + } + dout(20) << __func__ << " extending size to " << offset + length << dendl; + o->onode.size = offset + length; + } + txc->write_onode(o); + r = 0; + goto out; + } + if (o->onode.size == offset || o->onode.size == 0 || o->onode.data_map.empty()) { @@ -3021,8 +3048,12 @@ int NewStore::_do_write(TransContext *txc, goto out; } txc->sync_fd(fd); - } else if (offset == 0 && - length >= o->onode.size) { + r = 0; + goto out; + } + + if (offset == 0 && + length >= o->onode.size) { // overwrite to new fid assert(o->onode.data_map.size() == 1); fragment_t& f = o->onode.data_map.begin()->second; @@ -3051,29 +3082,11 @@ int NewStore::_do_write(TransContext *txc, goto out; } txc->sync_fd(fd); - } else if ((int)o->onode.overlay_map.size() < g_conf->newstore_overlay_max && - (int)length < g_conf->newstore_overlay_max_length) { - // write an overlay - r = _do_overlay_write(txc, o, offset, length, bl); - if (r < 0) - goto out; - if (offset + length > o->onode.size) { - // make sure the data fragment matches - if (!o->onode.data_map.empty()) { - assert(o->onode.data_map.size() == 1); - fragment_t& f = o->onode.data_map.begin()->second; - assert(f.offset == 0); - assert(f.length == o->onode.size); - r = _clean_fid_tail(txc, f); - if (r < 0) - goto out; - f.length = offset + length; - } - dout(20) << __func__ << " extending size to " << offset + length << dendl; - o->onode.size = offset + length; - } - txc->write_onode(o); - } else { + r = 0; + goto out; + } + + if (true) { // WAL assert(o->onode.data_map.size() == 1); fragment_t& f = o->onode.data_map.begin()->second; -- 2.39.5