]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-fuse: add option to disable kernel pagecache 5521/head
authorYan, Zheng <zyan@redhat.com>
Mon, 10 Aug 2015 07:15:48 +0000 (15:15 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 10 Jun 2016 01:22:41 +0000 (09:22 +0800)
When multiple clients read/write to a file at the same time, we need
to disable cache and let reads/writes go to OSDs. In ceph-fuse case,
there are two caches, one is in ceph-fuse, another one is in kernel.
We can't disable/enable the kernel cache dynamically. So adding an
config option to completely disable kernel cache. Disabling kernel
cache may reduce performance, so option is disabled by default.

Fixes: 12653
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/fuse_ll.cc
src/common/config_opts.h

index 21a9aea4d8c1a81e33de5ec8468a1fa1506c849f..065a6e96845e243427cddf9246334259e905be81 100644 (file)
@@ -471,7 +471,9 @@ static void fuse_ll_open(fuse_req_t req, fuse_ino_t ino,
   if (r == 0) {
     fi->fh = (uint64_t)fh;
 #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8)
-    if (cfuse->client->cct->_conf->fuse_use_invalidate_cb)
+    if (cfuse->client->cct->_conf->fuse_disable_pagecache)
+      fi->direct_io = 1;
+    else if (cfuse->client->cct->_conf->fuse_use_invalidate_cb)
       fi->keep_cache = 1;
 #endif
     fuse_reply_open(req, fi);
@@ -673,6 +675,12 @@ static void fuse_ll_create(fuse_req_t req, fuse_ino_t parent, const char *name,
   if (r == 0) {
     fi->fh = (uint64_t)fh;
     fe.ino = cfuse->make_fake_ino(fe.attr.st_ino, fe.attr.st_dev);
+#if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8)
+    if (cfuse->client->cct->_conf->fuse_disable_pagecache)
+      fi->direct_io = 1;
+    else if (cfuse->client->cct->_conf->fuse_use_invalidate_cb)
+      fi->keep_cache = 1;
+#endif
     fuse_reply_create(req, &fe, fi);
   } else
     fuse_reply_err(req, -r);
index fe8353d84665060144288f04ef5f0c418e46ea97..567d94b6f26ecf9a13453cef91665a6be8301c9c 100644 (file)
@@ -403,6 +403,7 @@ OPTION(client_dirsize_rbytes, OPT_BOOL, true)
 
 // note: the max amount of "in flight" dirty data is roughly (max - target)
 OPTION(fuse_use_invalidate_cb, OPT_BOOL, true) // use fuse 2.8+ invalidate callback to keep page cache consistent
+OPTION(fuse_disable_pagecache, OPT_BOOL, false)
 OPTION(fuse_allow_other, OPT_BOOL, true)
 OPTION(fuse_default_permissions, OPT_BOOL, true)
 OPTION(fuse_big_writes, OPT_BOOL, true)