diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index 7cd7765b..25a2d620 100644 --- a/src/AbstractDiskWriter.cc +++ b/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);