From 021009fe999b7b2ff910ed767c9e75059c205466 Mon Sep 17 00:00:00 2001 From: benthompson15 Date: Mon, 16 Sep 2019 16:26:42 -0500 Subject: [PATCH] Change posixtask::read to return int instead of bool and handle when data read is short of expected message length. --- storage-manager/src/AppendTask.cpp | 13 +++++++------ storage-manager/src/CopyTask.cpp | 2 +- storage-manager/src/ListDirectoryTask.cpp | 2 +- storage-manager/src/PosixTask.cpp | 10 ++++++---- storage-manager/src/PosixTask.h | 2 +- storage-manager/src/ReadTask.cpp | 2 +- storage-manager/src/StatTask.cpp | 2 +- storage-manager/src/TruncateTask.cpp | 2 +- storage-manager/src/UnlinkTask.cpp | 2 +- storage-manager/src/WriteTask.cpp | 13 +++++++------ 10 files changed, 27 insertions(+), 23 deletions(-) diff --git a/storage-manager/src/AppendTask.cpp b/storage-manager/src/AppendTask.cpp index 79333a737..449ff697b 100644 --- a/storage-manager/src/AppendTask.cpp +++ b/storage-manager/src/AppendTask.cpp @@ -35,7 +35,7 @@ AppendTask::~AppendTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ @@ -46,7 +46,7 @@ AppendTask::~AppendTask() bool AppendTask::run() { SMLogging* logger = SMLogging::get(); - bool success; + int success; uint8_t cmdbuf[1024] = {0}; ssize_t err; @@ -77,14 +77,16 @@ bool AppendTask::run() uint toRead = min(cmd->count - readCount, bufsize); success = read(&databuf[0], toRead); check_error("AppendTask read data", false); - readCount += toRead; + if (success==0) + break; + readCount += success; uint writePos = 0; while (writeCount < readCount) { try { - err = ioc->append(cmd->filename, &databuf[writePos], toRead - writePos); + err = ioc->append(cmd->filename, &databuf[writePos], success - writePos); } catch (exception &e) { @@ -112,8 +114,7 @@ bool AppendTask::run() } else resp->returnCode = writeCount; - success = write(*resp, payloadLen); - return success; + return write(*resp, payloadLen); } } diff --git a/storage-manager/src/CopyTask.cpp b/storage-manager/src/CopyTask.cpp index 4b657e44c..7943d6cbc 100644 --- a/storage-manager/src/CopyTask.cpp +++ b/storage-manager/src/CopyTask.cpp @@ -35,7 +35,7 @@ CopyTask::~CopyTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/ListDirectoryTask.cpp b/storage-manager/src/ListDirectoryTask.cpp index 3bfee2f22..c474868e9 100644 --- a/storage-manager/src/ListDirectoryTask.cpp +++ b/storage-manager/src/ListDirectoryTask.cpp @@ -37,7 +37,7 @@ ListDirectoryTask::~ListDirectoryTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/PosixTask.cpp b/storage-manager/src/PosixTask.cpp index 31486e49f..a7096c136 100644 --- a/storage-manager/src/PosixTask.cpp +++ b/storage-manager/src/PosixTask.cpp @@ -75,18 +75,20 @@ uint PosixTask::getLength() } // todo, need this to return an int instead of a bool b/c it modifies the length of the read -bool PosixTask::read(uint8_t *buf, uint length) +int PosixTask::read(uint8_t *buf, uint length) { if (length > remainingLengthForCaller) length = remainingLengthForCaller; if (length == 0) - return false; + return 0; uint count = 0; int err; + // copy data from the local buffer first. uint dataInBuffer = bufferLen - bufferPos; + if (length <= dataInBuffer) { memcpy(buf, &localBuffer[bufferPos], length); @@ -109,7 +111,7 @@ bool PosixTask::read(uint8_t *buf, uint length) { err = ::recv(sock, &buf[count], length - count, 0); if (err < 0) - return false; + return err; count += err; remainingLengthInStream -= err; @@ -119,7 +121,7 @@ bool PosixTask::read(uint8_t *buf, uint length) /* The caller's request has been satisfied here. If there is remaining data in the stream get what's available. */ primeBuffer(); - return true; + return count; } void PosixTask::primeBuffer() diff --git a/storage-manager/src/PosixTask.h b/storage-manager/src/PosixTask.h index a4a47f5da..c8025eb88 100644 --- a/storage-manager/src/PosixTask.h +++ b/storage-manager/src/PosixTask.h @@ -41,7 +41,7 @@ class PosixTask void primeBuffer(); protected: - bool read(uint8_t *buf, uint length); + int read(uint8_t *buf, uint length); bool write(const std::vector &buf); bool write(sm_response &resp, uint payloadLength); bool write(const uint8_t *buf, uint length); diff --git a/storage-manager/src/ReadTask.cpp b/storage-manager/src/ReadTask.cpp index 8b6f72e5c..c32c96a1d 100644 --- a/storage-manager/src/ReadTask.cpp +++ b/storage-manager/src/ReadTask.cpp @@ -35,7 +35,7 @@ ReadTask::~ReadTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/StatTask.cpp b/storage-manager/src/StatTask.cpp index 8c85e4e53..827189964 100644 --- a/storage-manager/src/StatTask.cpp +++ b/storage-manager/src/StatTask.cpp @@ -39,7 +39,7 @@ StatTask::~StatTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/TruncateTask.cpp b/storage-manager/src/TruncateTask.cpp index c0d33f43c..e76975133 100644 --- a/storage-manager/src/TruncateTask.cpp +++ b/storage-manager/src/TruncateTask.cpp @@ -35,7 +35,7 @@ TruncateTask::~TruncateTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/UnlinkTask.cpp b/storage-manager/src/UnlinkTask.cpp index 9eae27aee..ccb777a47 100644 --- a/storage-manager/src/UnlinkTask.cpp +++ b/storage-manager/src/UnlinkTask.cpp @@ -35,7 +35,7 @@ UnlinkTask::~UnlinkTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ diff --git a/storage-manager/src/WriteTask.cpp b/storage-manager/src/WriteTask.cpp index c8e0e2372..f2e46cf7c 100644 --- a/storage-manager/src/WriteTask.cpp +++ b/storage-manager/src/WriteTask.cpp @@ -36,7 +36,7 @@ WriteTask::~WriteTask() } #define check_error(msg, ret) \ - if (!success) \ + if (success<0) \ { \ handleError(msg, errno); \ return ret; \ @@ -47,7 +47,7 @@ WriteTask::~WriteTask() bool WriteTask::run() { SMLogging* logger = SMLogging::get(); - bool success; + int success; uint8_t cmdbuf[1024] = {0}; success = read(cmdbuf, sizeof(write_cmd)); @@ -77,14 +77,16 @@ bool WriteTask::run() uint toRead = min(cmd->count - readCount, bufsize); success = read(&databuf[0], toRead); check_error("WriteTask read data", false); - readCount += toRead; + if (success==0) + break; + readCount += success; uint writePos = 0; ssize_t err; while (writeCount < readCount) { try { - err = ioc->write(cmd->filename, &databuf[writePos], cmd->offset + writeCount, toRead - writePos); + err = ioc->write(cmd->filename, &databuf[writePos], cmd->offset + writeCount, success - writePos); } catch (exception &e) { @@ -113,8 +115,7 @@ bool WriteTask::run() } else resp->returnCode = writeCount; - success = write(*resp, payloadLen); - return success; + return write(*resp, payloadLen); } }