diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2019-06-05 14:07:51 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2019-06-25 11:38:49 -0400 |
commit | 5f87413e36fd9f57dbfbf10c2790dd7bce386d95 (patch) | |
tree | d1231ffc4476581a8c73da4001daf5b002acd2f5 | |
parent | 60c8a0058cf6de8db7f926abd3fa71c5708ab5e3 (diff) | |
download | mongo-5f87413e36fd9f57dbfbf10c2790dd7bce386d95.tar.gz |
SERVER-41148 FTDC is calling boost::filesystem without passing an error_code parameter
(cherry picked from commit d8e2c4748fda6fc24ea0d1bb1541ea9c66f5e1cf)
-rw-r--r-- | src/mongo/db/ftdc/file_manager.cpp | 43 | ||||
-rw-r--r-- | src/mongo/db/ftdc/file_manager.h | 2 | ||||
-rw-r--r-- | src/mongo/db/ftdc/file_reader.cpp | 21 | ||||
-rw-r--r-- | src/mongo/db/ftdc/file_writer.cpp | 9 |
4 files changed, 59 insertions, 16 deletions
diff --git a/src/mongo/db/ftdc/file_manager.cpp b/src/mongo/db/ftdc/file_manager.cpp index a2b1159de4c..4f9d7af66d5 100644 --- a/src/mongo/db/ftdc/file_manager.cpp +++ b/src/mongo/db/ftdc/file_manager.cpp @@ -75,7 +75,7 @@ StatusWith<std::unique_ptr<FTDCFileManager>> FTDCFileManager::create( boost::filesystem::create_directories(dir, ec); if (ec) { return {ErrorCodes::NonExistentPath, - str::stream() << "\'" << dir.generic_string() << "\' could not be created: " + str::stream() << "\"" << dir.generic_string() << "\" could not be created: " << ec.message()}; } } @@ -101,7 +101,10 @@ StatusWith<std::unique_ptr<FTDCFileManager>> FTDCFileManager::create( } // Rotate as needed after we appended interim data to the archive file - mgr->trimDirectory(files); + s = mgr->trimDirectory(files); + if (!s.isOK()) { + return s; + } return {std::move(mgr)}; } @@ -205,22 +208,38 @@ Status FTDCFileManager::openArchiveFile( return Status::OK(); } -void FTDCFileManager::trimDirectory(std::vector<boost::filesystem::path>& files) { +Status FTDCFileManager::trimDirectory(std::vector<boost::filesystem::path>& files) { std::uint64_t maxSize = _config->maxDirectorySizeBytes; std::uint64_t size = 0; dassert(std::is_sorted(files.begin(), files.end())); for (auto it = files.rbegin(); it != files.rend(); ++it) { - std::uint64_t fileSize = boost::filesystem::file_size(*it); + boost::system::error_code ec; + std::uint64_t fileSize = boost::filesystem::file_size(*it, ec); + if (ec) { + return {ErrorCodes::NonExistentPath, + str::stream() << "\"" << (*it).generic_string() + << "\" file size could not be retrieved during trimming: " + << ec.message()}; + } size += fileSize; if (size >= maxSize) { LOG(1) << "Cleaning file over full-time diagnostic data capture quota, file: " << (*it).generic_string() << " with size " << fileSize; - boost::filesystem::remove(*it); + + boost::filesystem::remove(*it, ec); + if (ec) { + return {ErrorCodes::NonExistentPath, + str::stream() << "\"" << (*it).generic_string() + << "\" could not be removed during trimming: " + << ec.message()}; + } } } + + return Status::OK(); } std::vector<std::tuple<FTDCBSONUtil::FTDCType, BSONObj, Date_t>> @@ -234,7 +253,14 @@ FTDCFileManager::recoverInterimFile() { return docs; } - size_t size = boost::filesystem::file_size(interimFile); + boost::system::error_code ec; + size_t size = boost::filesystem::file_size(interimFile, ec); + if (ec) { + log() << "Recover interim file failed as the file size could not be checked: " + << ec.message(); + return docs; + } + if (size == 0) { return docs; } @@ -280,7 +306,10 @@ Status FTDCFileManager::rotate(Client* client) { auto files = scanDirectory(); // Rotate as needed - trimDirectory(files); + s = trimDirectory(files); + if (!s.isOK()) { + return s; + } auto swFile = generateArchiveFileName(_path, terseUTCCurrentTime()); if (!swFile.isOK()) { diff --git a/src/mongo/db/ftdc/file_manager.h b/src/mongo/db/ftdc/file_manager.h index adc2528ee2a..8d5df763839 100644 --- a/src/mongo/db/ftdc/file_manager.h +++ b/src/mongo/db/ftdc/file_manager.h @@ -118,7 +118,7 @@ private: /** * Removes the oldest files if the directory is over quota */ - void trimDirectory(std::vector<boost::filesystem::path>& files); + Status trimDirectory(std::vector<boost::filesystem::path>& files); /** * Open a new file for writing. diff --git a/src/mongo/db/ftdc/file_reader.cpp b/src/mongo/db/ftdc/file_reader.cpp index 54b79151958..1b739879c9c 100644 --- a/src/mongo/db/ftdc/file_reader.cpp +++ b/src/mongo/db/ftdc/file_reader.cpp @@ -161,8 +161,8 @@ StatusWith<BSONObj> FTDCFileReader::readDocument() { } return {ErrorCodes::FileStreamFailed, - str::stream() << "Failed to read 4 bytes from file \'" << _file.generic_string() - << "\'"}; + str::stream() << "Failed to read 4 bytes from file \"" << _file.generic_string() + << "\""}; } std::uint32_t bsonLength = ConstDataView(buf).read<LittleEndian<std::int32_t>>(); @@ -176,8 +176,8 @@ StatusWith<BSONObj> FTDCFileReader::readDocument() { // Reads past the end of the file will be caught below if (bsonLength > _fileSize || bsonLength < BSONObj::kMinBSONLength) { return {ErrorCodes::InvalidLength, - str::stream() << "Invalid BSON length found in file \'" << _file.generic_string() - << "\'"}; + str::stream() << "Invalid BSON length found in file \"" << _file.generic_string() + << "\""}; } // Read the BSON document @@ -193,9 +193,9 @@ StatusWith<BSONObj> FTDCFileReader::readDocument() { if (readSize != _stream.gcount()) { return {ErrorCodes::FileStreamFailed, - str::stream() << "Failed to read " << readSize << " bytes from file \'" + str::stream() << "Failed to read " << readSize << " bytes from file \"" << _file.generic_string() - << "\'"}; + << "\""}; } ConstDataRange cdr(_buffer.data(), _buffer.data() + bsonLength); @@ -215,7 +215,14 @@ Status FTDCFileReader::open(const boost::filesystem::path& file) { return Status(ErrorCodes::FileStreamFailed, "Failed to open file " + file.generic_string()); } - _fileSize = boost::filesystem::file_size(file); + boost::system::error_code ec; + _fileSize = boost::filesystem::file_size(file, ec); + if (ec) { + return {ErrorCodes::NonExistentPath, + str::stream() << "\"" << file.generic_string() + << "\" file size could not be retrieved during open: " + << ec.message()}; + } _file = file; diff --git a/src/mongo/db/ftdc/file_writer.cpp b/src/mongo/db/ftdc/file_writer.cpp index cd3ffdc45cf..b5483a62f24 100644 --- a/src/mongo/db/ftdc/file_writer.cpp +++ b/src/mongo/db/ftdc/file_writer.cpp @@ -204,7 +204,14 @@ Status FTDCFileWriter::flush(const boost::optional<ConstDataRange>& range, Date_ } } - boost::filesystem::remove(_interimFile); + boost::system::error_code ec; + boost::filesystem::remove(_interimFile, ec); + if (ec) { + return {ErrorCodes::NonExistentPath, + str::stream() << "\"" << _interimFile.generic_string() + << "\" could not be removed during flush: " + << ec.message()}; + } return Status::OK(); } |