From: Sage Weil Date: Wed, 20 Aug 2008 21:09:39 +0000 (-0700) Subject: objectcacher: flush_set_callback X-Git-Tag: v0.4~200 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=05d2ddb869f9804f248f9dd60431775d6585f124;p=ceph.git objectcacher: flush_set_callback --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index f1a548f9ff1..d69bcddecb5 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -617,6 +617,11 @@ void ObjectCacher::bh_write_ack(object_t oid, off_t start, size_t length, tid_t // update object last_ack. assert(ob->last_ack_tid < tid); ob->last_ack_tid = tid; + + // is the entire object set now clean? + if (flush_set_callback && + dirty_tx_by_ino[ob->get_ino()] == 0) + flush_set_callback(flush_set_callback_arg, ob->get_ino()); // waiters? if (ob->waitfor_ack.count(tid)) { diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 0959cbba336..efba47555af 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -18,6 +18,8 @@ class Objecter; class ObjectCacher { public: + typedef void (*flush_set_callback_t) (void *p, inodeno_t ino); + class Object; // ******* BufferHead ********* @@ -204,8 +206,12 @@ class ObjectCacher { private: Mutex& lock; + flush_set_callback_t flush_set_callback; + void *flush_set_callback_arg; + hash_map objects; hash_map > objects_by_ino; + hash_map dirty_tx_by_ino; set dirty_bh; LRU lru_dirty, lru_rest; @@ -252,8 +258,14 @@ class ObjectCacher { switch (bh->get_state()) { case BufferHead::STATE_MISSING: stat_missing += bh->length(); break; case BufferHead::STATE_CLEAN: stat_clean += bh->length(); break; - case BufferHead::STATE_DIRTY: stat_dirty += bh->length(); break; - case BufferHead::STATE_TX: stat_tx += bh->length(); break; + case BufferHead::STATE_DIRTY: + stat_dirty += bh->length(); + dirty_tx_by_ino[bh->ob->get_ino()] += bh->length(); + break; + case BufferHead::STATE_TX: + stat_tx += bh->length(); + dirty_tx_by_ino[bh->ob->get_ino()] += bh->length(); + break; case BufferHead::STATE_RX: stat_rx += bh->length(); break; } if (stat_waiter) stat_cond.Signal(); @@ -262,8 +274,14 @@ class ObjectCacher { switch (bh->get_state()) { case BufferHead::STATE_MISSING: stat_missing -= bh->length(); break; case BufferHead::STATE_CLEAN: stat_clean -= bh->length(); break; - case BufferHead::STATE_DIRTY: stat_dirty -= bh->length(); break; - case BufferHead::STATE_TX: stat_tx -= bh->length(); break; + case BufferHead::STATE_DIRTY: + stat_dirty -= bh->length(); + dirty_tx_by_ino[bh->ob->get_ino()] -= bh->length(); + break; + case BufferHead::STATE_TX: + stat_tx -= bh->length(); + dirty_tx_by_ino[bh->ob->get_ino()] -= bh->length(); + break; case BufferHead::STATE_RX: stat_rx -= bh->length(); break; } } @@ -410,8 +428,9 @@ class ObjectCacher { public: - ObjectCacher(Objecter *o, Mutex& l) : + ObjectCacher(Objecter *o, Mutex& l, flush_set_callback_t callback = 0, void *callback_arg = 0) : objecter(o), filer(o), lock(l), + flush_set_callback(callback), flush_set_callback_arg(callback_arg), flusher_stop(false), flusher_thread(this), stat_waiter(0), stat_clean(0), stat_dirty(0), stat_rx(0), stat_tx(0), stat_missing(0) {