1 
2 /**
3  *    Copyright (C) 2018-present MongoDB, Inc.
4  *
5  *    This program is free software: you can redistribute it and/or modify
6  *    it under the terms of the Server Side Public License, version 1,
7  *    as published by MongoDB, Inc.
8  *
9  *    This program is distributed in the hope that it will be useful,
10  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *    Server Side Public License for more details.
13  *
14  *    You should have received a copy of the Server Side Public License
15  *    along with this program. If not, see
16  *    <http://www.mongodb.com/licensing/server-side-public-license>.
17  *
18  *    As a special exception, the copyright holders give permission to link the
19  *    code of portions of this program with the OpenSSL library under certain
20  *    conditions as described in each individual source file and distribute
21  *    linked combinations including the program with the OpenSSL library. You
22  *    must comply with the Server Side Public License in all respects for
23  *    all of the code used other than as permitted herein. If you modify file(s)
24  *    with this exception, you may extend this exception to your version of the
25  *    file(s), but you are not obligated to do so. If you do not wish to do so,
26  *    delete this exception statement from your version. If you delete this
27  *    exception statement from all source files in the program, then also delete
28  *    it in the license file.
29  */
30 
31 #pragma once
32 
33 #include <string>
34 #include <utility>
35 #include <vector>
36 
37 #include "mongo/base/disallow_copying.h"
38 #include "mongo/base/status.h"
39 #include "mongo/base/status_with.h"
40 #include "mongo/logger/rotatable_file_writer.h"
41 #include "mongo/platform/unordered_map.h"
42 
43 namespace mongo {
44 namespace logger {
45 
46 typedef StatusWith<RotatableFileWriter*> StatusWithRotatableFileWriter;
47 
48 /**
49  * Utility object that owns and manages rotation for RotatableFileWriters.
50  *
51  * Unlike RotatableFileWriter, this type leaves synchronization to its consumers.
52  */
53 class RotatableFileManager {
54     MONGO_DISALLOW_COPYING(RotatableFileManager);
55 
56 public:
57     typedef std::pair<std::string, Status> FileNameStatusPair;
58     typedef std::vector<FileNameStatusPair> FileNameStatusPairVector;
59 
60     RotatableFileManager();
61     ~RotatableFileManager();
62 
63     /**
64      * Opens "name" in mode "append" and returns a new RotatableFileWriter set to
65      * operate on the file.
66      *
67      * If the manager already has opened "name", returns ErrorCodes::FileAlreadyOpen.
68      * May also return failure codes issued by RotatableFileWriter::Use::setFileName().
69      */
70     StatusWithRotatableFileWriter openFile(const std::string& name, bool append);
71 
72     /**
73      * Gets a RotatableFileWriter for writing to "name", if the manager owns one, or NULL if
74      * not.
75      */
76     RotatableFileWriter* getFile(const std::string& name);
77 
78     /**
79      * Rotates all managed files, renaming each file by appending "renameTargetSuffix".
80      *
81      * renameFiles - true we rename the log file, false we expect it was renamed externally
82      *
83      * Returns a vector of <filename, Status> pairs for filenames with non-OK rotate status.
84      * An empty vector indicates that all files were rotated successfully.
85      */
86     FileNameStatusPairVector rotateAll(bool renameFiles, const std::string& renameTargetSuffix);
87 
88 private:
89     typedef unordered_map<std::string, RotatableFileWriter*> WriterByNameMap;
90 
91     WriterByNameMap _writers;
92 };
93 
94 }  // namespace logger
95 }  // namespace mongo
96