Changeset View
Changeset View
Standalone View
Standalone View
src/service/plugins/sqlite/ResourceScoreMaintainer.cpp
Show All 17 Lines | |||||
18 | */ | 18 | */ | ||
19 | 19 | | |||
20 | // Self | 20 | // Self | ||
21 | #include "ResourceScoreMaintainer.h" | 21 | #include "ResourceScoreMaintainer.h" | ||
22 | 22 | | |||
23 | // Qt | 23 | // Qt | ||
24 | #include <QList> | 24 | #include <QList> | ||
25 | #include <QMutex> | 25 | #include <QMutex> | ||
26 | #include <QThread> | | |||
27 | 26 | | |||
28 | 27 | | |||
29 | // System | 28 | // System | ||
30 | #include <time.h> | 29 | #include <time.h> | ||
31 | 30 | | |||
32 | // Utils | 31 | // Utils | ||
33 | #include <utils/for_each_assoc.h> | 32 | #include <utils/for_each_assoc.h> | ||
34 | #include <utils/d_ptr_implementation.h> | 33 | #include <utils/d_ptr_implementation.h> | ||
35 | 34 | | |||
36 | // Local | 35 | // Local | ||
37 | #include "StatsPlugin.h" | 36 | #include "StatsPlugin.h" | ||
38 | #include "ResourceScoreCache.h" | 37 | #include "ResourceScoreCache.h" | ||
39 | 38 | | |||
40 | 39 | | |||
41 | class ResourceScoreMaintainer::Private : public QThread { | 40 | class ResourceScoreMaintainer::Private { | ||
42 | public: | 41 | public: | ||
42 | Private() | ||||
43 | { | ||||
44 | } | ||||
45 | | ||||
43 | ~Private(); | 46 | ~Private(); | ||
47 | | ||||
44 | typedef QString ApplicationName; | 48 | typedef QString ApplicationName; | ||
45 | typedef QString ActivityID; | 49 | typedef QString ActivityID; | ||
46 | typedef QList<QString> ResourceList; | 50 | typedef QList<QString> ResourceList; | ||
47 | 51 | | |||
48 | typedef QHash<ApplicationName, ResourceList> Applications; | 52 | typedef QHash<ApplicationName, ResourceList> Applications; | ||
49 | typedef QHash<ActivityID, Applications> ResourceTree; | 53 | typedef QHash<ActivityID, Applications> ResourceTree; | ||
50 | 54 | | |||
51 | ResourceTree scheduledResources; | 55 | ResourceTree scheduledResources; | ||
52 | QMutex scheduledResources_mutex; | | |||
53 | 56 | | |||
54 | void run() Q_DECL_OVERRIDE; | | |||
55 | void processActivity(const ActivityID &activity, | 57 | void processActivity(const ActivityID &activity, | ||
56 | const Applications &applications); | 58 | const Applications &applications); | ||
59 | | ||||
60 | void processResources(); | ||||
61 | | ||||
62 | QTimer processResourcesTimer; | ||||
57 | }; | 63 | }; | ||
58 | 64 | | |||
59 | ResourceScoreMaintainer::Private::~Private() | 65 | ResourceScoreMaintainer::Private::~Private() | ||
60 | { | 66 | { | ||
61 | requestInterruption(); | | |||
62 | wait(1500); // Enough time for the sleep(1) + processing in run() | | |||
63 | } | 67 | } | ||
64 | 68 | | |||
65 | void ResourceScoreMaintainer::Private::run() | 69 | void ResourceScoreMaintainer::Private::processResources() | ||
66 | { | 70 | { | ||
67 | using namespace kamd::utils; | 71 | using namespace kamd::utils; | ||
68 | 72 | | |||
69 | while (!isInterruptionRequested()) { | | |||
70 | // initial delay before processing the resources | 73 | // initial delay before processing the resources | ||
71 | sleep(1); | 74 | sleep(1); | ||
72 | 75 | | |||
73 | ResourceTree resources; | 76 | ResourceTree resources; | ||
74 | 77 | | |||
75 | { | | |||
76 | QMutexLocker lock(&scheduledResources_mutex); | | |||
77 | std::swap(resources, scheduledResources); | 78 | std::swap(resources, scheduledResources); | ||
78 | } | | |||
79 | 79 | | |||
80 | const auto activity = StatsPlugin::self()->currentActivity(); | 80 | const auto activity = StatsPlugin::self()->currentActivity(); | ||
81 | 81 | | |||
82 | // Let us first process the events related to the current | 82 | // Let us first process the events related to the current | ||
83 | // activity so that the stats are available quicker | 83 | // activity so that the stats are available quicker | ||
84 | 84 | | |||
85 | if (resources.contains(activity)) { | 85 | if (resources.contains(activity)) { | ||
86 | processActivity(activity, resources[activity]); | 86 | processActivity(activity, resources[activity]); | ||
87 | resources.remove(activity); | 87 | resources.remove(activity); | ||
88 | } | 88 | } | ||
89 | 89 | | |||
90 | for_each_assoc(resources, | 90 | for_each_assoc(resources, | ||
91 | [this](const ActivityID & activity, const Applications & applications) { | 91 | [this](const ActivityID & activity, const Applications & applications) { | ||
92 | processActivity(activity, applications); | 92 | processActivity(activity, applications); | ||
93 | } | 93 | } | ||
94 | ); | 94 | ); | ||
95 | } | 95 | } | ||
96 | } | | |||
97 | 96 | | |||
98 | void ResourceScoreMaintainer::Private::processActivity(const ActivityID | 97 | void ResourceScoreMaintainer::Private::processActivity(const ActivityID | ||
99 | &activity, | 98 | &activity, | ||
100 | const Applications | 99 | const Applications | ||
101 | &applications) | 100 | &applications) | ||
102 | { | 101 | { | ||
103 | using namespace kamd::utils; | 102 | using namespace kamd::utils; | ||
104 | 103 | | |||
105 | for_each_assoc(applications, | 104 | for_each_assoc(applications, | ||
106 | [&](const ApplicationName &application, const ResourceList &resources) { | 105 | [&](const ApplicationName &application, const ResourceList &resources) { | ||
107 | for (const auto &resource : resources) { | 106 | for (const auto &resource : resources) { | ||
108 | ResourceScoreCache(activity, application, resource).update(); | 107 | ResourceScoreCache(activity, application, resource).update(); | ||
109 | } | 108 | } | ||
110 | } | 109 | } | ||
111 | ); | 110 | ); | ||
112 | } | 111 | } | ||
113 | 112 | | |||
114 | ResourceScoreMaintainer *ResourceScoreMaintainer::self() | 113 | ResourceScoreMaintainer *ResourceScoreMaintainer::self() | ||
115 | { | 114 | { | ||
116 | static ResourceScoreMaintainer instance; | 115 | static ResourceScoreMaintainer instance; | ||
117 | return &instance; | 116 | return &instance; | ||
118 | } | 117 | } | ||
119 | 118 | | |||
120 | ResourceScoreMaintainer::ResourceScoreMaintainer() | 119 | ResourceScoreMaintainer::ResourceScoreMaintainer() | ||
121 | : d() | | |||
122 | { | 120 | { | ||
121 | d->processResourcesTimer.setInterval(1000); | ||||
122 | d->processResourcesTimer.setSingleShot(true); | ||||
123 | connect(&d->processResourcesTimer, &QTimer::timeout, | ||||
124 | this, [=] { d->processResources(); }); | ||||
123 | } | 125 | } | ||
124 | 126 | | |||
125 | ResourceScoreMaintainer::~ResourceScoreMaintainer() | 127 | ResourceScoreMaintainer::~ResourceScoreMaintainer() | ||
126 | { | 128 | { | ||
127 | } | 129 | } | ||
128 | 130 | | |||
129 | void ResourceScoreMaintainer::processResource(const QString &resource, | 131 | void ResourceScoreMaintainer::processResource(const QString &resource, | ||
130 | const QString &application) | 132 | const QString &application) | ||
131 | { | 133 | { | ||
132 | QMutexLocker lock(&d->scheduledResources_mutex); | | |||
133 | | ||||
134 | // Checking whether the item is already scheduled for | 134 | // Checking whether the item is already scheduled for | ||
135 | // processing | 135 | // processing | ||
136 | 136 | | |||
137 | const auto activity = StatsPlugin::self()->currentActivity(); | 137 | const auto activity = StatsPlugin::self()->currentActivity(); | ||
138 | 138 | | |||
139 | Q_ASSERT_X(!application.isEmpty(), | 139 | Q_ASSERT_X(!application.isEmpty(), | ||
140 | "ResourceScoreMaintainer::processResource", | 140 | "ResourceScoreMaintainer::processResource", | ||
141 | "Agent shoud not be empty"); | 141 | "Agent shoud not be empty"); | ||
142 | Q_ASSERT_X(!resource.isEmpty(), | 142 | Q_ASSERT_X(!resource.isEmpty(), | ||
143 | "ResourceScoreMaintainer::processResource", | 143 | "ResourceScoreMaintainer::processResource", | ||
144 | "Resource shoud not be empty"); | 144 | "Resource shoud not be empty"); | ||
145 | 145 | | |||
146 | if (d->scheduledResources.contains(activity) | 146 | if (d->scheduledResources.contains(activity) | ||
147 | && d->scheduledResources[activity].contains(application) | 147 | && d->scheduledResources[activity].contains(application) | ||
148 | && d->scheduledResources[activity][application].contains(resource)) { | 148 | && d->scheduledResources[activity][application].contains(resource)) { | ||
149 | 149 | | |||
150 | // Nothing | 150 | // Nothing | ||
151 | 151 | | |||
152 | } else { | 152 | } else { | ||
153 | d->scheduledResources[activity][application] << resource; | 153 | d->scheduledResources[activity][application] << resource; | ||
154 | } | 154 | } | ||
155 | 155 | | |||
156 | d->start(); | 156 | d->processResourcesTimer.start(); | ||
157 | } | 157 | } |