From 654ca084c7d1933dced2c4a1cd531c437f222d05 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 26 Jan 2022 12:12:41 +0000 Subject: Chunk large preads into multiple smaller preads of max 64MB. --- fastos/src/vespa/fastos/linux_file.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fastos/src/vespa/fastos/linux_file.cpp b/fastos/src/vespa/fastos/linux_file.cpp index 27beb1242d1..f1936ede2da 100644 --- a/fastos/src/vespa/fastos/linux_file.cpp +++ b/fastos/src/vespa/fastos/linux_file.cpp @@ -37,7 +37,18 @@ FastOS_Linux_File::FastOS_Linux_File(const char *filename) ssize_t FastOS_Linux_File::readInternal(int fh, void *buffer, size_t length, int64_t readOffset) { - return File_RW_Ops::pread(fh, buffer, length, readOffset); + char * data = static_cast(buffer); + ssize_t read(0); + while (read < ssize_t(length)) { + size_t lenNow = std::min(getChunkSize(), length - read); + ssize_t readNow = File_RW_Ops::pread(fh, data + read, lenNow, readOffset + read); + if (readNow > 0) { + read += readNow; + } else { + return (read > 0) ? read : readNow; + } + } + return read; } -- cgit v1.2.3