Mercurial > sci
annotate sciworkerd/sciworkerd.c @ 75:72d998f01b4b
sciworkerd: cool down CPU usage
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 30 Jan 2023 08:42:40 +0100 |
parents | 95bc6b4ec753 |
children | 71cd8447e3a4 |
rev | line source |
---|---|
34 | 1 /* |
2 * sciworkerd.c -- main sciworkerd file | |
3 * | |
4 * Copyright (c) 2021-2022 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 | 19 #include <errno.h> |
20 #include <poll.h> | |
21 #include <signal.h> | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
22 #include <stdint.h> |
19 | 23 #include <string.h> |
24 #include <time.h> | |
75
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
25 #include <unistd.h> |
19 | 26 |
27 #include <utlist.h> | |
28 | |
29 #include "apic.h" | |
30 #include "log.h" | |
31 #include "sciworkerd.h" | |
32 #include "task.h" | |
33 #include "util.h" | |
34 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
35 #define TAG "sciworkerd: " |
19 | 36 |
37 struct taskentry { | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
38 intmax_t job_id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
39 char *tag; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
40 char *project_name; |
19 | 41 struct task *task; |
42 struct taskentry *next; | |
43 }; | |
44 | |
45 static struct taskentry *taskpending; | |
46 static struct taskentry *tasks; | |
47 static struct taskentry *taskfinished; | |
48 static int run = 1; | |
49 | |
50 struct sciworkerd sciworkerd = { | |
51 .fetchinterval = 300, | |
52 .maxjobs = 4, | |
53 .timeout = 600 | |
54 }; | |
55 | |
56 static inline void | |
57 taskentry_free(struct taskentry *entry) | |
58 { | |
59 if (task_status(entry->task) == TASKSTATUS_RUNNING) { | |
60 if (task_kill(entry->task) == 0) | |
61 task_wait(entry->task); | |
62 } | |
63 | |
64 task_free(entry->task); | |
65 free(entry); | |
66 } | |
67 | |
68 static void | |
69 stop(int sign) | |
70 { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
71 log_info(TAG "exiting on signal %d", sign); |
19 | 72 run = 0; |
73 } | |
74 | |
75 static inline int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
76 pending(intmax_t job_id) |
19 | 77 { |
78 const struct taskentry *iter; | |
79 | |
80 LL_FOREACH(taskpending, iter) | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
81 if (iter->job_id == job_id) |
19 | 82 return 1; |
83 | |
84 return 0; | |
85 } | |
86 | |
87 static inline void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
88 queue(intmax_t id, const char *tag, const char *project_name) |
19 | 89 { |
90 struct taskentry *tk; | |
91 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
92 log_info(TAG "queued job build (%d) for tag %s", id, tag); |
19 | 93 |
94 tk = util_calloc(1, sizeof (*tk)); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
95 tk->job_id = id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
96 tk->tag = util_strdup(tag); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
97 tk->project_name = util_strdup(project_name); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
98 tk->task = task_new(tag); |
19 | 99 LL_APPEND(taskpending, tk); |
100 } | |
101 | |
102 static void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
103 merge(json_t *jobs) |
19 | 104 { |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
105 json_int_t id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
106 json_t *val; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
107 const char *tag, *project_name; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
108 size_t total = 0, i; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
109 int parse; |
19 | 110 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
111 json_array_foreach(jobs, i, val) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
112 parse = json_unpack(val, "{sI ss ss}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
113 "id", &id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
114 "tag", &tag, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
115 "project_name", &project_name |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
116 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
117 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
118 if (parse < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
119 log_warn(TAG "unable to parse job"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
120 continue; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
121 } |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
122 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
123 if (!pending(id)) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
124 queue(id, tag, project_name); |
20 | 125 total++; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
126 } |
20 | 127 } |
19 | 128 |
42
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
129 if (total) |
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
130 log_info(TAG "added %zu new pending tasks", total); |
19 | 131 } |
132 | |
133 /* | |
134 * Fetch jobs periodically, depending on the user setting. | |
135 */ | |
136 static void | |
137 fetch_jobs(void) | |
138 { | |
139 static time_t startup; | |
140 time_t now; | |
20 | 141 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
142 json_t *jobs; |
19 | 143 |
144 if (difftime((now = time(NULL)), startup) >= sciworkerd.fetchinterval) { | |
145 startup = now; | |
42
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
146 log_debug(TAG "fetching jobs"); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
147 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
148 if (!(jobs = apic_job_todo(&req, sciworkerd.name))) |
19 | 149 log_warn(TAG "unable to fetch jobs: %s", req.error); |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
150 else { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
151 merge(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
152 json_decref(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
153 } |
19 | 154 } |
155 } | |
156 | |
157 static inline size_t | |
158 count(const struct taskentry *head) | |
159 { | |
160 const struct taskentry *iter; | |
161 size_t tot = 0; | |
162 | |
163 LL_FOREACH(head, iter) | |
164 tot++; | |
165 | |
166 return tot; | |
167 } | |
168 | |
169 /* | |
170 * Start a task. We fetch its script code and then create the task with that | |
171 * script. | |
172 */ | |
173 static int | |
174 start(struct taskentry *entry) | |
175 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
176 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
177 json_t *doc; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
178 const char *script; |
19 | 179 pid_t pid; |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
180 int ret = -1; |
19 | 181 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
182 if (!(doc = apic_project_find(&req, entry->project_name))) |
19 | 183 return log_warn(TAG "unable to fetch project, dropping task"), -1; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
184 if (json_unpack(doc, "{ss}", "script", &script) < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
185 json_decref(doc); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
186 return log_warn(TAG "invalid project JSON object"), -1; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
187 } |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
188 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
189 if (task_setup(entry->task, script) < 0) |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
190 log_warn(TAG "unable to setup script code: %s, dropping task", strerror(errno)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
191 else if ((pid = task_start(entry->task)) < 0) |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
192 log_warn(TAG "unable to spawn task process: %s", strerror(errno)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
193 else { |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
194 log_info(TAG "task %lld spawned", (long long int)pid); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
195 ret = 0; |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
196 } |
19 | 197 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
198 json_decref(doc); |
19 | 199 |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
200 return ret; |
19 | 201 } |
202 | |
203 static inline void | |
204 delete(struct taskentry *entry) | |
205 { | |
206 LL_DELETE(taskpending, entry); | |
207 task_free(entry->task); | |
208 free(entry); | |
209 } | |
210 | |
211 static void | |
212 start_all(void) | |
213 { | |
214 size_t running = count(tasks); | |
215 struct taskentry *entry; | |
216 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
217 while (running < sciworkerd.maxjobs && (entry = taskpending)) { |
19 | 218 if (start(entry) < 0) |
219 delete(entry); | |
220 else { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
221 running++; |
19 | 222 LL_DELETE(taskpending, entry); |
223 LL_APPEND(tasks, entry); | |
224 } | |
225 } | |
226 } | |
227 | |
228 static void | |
229 process_all(void) | |
230 { | |
231 struct taskentry *iter, *next; | |
232 struct taskcode code; | |
233 struct pollfd *fds; | |
234 size_t fdsz, i = 0; | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
235 pid_t pid; |
19 | 236 int ret; |
237 | |
75
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
238 /* |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
239 * Count every pipes. If there is no job we can just wait a little bit. |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
240 */ |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
241 if (!(fdsz = count(tasks))) { |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
242 sleep(1); |
19 | 243 return; |
75
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
244 } |
19 | 245 |
246 fds = util_calloc(fdsz, sizeof (*fds)); | |
247 | |
248 for (iter = tasks; iter; iter = iter->next) | |
249 task_prepare(iter->task, &fds[i++]); | |
250 | |
251 if (poll(fds, fdsz, 5000) < 0) | |
252 log_warn("poll: %s", strerror(errno)); | |
253 | |
254 for (iter = tasks, i = 0; i < fdsz; ++i) { | |
255 next = iter->next; | |
256 | |
257 /* | |
258 * 0: EOF [wait] | |
259 * -1: error [kill + wait] | |
260 * >0: keep going [nothing] | |
261 */ | |
262 if ((ret = task_sync(iter->task, &fds[i])) < 0) { | |
263 log_warn(TAG "pipe error: %s, killing task", strerror(errno)); | |
264 | |
265 if (task_kill(iter->task) < 0) | |
266 log_warn(TAG "task kill error: %s", strerror(errno)); | |
267 } | |
268 | |
269 /* Now wait for the task to complete. */ | |
270 if (ret <= 0) { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
271 pid = task_pid(iter->task); |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
272 |
19 | 273 if (task_wait(iter->task) < 0) |
274 log_warn(TAG "task wait error: %s", strerror(errno)); | |
275 else { | |
276 code = task_code(iter->task); | |
277 | |
278 switch (task_status(iter->task)) { | |
279 case TASKSTATUS_EXITED: | |
280 log_info(TAG "task %lld exited with code %d", | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
281 (long long int)pid, code.exitcode); |
19 | 282 break; |
283 case TASKSTATUS_KILLED: | |
284 log_info(TAG "task %lld killed with signal %d", | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
285 (long long int)pid, code.sigcode); |
19 | 286 break; |
287 default: | |
288 break; | |
289 } | |
290 } | |
291 | |
292 /* Remove that task and push to the outgoing queue. */ | |
293 LL_DELETE(tasks, iter); | |
294 LL_APPEND(taskfinished, iter); | |
295 } | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
296 |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
297 iter = next; |
19 | 298 } |
299 | |
300 free(fds); | |
301 } | |
302 | |
303 /* | |
304 * Kill all tasks that have been running for too long. | |
305 */ | |
306 static void | |
307 ghost_all(void) | |
308 { | |
309 struct taskentry *iter, *tmp; | |
310 | |
311 LL_FOREACH_SAFE(tasks, iter, tmp) { | |
312 if (difftime(time(NULL), task_uptime(iter->task)) < sciworkerd.timeout) | |
313 continue; | |
314 | |
315 /* Do not attempt to wait if kill failed to avoid lock. */ | |
316 log_info(TAG "task timeout, killing"); | |
317 | |
318 if (task_kill(iter->task) == 0) | |
319 task_wait(iter->task); | |
320 | |
321 LL_DELETE(tasks, iter); | |
322 LL_APPEND(taskfinished, iter); | |
323 } | |
324 } | |
325 | |
326 static int | |
327 publish(struct taskentry *iter) | |
328 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
329 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
330 json_t *obj; |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
331 int ret = 0; |
19 | 332 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
333 obj = json_pack("{sI ss ss si si}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
334 "job_id", iter->job_id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
335 "worker_name", sciworkerd.name, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
336 "console", task_console(iter->task), |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
337 "exitcode", task_code(iter->task).exitcode, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
338 "sigcode", task_code(iter->task).sigcode |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
339 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
340 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
341 if (apic_jobresult_add(&req, obj) < 0) { |
19 | 342 log_warn(TAG "unable to publish task: %s", req.error); |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
343 ret = -1; |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
344 } |
19 | 345 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
346 json_decref(obj); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
347 |
19 | 348 return ret; |
349 } | |
350 | |
351 static void | |
352 publish_all(void) | |
353 { | |
354 struct taskentry *iter, *tmp; | |
355 | |
356 LL_FOREACH_SAFE(taskfinished, iter, tmp) { | |
357 if (publish(iter) == 0) { | |
358 LL_DELETE(taskfinished, iter); | |
359 taskentry_free(iter); | |
360 } | |
361 } | |
362 } | |
363 | |
364 void | |
365 sciworkerd_init(void) | |
366 { | |
367 struct sigaction sa = {0}; | |
368 | |
369 log_open("sigworkerd"); | |
370 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
371 if (strlen(sciworkerd.name) == 0) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
372 log_die(TAG "no worker name defined"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
373 |
19 | 374 sigemptyset(&sa.sa_mask); |
375 sa.sa_handler = stop; | |
376 | |
377 if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) | |
378 log_die(TAG "sigaction: %s", strerror(errno)); | |
379 } | |
380 | |
381 void | |
382 sciworkerd_run(void) | |
383 { | |
384 while (run) { | |
385 fetch_jobs(); | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
386 start_all(); |
19 | 387 process_all(); |
388 ghost_all(); | |
389 publish_all(); | |
390 } | |
391 } | |
392 | |
393 void | |
394 sciworkerd_finish(void) | |
395 { | |
396 struct taskentry *iter, *tmp; | |
397 | |
398 LL_FOREACH_SAFE(taskpending, iter, tmp) | |
399 taskentry_free(iter); | |
34 | 400 LL_FOREACH_SAFE(tasks, iter, tmp) { |
401 task_kill(iter->task); | |
19 | 402 taskentry_free(iter); |
34 | 403 } |
19 | 404 LL_FOREACH_SAFE(taskfinished, iter, tmp) |
405 taskentry_free(iter); | |
406 } |