]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlueStore: preallocate space when use file instead of blockdevice.
authorJianpeng Ma <jianpeng.ma@intel.com>
Thu, 7 Apr 2016 16:10:29 +0000 (00:10 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Sat, 7 May 2016 06:56:07 +0000 (14:56 +0800)
Avoid failure because lack of space.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/os/bluestore/BlueStore.cc

index 8d0fbd1c4a3594c3b1cfd67f9c0ac5293d24d33c..d77d3cdb8c10839a57cbbb4194e65691195073a4 100644 (file)
@@ -1639,6 +1639,31 @@ int BlueStore::_setup_block_symlink_or_file(
          VOID_TEMP_FAILURE_RETRY(::close(fd));
          return r;
        }
+#ifdef HAVE_POSIX_FALLOCATE
+       r = ::posix_fallocate(fd, 0, size);
+       if (r < 0) {
+         r = -errno;
+         derr << __func__ << " failed to prefallocate " << name << " file to "
+              << size << ": " << cpp_strerror(r) << dendl;
+         VOID_TEMP_FAILURE_RETRY(::close(fd));
+         return r;
+       }
+#else
+       char data[1024*128];
+       for (uint64_t off = 0; off < size; off += sizeof(data)) {
+         if (off + sizeof(data) > size)
+           r = ::write(fd, data, size - off);
+         else
+           r = ::write(fd, data, sizeof(data));
+         if (r < 0) {
+           r = -errno;
+           derr << __func__ << " failed to prefallocate w/ write " << name << " file to "
+             << size << ": " << cpp_strerror(r) << dendl;
+           VOID_TEMP_FAILURE_RETRY(::close(fd));
+           return r;
+         }
+       }
+#endif
        dout(1) << __func__ << " resized " << name << " file to "
                << pretty_si_t(size) << "B" << dendl;
       }