summaryrefslogtreecommitdiffstats
path: root/fastos
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-01-26 12:01:30 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-01-26 12:01:30 +0000
commit8cf65d226a71500b928124e21ddd21396385d49a (patch)
tree84a1fd02be9ca792402f56cd27d3427a1b410a74 /fastos
parent1ecbb8ced4c2599155a2438625987b78e174bd5a (diff)
Chunk large reads into multiple smaller reads of max 64MB.
Diffstat (limited to 'fastos')
-rw-r--r--fastos/src/vespa/fastos/file.cpp11
-rw-r--r--fastos/src/vespa/fastos/file.h6
-rw-r--r--fastos/src/vespa/fastos/linux_file.cpp15
3 files changed, 18 insertions, 14 deletions
diff --git a/fastos/src/vespa/fastos/file.cpp b/fastos/src/vespa/fastos/file.cpp
index 1382aef7386..15a817c0bff 100644
--- a/fastos/src/vespa/fastos/file.cpp
+++ b/fastos/src/vespa/fastos/file.cpp
@@ -34,11 +34,11 @@ int FastOS_FileInterface::_defaultFAdviseOptions = POSIX_FADV_NORMAL;
int FastOS_FileInterface::_defaultFAdviseOptions = 0;
#endif
-static const size_t MAX_WRITE_CHUNK_SIZE = 0x4000000; // 64 MB
+static const size_t MAX_CHUNK_SIZE = 0x4000000; // 64 MB
FastOS_FileInterface::FastOS_FileInterface(const char *filename)
: _fAdviseOptions(_defaultFAdviseOptions),
- _writeChunkSize(MAX_WRITE_CHUNK_SIZE),
+ _chunkSize(MAX_CHUNK_SIZE),
_filename(),
_openFlags(0),
_directIOEnabled(false),
@@ -140,13 +140,6 @@ FastOS_FileInterface::EnableDirectIO()
void
-FastOS_FileInterface::SetWriteChunkSize(size_t writeChunkSize)
-{
- _writeChunkSize = writeChunkSize;
-}
-
-
-void
FastOS_FileInterface::EnableSyncWrites()
{
if (!IsOpened())
diff --git a/fastos/src/vespa/fastos/file.h b/fastos/src/vespa/fastos/file.h
index 2d83a1766f0..a352c6281a3 100644
--- a/fastos/src/vespa/fastos/file.h
+++ b/fastos/src/vespa/fastos/file.h
@@ -84,7 +84,7 @@ private:
// And setFAdviseOptions() per file.
static int _defaultFAdviseOptions;
int _fAdviseOptions;
- size_t _writeChunkSize;
+ size_t _chunkSize;
void WriteBufInternal(const void *buffer, size_t length);
protected:
@@ -485,8 +485,8 @@ public:
/**
* Set the write chunk size used in WriteBuf.
*/
- void SetWriteChunkSize(size_t writeChunkSize);
- size_t getWriteChunkSize() const { return _writeChunkSize; }
+ void setChunkSize(size_t chunkSize) { _chunkSize = chunkSize; }
+ size_t getChunkSize() const { return _chunkSize; }
/**
* Get restrictions for direct disk I/O. The file should be opened
diff --git a/fastos/src/vespa/fastos/linux_file.cpp b/fastos/src/vespa/fastos/linux_file.cpp
index 3a59b862a52..27beb1242d1 100644
--- a/fastos/src/vespa/fastos/linux_file.cpp
+++ b/fastos/src/vespa/fastos/linux_file.cpp
@@ -44,7 +44,18 @@ FastOS_Linux_File::readInternal(int fh, void *buffer, size_t length, int64_t rea
ssize_t
FastOS_Linux_File::readInternal(int fh, void *buffer, size_t length)
{
- return File_RW_Ops::read(fh, buffer, length);
+ char * data = static_cast<char *>(buffer);
+ ssize_t read(0);
+ while (read < ssize_t(length)) {
+ size_t lenNow = std::min(getChunkSize(), length - read);
+ ssize_t readNow = File_RW_Ops::read(fh, data + read, lenNow);
+ if (readNow > 0) {
+ read += readNow;
+ } else {
+ return (read > 0) ? read : readNow;
+ }
+ }
+ return read;
}
@@ -169,7 +180,7 @@ FastOS_Linux_File::Write2(const void *buffer, size_t length)
const char * data = static_cast<const char *>(buffer);
ssize_t written(0);
while (written < ssize_t(length)) {
- size_t lenNow = std::min(getWriteChunkSize(), length - written);
+ size_t lenNow = std::min(getChunkSize(), length - written);
ssize_t writtenNow = internalWrite2(data + written, lenNow);
if (writtenNow > 0) {
written += writtenNow;