From: Yan, Zheng Date: Wed, 28 Oct 2015 09:06:59 +0000 (+0800) Subject: hammer: objectcacher: introduce ObjectCacher::flush_all() X-Git-Tag: v0.94.10~40^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7a2abfac759acaf668c6ace25df94619f27e829d;p=ceph.git hammer: objectcacher: introduce ObjectCacher::flush_all() Signed-off-by: Yan, Zheng (cherry picked from commit bd86c301a54a6e23cf2ce257b8024b6b92dfbe11) Conflicts: src/osdc/ObjectCacher.h - whitespace only changes Semantic conflicts: ObjectCacher::flush_all(): dirty_or_tx_bh is a set in Hammer --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index b2c257237628..abac935d6020 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -1789,6 +1789,46 @@ bool ObjectCacher::flush_set(ObjectSet *oset, vector& exv, Context return _flush_set_finish(&gather, onfinish); } +// flush all dirty data. non-blocking, takes callback. +// returns true if already flushed +bool ObjectCacher::flush_all(Context *onfinish) +{ + assert(lock.is_locked()); + assert(onfinish != NULL); + + ldout(cct, 10) << "flush_all " << dendl; + + // we'll need to wait for all objects to flush! + C_GatherBuilder gather(cct); + set waitfor_commit; + + set::iterator next, it; + next = it = dirty_or_tx_bh.begin(); + while (it != dirty_or_tx_bh.end()) { + ++next; + BufferHead *bh = *it; + waitfor_commit.insert(bh->ob); + + if (bh->is_dirty()) + bh_write(bh); + + it = next; + } + + for (set::iterator i = waitfor_commit.begin(); + i != waitfor_commit.end(); + ++i) { + Object *ob = *i; + + // we'll need to gather... + ldout(cct, 10) << "flush_all will wait for ack tid " + << ob->last_write_tid << " on " << *ob << dendl; + ob->waitfor_commit[ob->last_write_tid].push_back(gather.new_sub()); + } + + return _flush_set_finish(&gather, onfinish); +} + void ObjectCacher::purge_set(ObjectSet *oset) { assert(lock.is_locked()); diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 0bef597fdf65..8f735cb06fcd 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -618,7 +618,7 @@ public: bool flush_set(ObjectSet *oset, Context *onfinish=0); bool flush_set(ObjectSet *oset, vector& ex, Context *onfinish=0); - void flush_all(Context *onfinish=0); + bool flush_all(Context *onfinish=0); void purge_set(ObjectSet *oset);