MythTV master
housekeeper.h
Go to the documentation of this file.
1#ifndef HOUSEKEEPER_H_
2#define HOUSEKEEPER_H_
3
4#include <QWaitCondition>
5#include <QDateTime>
6#include <QString>
7#include <QEvent>
8#include <QTimer>
9#include <QMutex>
10#include <QQueue>
11#include <QList>
12#include <QMap>
13#include <QPair>
14
15#include "mthread.h"
16#include "mythchrono.h"
17#include "mythdate.h"
18#include "mythevent.h"
19#include "mythbaseexp.h"
20#include "referencecounter.h"
21
22class Scheduler;
23class HouseKeeper;
24
25enum HouseKeeperScope : std::uint8_t {
26 kHKGlobal = 0,
28 kHKLocal,
30 kHKInst
32};
33
34enum HouseKeeperStartup : std::uint8_t {
38};
39
41{
42 public:
43 explicit HouseKeeperTask(const QString &dbTag, HouseKeeperScope scope=kHKGlobal,
45 ~HouseKeeperTask() override = default;
46
47 bool IsFinished(void) const { return m_finished; }
48 void SetFinished(bool fini) { m_finished = fini; }
49 bool CheckRun(const QDateTime& now);
50 bool Run(void);
51 bool ConfirmRun(void) const { return m_confirm; }
52 bool IsRunning(void) const { return m_running; }
53
54 bool CheckImmediate(void);
55 bool CheckStartup(void);
56
57 QString GetTag(void) { return m_dbTag; }
58 QDateTime GetLastRun(void) { return m_lastRun; }
59 QDateTime GetLastSuccess(void) { return m_lastSuccess; }
60 HouseKeeperScope GetScope(void) { return m_scope; }
61 QDateTime QueryLastRun(void);
62 QDateTime QueryLastSuccess(void);
63 QDateTime UpdateLastRun(bool successful=true)
64 { return UpdateLastRun(MythDate::current(), successful); }
65 virtual QDateTime UpdateLastRun(const QDateTime& last, bool successful=true);
66 virtual void SetLastRun(const QDateTime& last, bool successful=true);
67
68 virtual bool DoCheckRun(const QDateTime& /*now*/) { return false; }
69 virtual bool DoRun(void) { return false; }
70
71 virtual void Terminate(void) {}
72
73 private:
74 void QueryLast(void);
75
76 bool m_finished {false};
77 QString m_dbTag;
78 bool m_confirm {false};
81 bool m_running {false};
82
83 QDateTime m_lastRun;
84 QDateTime m_lastSuccess;
85 QDateTime m_lastUpdate;
86};
87
89{
90 public:
91 PeriodicHouseKeeperTask(const QString &dbTag, std::chrono::seconds period, float min=0.5,
92 float max=1.1, std::chrono::seconds retry=0s, HouseKeeperScope scope=kHKGlobal,
94 bool DoCheckRun(const QDateTime& now) override; // HouseKeeperTask
95 virtual bool InWindow(const QDateTime& now);
96 virtual bool PastWindow(const QDateTime& now);
97 QDateTime UpdateLastRun(const QDateTime& last, bool successful=true) override; // HouseKeeperTask
98 void SetLastRun(const QDateTime& last, bool successful=true) override; // HouseKeeperTask
99 virtual void SetWindow(float min, float max);
100
101 protected:
102 virtual void CalculateWindow(void);
103
104 std::chrono::seconds m_period;
105 std::chrono::seconds m_retry;
106 QPair<float,float> m_windowPercent;
107 QPair<std::chrono::seconds,std::chrono::seconds> m_windowElapsed;
108 double m_currentProb { 1.0 };
109};
110
112{
113 public:
114 explicit DailyHouseKeeperTask(const QString &dbTag,
117 DailyHouseKeeperTask(const QString &dbTag,
118 std::chrono::hours minhour, std::chrono::hours maxhour,
121 virtual void SetHourWindow(std::chrono::hours min, std::chrono::hours max);
122 bool InWindow(const QDateTime& now) override; // PeriodicHouseKeeperTask
123
124 protected:
125 void CalculateWindow(void) override; // PeriodicHouseKeeperTask
126
127 private:
128 QPair<std::chrono::hours, std::chrono::hours> m_windowHour;
129};
130
132{
133 public:
135 MThread("HouseKeeping"), m_parent(p) {}
136 ~HouseKeepingThread() override = default;
137 void Discard(void) { m_keepRunning = false; }
138 bool isIdle(void) const { return m_idle; }
139 void Wake(void) { m_waitCondition.wakeAll(); }
140
141 void Terminate(void);
142
143 protected:
144 void run(void) override; // MThread
145
146 private:
147 bool m_idle { true };
148 bool m_keepRunning { true };
149 HouseKeeper *m_parent { nullptr };
151 QWaitCondition m_waitCondition;
152};
153
154class MBASE_PUBLIC HouseKeeper : public QObject
155{
156 Q_OBJECT
157
158 public:
159 HouseKeeper(void);
160 ~HouseKeeper() override;
161
162 void RegisterTask(HouseKeeperTask *task);
163 void UnregisterTask(const QString& tag);
164 void Start(void);
165 void StartThread(void);
166 HouseKeeperTask* GetQueuedTask(void);
167
168 protected:
169 void customEvent(QEvent *e) override; // QObject
170
171 public slots:
172 void Run(void);
173
174 private:
175 QTimer *m_timer { nullptr };
176
177 QQueue<HouseKeeperTask*> m_taskQueue;
179
180 QMap<QString, HouseKeeperTask*> m_taskMap;
181 QMutex m_mapLock;
182
183 QList<HouseKeepingThread*> m_threadList;
185};
186
188{
189 public:
191 5min,
192 0.9F, 1.1F,
193 5min,
195 bool DoRun(void) override; // HouseKeeperTask
196 private:
197
198};
199
200#endif
DBConnPurgeTask(void)
Definition: housekeeper.h:190
Modified PeriodicHouseKeeperTask for tasks to be run once daily.
Definition: housekeeper.h:112
QPair< std::chrono::hours, std::chrono::hours > m_windowHour
Definition: housekeeper.h:128
Definition for a single task to be run by the HouseKeeper.
Definition: housekeeper.h:41
HouseKeeperScope GetScope(void)
Definition: housekeeper.h:60
bool IsRunning(void) const
Definition: housekeeper.h:52
virtual bool DoRun(void)
Definition: housekeeper.h:69
~HouseKeeperTask() override=default
HouseKeeperScope m_scope
Definition: housekeeper.h:79
virtual void Terminate(void)
Definition: housekeeper.h:71
QDateTime m_lastSuccess
Definition: housekeeper.h:84
QDateTime GetLastRun(void)
Definition: housekeeper.h:58
QDateTime UpdateLastRun(bool successful=true)
Definition: housekeeper.h:63
QString m_dbTag
Definition: housekeeper.h:77
QDateTime m_lastRun
Definition: housekeeper.h:83
virtual bool DoCheckRun(const QDateTime &)
Definition: housekeeper.h:68
bool IsFinished(void) const
Definition: housekeeper.h:47
HouseKeeperStartup m_startup
Definition: housekeeper.h:80
QString GetTag(void)
Definition: housekeeper.h:57
QDateTime GetLastSuccess(void)
Definition: housekeeper.h:59
bool ConfirmRun(void) const
Definition: housekeeper.h:51
void SetFinished(bool fini)
Definition: housekeeper.h:48
QDateTime m_lastUpdate
Definition: housekeeper.h:85
Manages registered HouseKeeperTasks and queues tasks for operation.
Definition: housekeeper.h:155
QMap< QString, HouseKeeperTask * > m_taskMap
Definition: housekeeper.h:180
QMutex m_mapLock
Definition: housekeeper.h:181
QQueue< HouseKeeperTask * > m_taskQueue
Definition: housekeeper.h:177
QList< HouseKeepingThread * > m_threadList
Definition: housekeeper.h:183
QMutex m_threadLock
Definition: housekeeper.h:184
QMutex m_queueLock
Definition: housekeeper.h:178
Thread used to perform queued HouseKeeper tasks.
Definition: housekeeper.h:132
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
void Discard(void)
Definition: housekeeper.h:137
HouseKeepingThread(HouseKeeper *p)
Definition: housekeeper.h:134
~HouseKeepingThread() override=default
bool isIdle(void) const
Definition: housekeeper.h:138
QWaitCondition m_waitCondition
Definition: housekeeper.h:151
void Terminate(void)
HouseKeeper * m_parent
Definition: housekeeper.h:149
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
Modified HouseKeeperTask for tasks to be run at a regular interval.
Definition: housekeeper.h:89
QPair< float, float > m_windowPercent
Definition: housekeeper.h:106
std::chrono::seconds m_retry
Definition: housekeeper.h:105
std::chrono::seconds m_period
Definition: housekeeper.h:104
QPair< std::chrono::seconds, std::chrono::seconds > m_windowElapsed
Definition: housekeeper.h:107
General purpose reference counter.
HouseKeeperScope
Definition: housekeeper.h:25
@ kHKGlobal
task should only run once per cluster e.g.
Definition: housekeeper.h:26
@ kHKInst
task should run on every process e.g.
Definition: housekeeper.h:30
@ kHKLocal
task should only run once per machine e.g.
Definition: housekeeper.h:28
HouseKeeperStartup
Definition: housekeeper.h:34
@ kHKRunImmediateOnStartup
task is run during HouseKeeper startup
Definition: housekeeper.h:37
@ kHKRunOnStartup
task is queued when HouseKeeper is started
Definition: housekeeper.h:36
@ kHKNormal
task is checked normally
Definition: housekeeper.h:35
#define MBASE_PUBLIC
Definition: mythbaseexp.h:8
static int startup()
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15