diff --git a/cpp/src/arrow/io/io-file-test.cc b/cpp/src/arrow/io/io-file-test.cc index 1b7e052d651..6550c746622 100644 --- a/cpp/src/arrow/io/io-file-test.cc +++ b/cpp/src/arrow/io/io-file-test.cc @@ -462,6 +462,41 @@ TEST_F(TestMemoryMappedFile, ReadOnly) { rommap->Close(); } +TEST_F(TestMemoryMappedFile, DISABLED_ReadWriteOver4GbFile) { + // ARROW-1096 + const int64_t buffer_size = 1000 * 1000; + std::vector buffer(buffer_size); + + test::random_bytes(buffer_size, 0, buffer.data()); + + const int64_t reps = 5000; + + std::string path = "ipc-read-over-4gb-file-test"; + std::shared_ptr rwmmap; + ASSERT_OK(InitMemoryMap(reps * buffer_size, path, &rwmmap)); + AppendFile(path); + + int64_t position = 0; + for (int i = 0; i < reps; ++i) { + ASSERT_OK(rwmmap->Write(buffer.data(), buffer_size)); + position += buffer_size; + } + rwmmap->Close(); + + std::shared_ptr rommap; + ASSERT_OK(MemoryMappedFile::Open(path, FileMode::READ, &rommap)); + + position = 0; + std::shared_ptr out_buffer; + for (int i = 0; i < reps; ++i) { + ASSERT_OK(rommap->ReadAt(position, buffer_size, &out_buffer)); + + ASSERT_EQ(0, memcmp(out_buffer->data(), buffer.data(), buffer_size)); + position += buffer_size; + } + rommap->Close(); +} + TEST_F(TestMemoryMappedFile, RetainMemoryMapReference) { // ARROW-494 diff --git a/cpp/src/arrow/io/mman.h b/cpp/src/arrow/io/mman.h index 27d9736b683..e45c88efd56 100644 --- a/cpp/src/arrow/io/mman.h +++ b/cpp/src/arrow/io/mman.h @@ -93,13 +93,10 @@ static void* mmap(void* addr, size_t len, int prot, int flags, int fildes, off_t const DWORD protect = __map_mmap_prot_page(prot); const DWORD desiredAccess = __map_mmap_prot_file(prot); - const off_t maxSize = off + (off_t)len; + const size_t maxSize = off + len; - const DWORD dwMaxSizeLow = - (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL); - const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) - ? (DWORD)0 - : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL); + const DWORD dwMaxSizeLow = static_cast(maxSize & 0xFFFFFFFFL); + const DWORD dwMaxSizeHigh = static_cast((maxSize >> 32) & 0xFFFFFFFFL); #ifdef _MSC_VER #pragma warning(pop) diff --git a/cpp/src/arrow/io/test-common.h b/cpp/src/arrow/io/test-common.h index d6ec27048d5..438f378085f 100644 --- a/cpp/src/arrow/io/test-common.h +++ b/cpp/src/arrow/io/test-common.h @@ -80,6 +80,8 @@ class MemoryMapFixture { return Status::OK(); } + void AppendFile(const std::string& path) { tmp_files_.push_back(path); } + private: std::vector tmp_files_; };