]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: keep using cache even if op will invalid cache 25490/head
authorZengran Zhang <zhangzengran@sangfor.com.cn>
Tue, 11 Dec 2018 11:32:55 +0000 (19:32 +0800)
committerZengran Zhang <zhangzengran@sangfor.com.cn>
Tue, 11 Dec 2018 11:32:55 +0000 (19:32 +0800)
the current wrong process on same obj in ec 4+2 pool with 16K stripe:

obj has 16K~16K with content-0
new op1 will write 8K~32K (16K~16K content-1)
op1 reserve 0K~48K in cache
op1 read 0~16K & 32K~48K from disk
new op2 will write 20K~24K (20K~4K content-2) *** (invalid_cache dur to clone)
op2 read 16K~32K from disk (content-0) ***** dur to not using_cache
op1 write 0~48K to disk (content-1)
op1 present 0~48K to cache (content-1)
op2 write 16~32K to disk (content-0 + content-2) *** here we drop the content1

even if the op will invalid cache, it should do that *after* itself,
the op should use the cache by itself.

Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
src/osd/ECBackend.cc

index bc9c4c460863eb4a5c32e9172564cf06804bd894..b979545c052de85a5d407079aabebc5a4ea16c11 100644 (file)
@@ -1838,13 +1838,12 @@ bool ECBackend::try_state_to_reads()
     return false;
   }
 
+  op->using_cache = pipeline_state.caching_enabled();
+
   if (op->invalidates_cache()) {
     dout(20) << __func__ << ": invalidating cache after this op"
             << dendl;
     pipeline_state.invalidate();
-    op->using_cache = false;
-  } else {
-    op->using_cache = pipeline_state.caching_enabled();
   }
 
   waiting_state.pop_front();