From 689aaa9ff0a517185444e6725474ed16d6da98f5 Mon Sep 17 00:00:00 2001 From: Amir Malekpour Date: Tue, 19 Sep 2017 12:23:41 -0700 Subject: [PATCH] RROW-1500: [C++] Do not ignore return value from truncate in MemoryMappedFile::Create Author: Amir Malekpour --- cpp/src/arrow/io/file.cc | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/cpp/src/arrow/io/file.cc b/cpp/src/arrow/io/file.cc index 843cfe89fc0..ca536321ba3 100644 --- a/cpp/src/arrow/io/file.cc +++ b/cpp/src/arrow/io/file.cc @@ -134,12 +134,13 @@ struct PlatformFilename { }; #endif -static inline Status CheckOpenResult(int ret, int errno_actual, - const PlatformFilename& file_name) { +static inline Status CheckFileOpResult(int ret, int errno_actual, + const PlatformFilename& file_name, + const std::string& opname) { if (ret == -1) { - // TODO: errno codes to strings std::stringstream ss; - ss << "Failed to open local file: " << file_name.string(); + ss << "Failed to " << opname << " file: " << file_name.string(); + ss << " , error: " << std::strerror(errno_actual); return Status::IOError(ss.str()); } return Status::OK(); @@ -168,7 +169,7 @@ static inline Status FileOpenReadable(const PlatformFilename& file_name, int* fd errno_actual = errno; #endif - return CheckOpenResult(ret, errno_actual, file_name); + return CheckFileOpResult(ret, errno_actual, file_name, "open local"); } static inline Status FileOpenWriteable(const PlatformFilename& file_name, bool write_only, @@ -211,7 +212,7 @@ static inline Status FileOpenWriteable(const PlatformFilename& file_name, bool w ret = *fd = open(file_name.c_str(), oflag, ARROW_WRITE_SHMODE); #endif - return CheckOpenResult(ret, errno_actual, file_name); + return CheckFileOpResult(ret, errno_actual, file_name, "open local"); } static inline Status FileTell(int fd, int64_t* pos) { @@ -599,13 +600,21 @@ MemoryMappedFile::~MemoryMappedFile() {} Status MemoryMappedFile::Create(const std::string& path, int64_t size, std::shared_ptr* out) { + int ret; + errno_t errno_actual; std::shared_ptr file; RETURN_NOT_OK(FileOutputStream::Open(path, &file)); + #ifdef _MSC_VER - _chsize_s(file->file_descriptor(), static_cast(size)); + errno_actual = _chsize_s(file->file_descriptor(), static_cast(size)); + ret = errno_actual == 0 ? 0 : -1; #else - ftruncate(file->file_descriptor(), static_cast(size)); + ret = ftruncate(file->file_descriptor(), static_cast(size)); + errno_actual = errno; #endif + + RETURN_NOT_OK(CheckFileOpResult(ret, errno_actual, PlatformFilename(path), "truncate")); + RETURN_NOT_OK(file->Close()); return MemoryMappedFile::Open(path, FileMode::READWRITE, out); }