From 34457de36ea84b1ffc4fc286050ef05e96a0adff Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 15 Sep 2016 11:01:53 +0000 Subject: Honour the chunking during all use of the interface. --- fastos/src/vespa/fastos/file.cpp | 8 +------- fastos/src/vespa/fastos/file.h | 2 +- fastos/src/vespa/fastos/linux_file.cpp | 19 +++++++++++++++++-- fastos/src/vespa/fastos/linux_file.h | 1 + 4 files changed, 20 insertions(+), 10 deletions(-) (limited to 'fastos') diff --git a/fastos/src/vespa/fastos/file.cpp b/fastos/src/vespa/fastos/file.cpp index 8e349d6c4e6..e1592ffb409 100644 --- a/fastos/src/vespa/fastos/file.cpp +++ b/fastos/src/vespa/fastos/file.cpp @@ -76,13 +76,7 @@ FastOS_FileInterface::ReadBuf(void *buffer, size_t length) void FastOS_FileInterface::WriteBuf(const void *buffer, size_t length) { - const char * data = static_cast(buffer); - while (length > 0) { - size_t len = std::min(_writeChunkSize, length); - WriteBufInternal(data, len); - data += len; - length -= len; - } + WriteBufInternal(buffer, length); } void diff --git a/fastos/src/vespa/fastos/file.h b/fastos/src/vespa/fastos/file.h index ebe835172fe..2dfbcb3eb5a 100644 --- a/fastos/src/vespa/fastos/file.h +++ b/fastos/src/vespa/fastos/file.h @@ -107,7 +107,6 @@ protected: bool _directIOEnabled; bool _syncWritesEnabled; static FailedHandler _failedHandler; -; public: static int getDefaultFAdviseOptions() { return _defaultFAdviseOptions; } @@ -518,6 +517,7 @@ public: * Set the write chunk size used in WriteBuf. */ void SetWriteChunkSize(size_t writeChunkSize); + size_t getWriteChunkSize() const { return _writeChunkSize; } /** * 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 e57e00645af..b34e54c27b8 100644 --- a/fastos/src/vespa/fastos/linux_file.cpp +++ b/fastos/src/vespa/fastos/linux_file.cpp @@ -189,9 +189,24 @@ FastOS_Linux_File::Read(void *buffer, size_t len) ssize_t FastOS_Linux_File::Write2(const void *buffer, size_t length) { - if (length == 0) { return 0; } - ssize_t writeRes; + const char * data = static_cast(buffer); + ssize_t written(0); + while (written < ssize_t(length)) { + size_t len = std::min(getWriteChunkSize(), length - written); + ssize_t writtenNow = internalWrite2(data + written, len); + if (writtenNow > 0) { + written += writtenNow; + } else { + return written; + } + } + return written; +} +ssize_t +FastOS_Linux_File::internalWrite2(const void *buffer, size_t length) +{ + ssize_t writeRes; if (_directIOEnabled) { if (DIRECTIOPOSSIBLE(buffer, length, _filePointer)) { writeRes = writeInternal(_filedes, buffer, length, _filePointer); diff --git a/fastos/src/vespa/fastos/linux_file.h b/fastos/src/vespa/fastos/linux_file.h index 41fe097adb8..894e2cee200 100644 --- a/fastos/src/vespa/fastos/linux_file.h +++ b/fastos/src/vespa/fastos/linux_file.h @@ -46,6 +46,7 @@ public: static size_t getMaxDirectIOMemAlign(); static void *allocateGenericDirectIOBuffer(size_t byteSize, void *&realPtr); private: + ssize_t internalWrite2(const void *buffer, size_t len); ssize_t readUnalignedEnd(void *buffer, size_t length, int64_t readOffset); ssize_t writeUnalignedEnd(const void *buffer, size_t length, int64_t readOffset); ssize_t ReadBufInternal(void *buffer, size_t length, int64_t readOffset); -- cgit v1.2.3