53 explicit ProcessManager(std::shared_ptr<Configuration> conf =
nullptr);
57 void setNodeName(
const std::string& name);
58 std::string getNodeName()
const;
60 void setHealthCheckInterval(
size_t msec);
61 void setRestartWindow(
size_t msec);
62 void setStopTimeout(
size_t msec);
63 void setCommonArgs(
const std::vector<std::string>& args);
64 void setPassthroughArgs(
const std::vector<std::string>& args);
65 void setForwardArgs(
const std::vector<std::string>& args);
90 bool isBulkOperationInProgress()
const;
92 bool restartProcess(
const std::string& name);
93 bool stopProcess(
const std::string& name);
94 bool startProcess(
const std::string& name);
97 void startMonitoring();
98 void stopMonitoring();
99 bool isMonitoring()
const;
102 ProcessState getProcessState(
const std::string& name)
const;
103 ProcessInfo getProcessInfo(
const std::string& name)
const;
104 std::vector<ProcessInfo> getAllProcesses()
const;
105 std::vector<ProcessGroup> getAllGroups()
const;
107 bool allRunning()
const;
108 bool anyCriticalFailed()
const;
111 std::vector<std::string>
getFullArgs(
const std::string& name)
const;
121 using ProcessCallback = std::function<void(
const ProcessInfo&)>;
122 void setOnProcessStarted(ProcessCallback cb);
123 void setOnProcessStopped(ProcessCallback cb);
124 void setOnProcessFailed(ProcessCallback cb);
127 std::shared_ptr<DebugStream> log();
130 bool startProcessWithUnlock(
ProcessInfo& proc, std::unique_lock<std::mutex>& lock);
131 bool startOneshotWithUnlock(
ProcessInfo& proc, std::unique_lock<std::mutex>& lock);
134 void handleProcessExitByName(
const std::string& name,
int exitCode);
138 std::vector<std::string> assembleArgs(
const ProcessInfo& proc)
const;
139 std::vector<std::string> prepareProcessArgs(
const ProcessInfo& proc);
143 static bool interruptibleSleep(
size_t msec,
const std::atomic<bool>& cancelFlag,
144 size_t pollInterval_msec = 500);
146 std::vector<std::string> resolveStartOrder();
147 void expandEnvironment(std::vector<std::string>& args);
148 std::string expandEnvVar(
const std::string& s);
150 std::shared_ptr<Configuration> conf_;
151 std::unique_ptr<HealthChecker> healthChecker_;
154 std::string nodeName_;
155 std::map<std::string, ProcessInfo> processes_;
156 std::map<std::string, ProcessGroup> groups_;
158 std::thread monitorThread_;
159 std::atomic<bool> running_{
false};
160 std::atomic<bool> stopping_{
false};
161 std::atomic<bool> stopAllRunning_{
false};
162 std::atomic<bool> shutdownRequested_{
false};
163 std::atomic<BulkOperation> currentBulkOp_{BulkOperation::None};
164 mutable std::mutex mutex_;
166 size_t healthCheckInterval_msec_ = 5000;
167 size_t restartWindow_msec_ = 60000;
168 size_t stopTimeout_msec_ = 5000;
169 std::vector<std::string> commonArgs_;
170 std::vector<std::string> passthroughArgs_;
171 std::vector<std::string> forwardArgs_;
173 ProcessCallback onStarted_;
174 ProcessCallback onStopped_;
175 ProcessCallback onFailed_;
177 std::shared_ptr<DebugStream> mylog;