From 43585d55cd417f1424363dd731b3c95d60af1652 Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Fri, 22 May 2020 08:45:28 -0400 Subject: [PATCH] Added error detection to the new ::rename calls. --- storage-manager/src/IOCoordinator.cpp | 31 ++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/storage-manager/src/IOCoordinator.cpp b/storage-manager/src/IOCoordinator.cpp index 86e0a9989..d37dcf707 100644 --- a/storage-manager/src/IOCoordinator.cpp +++ b/storage-manager/src/IOCoordinator.cpp @@ -505,11 +505,21 @@ ssize_t IOCoordinator::_write(const boost::filesystem::path &filename, const uin dataRemaining -= err; count += err; iocBytesWritten += err; - // get a new name for the object - bf::path oldPath = firstDir/newObject.key; + // get a new name for the object + string oldKey = newObject.key; newObject.key = metadata.getNewKeyFromOldKey(newObject.key, err + objectOffset); - ::rename(oldPath.string().c_str(), (firstDir/newObject.key).string().c_str()); + int renameErr = ::rename((firstDir/oldKey).string().c_str(), (firstDir/newObject.key).string().c_str()); + int renameErrno = errno; + if (renameErr < 0) + { + ostringstream oss; + char buf[80]; + oss << "IOCoordinator::write(): Failed to rename " << (firstDir/oldKey).string() << " to " << + (firstDir/newObject.key).string() << "! Got " << strerror_r(renameErrno, buf, 80); + logger->log(LOG_ERR, oss.str().c_str()); + newObject.key = oldKey; + } // rename and resize the object in metadata metadata.updateEntry(newObject.offset, newObject.key, (err + objectOffset)); @@ -643,9 +653,20 @@ ssize_t IOCoordinator::append(const char *_filename, const uint8_t *data, size_t iocBytesWritten += err; if (err < (int64_t) writeLength) { - bf::path oldPath = firstDir/newObject.key; + string oldKey = newObject.key; newObject.key = metadata.getNewKeyFromOldKey(newObject.key, err + newObject.offset); - ::rename(oldPath.string().c_str(), (firstDir/newObject.key).string().c_str()); + int renameErr = ::rename((firstDir/oldKey).string().c_str(), (firstDir/newObject.key).string().c_str()); + int renameErrno = errno; + if (renameErr < 0) + { + ostringstream oss; + char buf[80]; + oss << "IOCoordinator::write(): Failed to rename " << (firstDir/oldKey).string() << " to " << + (firstDir/newObject.key).string() << "! Got " << strerror_r(renameErrno, buf, 80); + logger->log(LOG_ERR, oss.str().c_str()); + newObject.key = oldKey; + } + metadata.updateEntry(newObject.offset, newObject.key, err + newObject.offset); } cache->newObject(firstDir, newObject.key,err);