1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

Added error detection to the new ::rename calls.

This commit is contained in:
Patrick LeBlanc
2020-05-22 08:45:28 -04:00
parent c29050899d
commit 43585d55cd

View File

@ -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);