-
Notifications
You must be signed in to change notification settings - Fork 22
/
dump_manager_bmcstored.hpp
170 lines (147 loc) · 6.23 KB
/
dump_manager_bmcstored.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#pragma once
#include "dump_manager.hpp"
#include "dump_utils.hpp"
#include "watch.hpp"
#include <phosphor-logging/log.hpp>
#include <filesystem>
namespace phosphor
{
namespace dump
{
namespace bmc_stored
{
using namespace phosphor::logging;
using UserMap = phosphor::dump::inotify::UserMap;
using Watch = phosphor::dump::inotify::Watch;
/** @class Manager
* @brief Manager base class for locally stored dumps.
*/
class Manager : public phosphor::dump::Manager
{
public:
Manager() = delete;
Manager(const Manager&) = default;
Manager& operator=(const Manager&) = delete;
Manager(Manager&&) = delete;
Manager& operator=(Manager&&) = delete;
virtual ~Manager() = default;
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] event - Dump manager sd_event loop.
* @param[in] path - Path to attach at.
* @param[in] baseEntryPath - Base path for dump entry.
* @param[in] filePath - Path where the dumps are stored.
* @param[in] dumpFilenameFormat - Format of dump filename in regex
* @param[in] maxDumpSize - Maximum size of the dump
* @param[in] minDumpSize - Minimum possible size of a usable dump.
* @param[in] allocatedSize - Total size allocated for the dumps
*/
Manager(sdbusplus::bus::bus& bus, const EventPtr& event, const char* path,
const std::string& baseEntryPath, const char* filePath,
const std::string dumpFilenameFormat, const uint64_t maxDumpSize,
const uint64_t minDumpSize, const uint64_t allocatedSize) :
phosphor::dump::Manager(bus, path, baseEntryPath),
eventLoop(event.get()), dumpDir(filePath),
dumpWatch(
eventLoop, IN_NONBLOCK, IN_CLOSE_WRITE | IN_CREATE, EPOLLIN,
filePath,
std::bind(std::mem_fn(
&phosphor::dump::bmc_stored::Manager::watchCallback),
this, std::placeholders::_1)),
dumpFilenameFormat(dumpFilenameFormat), maxDumpSize(maxDumpSize),
minDumpSize(minDumpSize), allocatedSize(allocatedSize)
{}
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] event - Dump manager sd_event loop.
* @param[in] path - Path to attach at.
* @param[in] baseEntryPath - Base path for dump entry.
* @param[in] startingId - Starting id of the dump
* @param[in] filePath - Path where the dumps are stored.
* @param[in] dumpFilenameFormat - Format of dump filename in regex
* @param[in] maxDumpSize - Maximum size of the dump
* @param[in] minDumpSize - Minimum possible size of a usable dump.
* @param[in] allocatedSize - Total size allocated for the dumps
*/
Manager(sdbusplus::bus::bus& bus, const EventPtr& event, const char* path,
const std::string& baseEntryPath, uint32_t startingId,
const char* filePath, const std::string dumpFilenameFormat,
const uint64_t maxDumpSize, const uint64_t minDumpSize,
const uint64_t allocatedSize) :
phosphor::dump::Manager(bus, path, baseEntryPath, startingId),
eventLoop(event.get()), dumpDir(filePath),
dumpWatch(
eventLoop, IN_NONBLOCK, IN_CLOSE_WRITE | IN_CREATE, EPOLLIN,
filePath,
std::bind(std::mem_fn(
&phosphor::dump::bmc_stored::Manager::watchCallback),
this, std::placeholders::_1)),
dumpFilenameFormat(dumpFilenameFormat), maxDumpSize(maxDumpSize),
minDumpSize(minDumpSize), allocatedSize(allocatedSize)
{}
/** @brief Implementation of dump watch call back
* @param [in] fileInfo - map of file info path:event
*/
void watchCallback(const UserMap& fileInfo);
/** @brief Construct dump d-bus objects from their persisted
* representations.
*/
void restore() override;
/** @brief Perform any post restore operations after claiming
* the bus name. Any new D-Bus dump objects created will be
* notified to the subscribers.
*/
void checkAndInitialize() override
{}
/** @brief sdbusplus Dump event loop */
EventPtr eventLoop;
protected:
/** @brief Calculate per dump allowed size based on the available
* size in the dump location.
* @returns dump size in kilobytes.
*/
size_t getAllowedSize();
/** @brief Create a Dump Entry Object
* @param[in] id - Id of the dump
* @param[in] objPath - Object path to attach to
* @param[in] timeStamp - Dump creation timestamp
* since the epoch.
* @param[in] fileSize - Dump file size in bytes.
* @param[in] file - Name of dump file.
* @param[in] status - status of the dump.
* @param[in] parent - The dump entry's parent.
*/
virtual void createEntry(const uint32_t id, const std::string objPath,
const uint64_t ms, uint64_t fileSize,
const std::filesystem::path& file,
phosphor::dump::OperationStatus status) = 0;
/** @brief Path to the dump file*/
std::string dumpDir;
private:
/** @brief Create Dump entry d-bus object
* @param[in] fullPath - Full path of the Dump file name
*/
void createEntry(const std::filesystem::path& fullPath);
/** @brief Remove specified watch object pointer from the
* watch map and associated entry from the map.
* @param[in] path - unique identifier of the map
*/
void removeWatch(const std::filesystem::path& path);
/** @brief Dump main watch object */
Watch dumpWatch;
/** @brief Child directory path and its associated watch object map
* [path:watch object]
*/
std::map<std::filesystem::path, std::unique_ptr<Watch>> childWatchMap;
/** @brief A regex based format for the filename */
std::string dumpFilenameFormat;
/** @brief Maximum possible size of a dump */
uint64_t maxDumpSize;
/** @brief Minimum viable dump size */
uint64_t minDumpSize;
/** @brief The total size allocated for a kind of dump */
uint64_t allocatedSize;
};
} // namespace bmc_stored
} // namespace dump
} // namespace phosphor