diff options
Diffstat (limited to 'src/mongo/logger/rotatable_file_writer.h')
-rw-r--r-- | src/mongo/logger/rotatable_file_writer.h | 156 |
1 files changed, 80 insertions, 76 deletions
diff --git a/src/mongo/logger/rotatable_file_writer.h b/src/mongo/logger/rotatable_file_writer.h index c6ad0c364d7..b20fb818a9f 100644 --- a/src/mongo/logger/rotatable_file_writer.h +++ b/src/mongo/logger/rotatable_file_writer.h @@ -36,93 +36,97 @@ namespace mongo { namespace logger { +/** + * A synchronized file output stream writer, with support for file rotation. + * + * To enforce proper locking, instances of RotatableFileWriter may only be manipulated by + * instantiating a RotatableFileWriter::Use guard object, which exposes the relevant + * manipulation methods for the stream. For any instance of RotatableFileWriter, at most one + * fully constructed instance of RotatableFileWriter::Use exists at a time, providing mutual + * exclusion. + * + * Behavior is undefined if two instances of RotatableFileWriter should simultaneously have the + * same value for their fileName. + */ +class RotatableFileWriter { + MONGO_DISALLOW_COPYING(RotatableFileWriter); + +public: /** - * A synchronized file output stream writer, with support for file rotation. - * - * To enforce proper locking, instances of RotatableFileWriter may only be manipulated by - * instantiating a RotatableFileWriter::Use guard object, which exposes the relevant - * manipulation methods for the stream. For any instance of RotatableFileWriter, at most one - * fully constructed instance of RotatableFileWriter::Use exists at a time, providing mutual - * exclusion. - * - * Behavior is undefined if two instances of RotatableFileWriter should simultaneously have the - * same value for their fileName. + * Guard class representing synchronous use of an instance of RotatableFileWriter. */ - class RotatableFileWriter { - MONGO_DISALLOW_COPYING(RotatableFileWriter); + class Use { + MONGO_DISALLOW_COPYING(Use); + public: /** - * Guard class representing synchronous use of an instance of RotatableFileWriter. + * Constructs a Use object for "writer", and lock "writer". + */ + explicit Use(RotatableFileWriter* writer); + + /** + * Sets the name of the target file to which stream() writes to "name". + * + * May be called repeatedly. + * + * If this method does not return Status::OK(), it is not safe to call rotate() or + * stream(). + * + * Set "append" to true to open "name" in append mode. Otherwise, it is truncated. + */ + Status setFileName(const std::string& name, bool append); + + /** + * Rotates the currently opened file into "renameTarget", and open a new file + * with the name previously set via setFileName(). + * + * renameFiles - true we rename the log file, false we expect it was renamed externally + * + * Returns Status::OK() on success. If the rename fails, returns + * ErrorCodes::FileRenameFailed, and the stream continues to write to the unrotated + * file. If the rename succeeds but the subsequent file open fails, returns + * ErrorCodes::FileNotOpen, and the stream continues to target the original file, though + * under its new name. */ - class Use { - MONGO_DISALLOW_COPYING(Use); - public: - /** - * Constructs a Use object for "writer", and lock "writer". - */ - explicit Use(RotatableFileWriter* writer); - - /** - * Sets the name of the target file to which stream() writes to "name". - * - * May be called repeatedly. - * - * If this method does not return Status::OK(), it is not safe to call rotate() or - * stream(). - * - * Set "append" to true to open "name" in append mode. Otherwise, it is truncated. - */ - Status setFileName(const std::string& name, bool append); - - /** - * Rotates the currently opened file into "renameTarget", and open a new file - * with the name previously set via setFileName(). - * - * renameFiles - true we rename the log file, false we expect it was renamed externally - * - * Returns Status::OK() on success. If the rename fails, returns - * ErrorCodes::FileRenameFailed, and the stream continues to write to the unrotated - * file. If the rename succeeds but the subsequent file open fails, returns - * ErrorCodes::FileNotOpen, and the stream continues to target the original file, though - * under its new name. - */ - Status rotate(bool renameFile, const std::string& renameTarget); - - /** - * Returns the status of the stream. - * - * One of Status::OK(), ErrorCodes::FileNotOpen and ErrorCodes::FileStreamFailed. - */ - Status status(); - - /** - * Returns a reference to the std::ostream() through which users may write to the file. - */ - std::ostream& stream() { return *_writer->_stream; } - - private: - /** - * Helper that opens the file named by setFileName(), in the mode specified by "append". - * - * Returns Status::OK() on success and ErrorCodes::FileNotOpen on failure. - */ - Status _openFileStream(bool append); - - RotatableFileWriter* _writer; - stdx::unique_lock<stdx::mutex> _lock; - }; + Status rotate(bool renameFile, const std::string& renameTarget); /** - * Constructs an instance of RotatableFileWriter. + * Returns the status of the stream. + * + * One of Status::OK(), ErrorCodes::FileNotOpen and ErrorCodes::FileStreamFailed. */ - RotatableFileWriter(); + Status status(); + + /** + * Returns a reference to the std::ostream() through which users may write to the file. + */ + std::ostream& stream() { + return *_writer->_stream; + } private: - friend class RotatableFileWriter::Use; - stdx::mutex _mutex; - std::string _fileName; - std::unique_ptr<std::ostream> _stream; + /** + * Helper that opens the file named by setFileName(), in the mode specified by "append". + * + * Returns Status::OK() on success and ErrorCodes::FileNotOpen on failure. + */ + Status _openFileStream(bool append); + + RotatableFileWriter* _writer; + stdx::unique_lock<stdx::mutex> _lock; }; + /** + * Constructs an instance of RotatableFileWriter. + */ + RotatableFileWriter(); + +private: + friend class RotatableFileWriter::Use; + stdx::mutex _mutex; + std::string _fileName; + std::unique_ptr<std::ostream> _stream; +}; + } // namespace logger } // namespace mongo |