summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2019-06-05 14:07:51 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2019-06-25 11:38:49 -0400
commit5f87413e36fd9f57dbfbf10c2790dd7bce386d95 (patch)
treed1231ffc4476581a8c73da4001daf5b002acd2f5
parent60c8a0058cf6de8db7f926abd3fa71c5708ab5e3 (diff)
downloadmongo-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.cpp43
-rw-r--r--src/mongo/db/ftdc/file_manager.h2
-rw-r--r--src/mongo/db/ftdc/file_reader.cpp21
-rw-r--r--src/mongo/db/ftdc/file_writer.cpp9
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();
}