diff options
-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 6c778448aad..9362bd3b8f6 100644 --- a/src/mongo/db/ftdc/file_manager.cpp +++ b/src/mongo/db/ftdc/file_manager.cpp @@ -77,7 +77,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()}; } } @@ -103,7 +103,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)}; } @@ -207,22 +210,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>> @@ -236,7 +255,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; } @@ -282,7 +308,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 9c3b8c10925..857a52278fb 100644 --- a/src/mongo/db/ftdc/file_manager.h +++ b/src/mongo/db/ftdc/file_manager.h @@ -120,7 +120,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 f00279ff879..6e7e53e2be2 100644 --- a/src/mongo/db/ftdc/file_reader.cpp +++ b/src/mongo/db/ftdc/file_reader.cpp @@ -163,8 +163,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>>(); @@ -178,8 +178,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 @@ -195,9 +195,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); @@ -217,7 +217,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 85626bffbfb..801230773d9 100644 --- a/src/mongo/db/ftdc/file_writer.cpp +++ b/src/mongo/db/ftdc/file_writer.cpp @@ -206,7 +206,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(); } |