]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Wait tx state buffer in flush_set
authorHaomai Wang <haomaiwang@gmail.com>
Wed, 16 Jul 2014 06:34:22 +0000 (14:34 +0800)
committerJosh Durgin <josh.durgin@inktank.com>
Mon, 21 Jul 2014 20:31:32 +0000 (13:31 -0700)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

index b52de928a678007df5e1cbeafc717f0984800a4f..cb3c56456a8ce6c0acc0f1f1070df1b06928466a 100644 (file)
@@ -530,7 +530,7 @@ ObjectCacher::~ObjectCacher()
   assert(bh_lru_rest.lru_get_size() == 0);
   assert(bh_lru_dirty.lru_get_size() == 0);
   assert(ob_lru.lru_get_size() == 0);
-  assert(dirty_bh.empty());
+  assert(dirty_or_tx_bh.empty());
 }
 
 void ObjectCacher::perf_start()
@@ -1616,8 +1616,8 @@ bool ObjectCacher::flush_set(ObjectSet *oset, Context *onfinish)
   set<Object*> waitfor_commit;
 
   set<BufferHead*>::iterator next, it;
-  next = it = dirty_bh.begin();
-  while (it != dirty_bh.end()) {
+  next = it = dirty_or_tx_bh.begin();
+  while (it != dirty_or_tx_bh.end()) {
     next++;
     BufferHead *bh = *it;
     waitfor_commit.insert(bh->ob);
@@ -2007,14 +2007,16 @@ void ObjectCacher::bh_set_state(BufferHead *bh, int s)
   if (s == BufferHead::STATE_DIRTY && bh->get_state() != BufferHead::STATE_DIRTY) {
     bh_lru_rest.lru_remove(bh);
     bh_lru_dirty.lru_insert_top(bh);
-    dirty_bh.insert(bh);
-  }
-  if (s != BufferHead::STATE_DIRTY && bh->get_state() == BufferHead::STATE_DIRTY) {
+    dirty_or_tx_bh.insert(bh);
+  } else if (s != BufferHead::STATE_DIRTY && bh->get_state() == BufferHead::STATE_DIRTY) {
     bh_lru_dirty.lru_remove(bh);
     bh_lru_rest.lru_insert_top(bh);
-    dirty_bh.erase(bh);
-  }
-  if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) {
+    dirty_or_tx_bh.erase(bh);
+  } else if (s == BufferHead::STATE_TX && bh->get_state() != BufferHead::STATE_TX) {
+    dirty_or_tx_bh.insert(bh);
+  } else if (s != BufferHead::STATE_TX && bh->get_state() == BufferHead::STATE_TX) {
+    dirty_or_tx_bh.erase(bh);
+  } else if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) {
     bh->error = 0;
   }
 
@@ -2031,7 +2033,9 @@ void ObjectCacher::bh_add(Object *ob, BufferHead *bh)
   ob->add_bh(bh);
   if (bh->is_dirty()) {
     bh_lru_dirty.lru_insert_top(bh);
-    dirty_bh.insert(bh);
+    dirty_or_tx_bh.insert(bh);
+  } else if (bh->is_tx()) {
+    dirty_or_tx_bh.insert(bh);
   } else {
     bh_lru_rest.lru_insert_top(bh);
   }
@@ -2045,7 +2049,9 @@ void ObjectCacher::bh_remove(Object *ob, BufferHead *bh)
   ob->remove_bh(bh);
   if (bh->is_dirty()) {
     bh_lru_dirty.lru_remove(bh);
-    dirty_bh.erase(bh);
+    dirty_or_tx_bh.erase(bh);
+  } else if (bh->is_tx()) {
+    dirty_or_tx_bh.insert(bh);
   } else {
     bh_lru_rest.lru_remove(bh);
   }
index 9d9ab3fe90c90e8b07dac6d9875d60be9690b33e..ca16138fa2d00d764b88899a6bfd5ce010c1cfc1 100644 (file)
@@ -343,7 +343,7 @@ class ObjectCacher {
 
   ceph_tid_t last_read_tid;
 
-  set<BufferHead*>    dirty_bh;
+  set<BufferHead*>    dirty_or_tx_bh;
   LRU   bh_lru_dirty, bh_lru_rest;
   LRU   ob_lru;