Forráskód Böngészése

Fix F_PREALLOC based allocation on some OSX versions

Nils Maier 11 éve
szülő
commit
5c07f0109e
1 módosított fájl, 12 hozzáadás és 4 törlés
  1. 12 4
      src/AbstractDiskWriter.cc

+ 12 - 4
src/AbstractDiskWriter.cc

@@ -476,19 +476,27 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse)
   truncate(offset+length);
 # elif defined(__APPLE__) && defined(__MACH__)
   auto toalloc = offset + length - size();
-  if (toalloc > 0) {
-    fstore_t fstore = {F_ALLOCATECONTIG | F_ALLOCATEALL, F_PEOFPOSMODE, 0, toalloc};
+  while (toalloc > 0) {
+    fstore_t fstore = {
+      F_ALLOCATECONTIG | F_ALLOCATEALL,
+      F_PEOFPOSMODE,
+      0,
+      // Allocate in 1GB chunks or else some OSX versions may choke.
+      std::min(toalloc, (int64_t)1<<30),
+      0
+    };
     if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) {
       // Retry non-contig.
       fstore.fst_flags = F_ALLOCATEALL;
       if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) {
         int err = errno;
         throw DL_ABORT_EX3(err,
-                          fmt("fcntl(F_PREALLOCATE failed. cause: %s",
-                              util::safeStrerror(err).c_str()),
+                          fmt("fcntl(F_PREALLOCATE) of %" PRId64 " failed. cause: %s",
+                              fstore.fst_length, util::safeStrerror(err).c_str()),
                           error_code::FILE_IO_ERROR);
       }
     }
+    toalloc -= fstore.fst_bytesalloc;
   }
   // This forces the allocation on disk.
   ftruncate(fd_, offset + length);