]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/newstore: use O_DIRECT is write is page-aligned
authorSage Weil <sage@redhat.com>
Fri, 10 Apr 2015 23:49:07 +0000 (16:49 -0700)
committerSage Weil <sage@redhat.com>
Tue, 1 Sep 2015 17:39:37 +0000 (13:39 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/config_opts.h
src/os/newstore/NewStore.cc

index abb7a7a000fd0b30d1629fdd71e7b9b1d965606e..2c3d8ee52a6e0264bbc354d9e64cf3c6e7fddd9f 100644 (file)
@@ -803,6 +803,7 @@ OPTION(newstore_nid_prealloc, OPT_INT, 1024)
 OPTION(newstore_overlay_max_length, OPT_INT, 65536)
 OPTION(newstore_overlay_max, OPT_INT, 32)
 OPTION(newstore_open_by_handle, OPT_BOOL, true)
+OPTION(newstore_o_direct, OPT_BOOL, true)
 
 OPTION(filestore_omap_backend, OPT_STR, "leveldb")
 
index 81dd130b2920f7915edad75f0199519bc9a153ac..8515eb5d0111dcf5e4d80e60b714af678776eb2e 100644 (file)
@@ -2277,7 +2277,14 @@ int NewStore::_do_wal_transaction(wal_transaction_t& wt)
       {
        dout(20) << __func__ << " write " << p->fid << " "
                 << p->offset << "~" << p->length << dendl;
-       int fd = _open_fid(p->fid, O_RDWR);
+       unsigned flags = O_RDWR;
+       if (g_conf->newstore_o_direct &&
+           (p->offset & ~CEPH_PAGE_MASK) == 0 &&
+           (p->length & ~CEPH_PAGE_MASK) == 0) {
+         dout(20) << __func__ << " page-aligned, using O_DIRECT" << dendl;
+         flags |= O_DIRECT;
+       }
+       int fd = _open_fid(p->fid, flags);
        if (fd < 0)
          return fd;
        int r = ::lseek64(fd, p->offset, SEEK_SET);
@@ -3022,12 +3029,19 @@ int NewStore::_do_write(TransContext *txc,
       o->onode.size == 0 ||
       o->onode.data_map.empty()) {
     _do_overlay_clear(txc, o);
+    unsigned flags = O_RDWR;
+    if (g_conf->newstore_o_direct &&
+       (offset & ~CEPH_PAGE_MASK) == 0 &&
+       (length & ~CEPH_PAGE_MASK) == 0) {
+      dout(20) << __func__ << " page-aligned, using O_DIRECT" << dendl;
+      flags |= O_DIRECT;
+    }
     if (o->onode.data_map.empty()) {
       // create
       fragment_t &f = o->onode.data_map[0];
       f.offset = 0;
       f.length = MAX(offset + length, o->onode.size);
-      fd = _create_fid(txc, &f.fid, O_RDWR);
+      fd = _create_fid(txc, &f.fid, flags);
       if (fd < 0) {
        r = fd;
        goto out;
@@ -3039,7 +3053,7 @@ int NewStore::_do_write(TransContext *txc,
       // append (possibly with gap)
       assert(o->onode.data_map.size() == 1);
       fragment_t &f = o->onode.data_map.rbegin()->second;
-      fd = _open_fid(f.fid, O_RDWR);
+      fd = _open_fid(f.fid, flags);
       if (fd < 0) {
        r = fd;
        goto out;