Nvm, sync_and_flush forces a sync for non-writeahead journals. -Sam On Mon, May 19, 2014 at 1:15 PM, Samuel Just <sam.just@xxxxxxxxxxx> wrote: > Why would the osd need to create and remove 1 btrfs snapshot per temp directory? > -Sam > > On Sun, May 18, 2014 at 5:47 AM, Alexandre Oliva <oliva@xxxxxxx> wrote: >> When a btrfs OSD suicides because it couldn't keep up with others >> (recovery included), it is often the case that the filesystem is in a >> state in which creating and removing snapshots takes a long time. It >> is likely that there are going to be plenty of recovering PGs (with >> corresponding TEMP directories), and we will create and remove a btrfs >> snapshot for every such directory we remove at startup. This is very >> wasteful: there's no reason to not pile up as many removals as >> possible before syncing and flushing the removal so as to force a >> btrfs snapshot. >> >> This patch introduces an optional argument to the function used to >> remove PGs to control whether or not to perform the final flush. The >> flush still happens if the call does not pass that argument, but with >> the patch, the startup removals skip the per-PG flush, and run a >> single flush at the end. >> >> Signed-off-by: Alexandre Oliva <oliva@xxxxxxx> >> --- >> src/osd/OSD.cc | 12 +++++++++--- >> src/osd/OSD.h | 3 ++- >> 2 files changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc >> index 4240ba8..504cb71 100644 >> --- a/src/osd/OSD.cc >> +++ b/src/osd/OSD.cc >> @@ -1774,7 +1774,8 @@ int OSD::read_superblock() >> >> >> >> -void OSD::recursive_remove_collection(ObjectStore *store, coll_t tmp) >> +void OSD::recursive_remove_collection(ObjectStore *store, coll_t tmp, >> + bool flush) >> { >> OSDriver driver( >> store, >> @@ -1810,7 +1811,8 @@ void OSD::recursive_remove_collection(ObjectStore *store, coll_t tmp) >> t.remove_collection(tmp); >> int r = store->apply_transaction(t); >> assert(r == 0); >> - store->sync_and_flush(); >> + if (flush) >> + store->sync_and_flush(); >> } >> >> >> @@ -2046,6 +2048,7 @@ void OSD::load_pgs() >> >> set<spg_t> head_pgs; >> map<spg_t, interval_set<snapid_t> > pgs; >> + bool flush = false; >> for (vector<coll_t>::iterator it = ls.begin(); >> it != ls.end(); >> ++it) { >> @@ -2056,7 +2059,8 @@ void OSD::load_pgs() >> if (it->is_temp(pgid) || >> it->is_removal(&seq, &pgid)) { >> dout(10) << "load_pgs " << *it << " clearing temp" << dendl; >> - recursive_remove_collection(store, *it); >> + recursive_remove_collection(store, *it, false); >> + flush = true; >> continue; >> } >> >> @@ -2074,6 +2078,8 @@ void OSD::load_pgs() >> >> dout(10) << "load_pgs ignoring unrecognized " << *it << dendl; >> } >> + if (flush) >> + store->sync_and_flush(); >> >> bool has_upgraded = false; >> for (map<spg_t, interval_set<snapid_t> >::iterator i = pgs.begin(); >> diff --git a/src/osd/OSD.h b/src/osd/OSD.h >> index ce8b74c..f599e43 100644 >> --- a/src/osd/OSD.h >> +++ b/src/osd/OSD.h >> @@ -870,7 +870,8 @@ public: >> hobject_t oid(sobject_t("infos", CEPH_NOSNAP)); >> return oid; >> } >> - static void recursive_remove_collection(ObjectStore *store, coll_t tmp); >> + static void recursive_remove_collection(ObjectStore *store, coll_t tmp, >> + bool flush = true); >> >> /** >> * get_osd_initial_compat_set() >> >> -- >> Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ >> You must be the change you wish to see in the world. -- Gandhi >> Be Free! -- http://FSFLA.org/ FSF Latin America board member >> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer >> -- >> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html