Mercurial > sci
annotate sciworkerd/sciworkerd.c @ 85:cf49ab595e2e default tip @
sciworkerd: avoid spawning several tasks
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 09 Mar 2023 10:43:48 +0100 |
parents | f3fc80a2bed7 |
children |
rev | line source |
---|---|
34 | 1 /* |
2 * sciworkerd.c -- main sciworkerd file | |
3 * | |
80
71cd8447e3a4
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
75
diff
changeset
|
4 * Copyright (c) 2021-2023 David Demelier <markand@malikania.fr> |
34 | 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, | |
84
f3fc80a2bed7
sciworkerd: increase timeout
David Demelier <markand@malikania.fr>
parents:
80
diff
changeset
|
53 .timeout = 3600 |
19 | 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 | |
85
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
80 /* Check if that task is listed for build. */ |
19 | 81 LL_FOREACH(taskpending, iter) |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
82 if (iter->job_id == job_id) |
19 | 83 return 1; |
84 | |
85
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
85 /* |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
86 * But also make sure we don't add tasks that are already running as |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
87 * well. |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
88 */ |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
89 LL_FOREACH(tasks, iter) |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
90 if (iter->job_id == job_id) |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
91 return 1; |
cf49ab595e2e
sciworkerd: avoid spawning several tasks
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
92 |
19 | 93 return 0; |
94 } | |
95 | |
96 static inline void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
97 queue(intmax_t id, const char *tag, const char *project_name) |
19 | 98 { |
99 struct taskentry *tk; | |
100 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
101 log_info(TAG "queued job build (%d) for tag %s", id, tag); |
19 | 102 |
103 tk = util_calloc(1, sizeof (*tk)); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
104 tk->job_id = id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
105 tk->tag = util_strdup(tag); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
106 tk->project_name = util_strdup(project_name); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
107 tk->task = task_new(tag); |
19 | 108 LL_APPEND(taskpending, tk); |
109 } | |
110 | |
111 static void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
112 merge(json_t *jobs) |
19 | 113 { |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
114 json_int_t id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
115 json_t *val; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
116 const char *tag, *project_name; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
117 size_t total = 0, i; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
118 int parse; |
19 | 119 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
120 json_array_foreach(jobs, i, val) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
121 parse = json_unpack(val, "{sI ss ss}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
122 "id", &id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
123 "tag", &tag, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
124 "project_name", &project_name |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
125 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
126 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
127 if (parse < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
128 log_warn(TAG "unable to parse job"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
129 continue; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
130 } |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
131 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
132 if (!pending(id)) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
133 queue(id, tag, project_name); |
20 | 134 total++; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
135 } |
20 | 136 } |
19 | 137 |
42
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
138 if (total) |
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
139 log_info(TAG "added %zu new pending tasks", total); |
19 | 140 } |
141 | |
142 /* | |
143 * Fetch jobs periodically, depending on the user setting. | |
144 */ | |
145 static void | |
146 fetch_jobs(void) | |
147 { | |
148 static time_t startup; | |
149 time_t now; | |
20 | 150 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
151 json_t *jobs; |
19 | 152 |
153 if (difftime((now = time(NULL)), startup) >= sciworkerd.fetchinterval) { | |
154 startup = now; | |
42
4076b07c7a6f
sciworkerd: disable useless messages
David Demelier <markand@malikania.fr>
parents:
34
diff
changeset
|
155 log_debug(TAG "fetching jobs"); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
156 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
157 if (!(jobs = apic_job_todo(&req, sciworkerd.name))) |
19 | 158 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
|
159 else { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
160 merge(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
161 json_decref(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
162 } |
19 | 163 } |
164 } | |
165 | |
166 static inline size_t | |
167 count(const struct taskentry *head) | |
168 { | |
169 const struct taskentry *iter; | |
170 size_t tot = 0; | |
171 | |
172 LL_FOREACH(head, iter) | |
173 tot++; | |
174 | |
175 return tot; | |
176 } | |
177 | |
178 /* | |
179 * Start a task. We fetch its script code and then create the task with that | |
180 * script. | |
181 */ | |
182 static int | |
183 start(struct taskentry *entry) | |
184 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
185 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
186 json_t *doc; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
187 const char *script; |
19 | 188 pid_t pid; |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
189 int ret = -1; |
19 | 190 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
191 if (!(doc = apic_project_find(&req, entry->project_name))) |
19 | 192 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
|
193 if (json_unpack(doc, "{ss}", "script", &script) < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
194 json_decref(doc); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
195 return log_warn(TAG "invalid project JSON object"), -1; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
196 } |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
197 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
198 if (task_setup(entry->task, script) < 0) |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
199 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
|
200 else if ((pid = task_start(entry->task)) < 0) |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
201 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
|
202 else { |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
203 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
|
204 ret = 0; |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
205 } |
19 | 206 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
207 json_decref(doc); |
19 | 208 |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
209 return ret; |
19 | 210 } |
211 | |
212 static inline void | |
213 delete(struct taskentry *entry) | |
214 { | |
215 LL_DELETE(taskpending, entry); | |
216 task_free(entry->task); | |
217 free(entry); | |
218 } | |
219 | |
220 static void | |
221 start_all(void) | |
222 { | |
223 size_t running = count(tasks); | |
224 struct taskentry *entry; | |
225 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
226 while (running < sciworkerd.maxjobs && (entry = taskpending)) { |
19 | 227 if (start(entry) < 0) |
228 delete(entry); | |
229 else { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
230 running++; |
19 | 231 LL_DELETE(taskpending, entry); |
232 LL_APPEND(tasks, entry); | |
233 } | |
234 } | |
235 } | |
236 | |
237 static void | |
238 process_all(void) | |
239 { | |
240 struct taskentry *iter, *next; | |
241 struct taskcode code; | |
242 struct pollfd *fds; | |
243 size_t fdsz, i = 0; | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
244 pid_t pid; |
19 | 245 int ret; |
246 | |
75
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
247 /* |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
248 * 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
|
249 */ |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
250 if (!(fdsz = count(tasks))) { |
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
251 sleep(1); |
19 | 252 return; |
75
72d998f01b4b
sciworkerd: cool down CPU usage
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
253 } |
19 | 254 |
255 fds = util_calloc(fdsz, sizeof (*fds)); | |
256 | |
257 for (iter = tasks; iter; iter = iter->next) | |
258 task_prepare(iter->task, &fds[i++]); | |
259 | |
260 if (poll(fds, fdsz, 5000) < 0) | |
261 log_warn("poll: %s", strerror(errno)); | |
262 | |
263 for (iter = tasks, i = 0; i < fdsz; ++i) { | |
264 next = iter->next; | |
265 | |
266 /* | |
267 * 0: EOF [wait] | |
268 * -1: error [kill + wait] | |
269 * >0: keep going [nothing] | |
270 */ | |
271 if ((ret = task_sync(iter->task, &fds[i])) < 0) { | |
272 log_warn(TAG "pipe error: %s, killing task", strerror(errno)); | |
273 | |
274 if (task_kill(iter->task) < 0) | |
275 log_warn(TAG "task kill error: %s", strerror(errno)); | |
276 } | |
277 | |
278 /* Now wait for the task to complete. */ | |
279 if (ret <= 0) { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
280 pid = task_pid(iter->task); |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
281 |
19 | 282 if (task_wait(iter->task) < 0) |
283 log_warn(TAG "task wait error: %s", strerror(errno)); | |
284 else { | |
285 code = task_code(iter->task); | |
286 | |
287 switch (task_status(iter->task)) { | |
288 case TASKSTATUS_EXITED: | |
289 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
|
290 (long long int)pid, code.exitcode); |
19 | 291 break; |
292 case TASKSTATUS_KILLED: | |
293 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
|
294 (long long int)pid, code.sigcode); |
19 | 295 break; |
296 default: | |
297 break; | |
298 } | |
299 } | |
300 | |
301 /* Remove that task and push to the outgoing queue. */ | |
302 LL_DELETE(tasks, iter); | |
303 LL_APPEND(taskfinished, iter); | |
304 } | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
305 |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
306 iter = next; |
19 | 307 } |
308 | |
309 free(fds); | |
310 } | |
311 | |
312 /* | |
313 * Kill all tasks that have been running for too long. | |
314 */ | |
315 static void | |
316 ghost_all(void) | |
317 { | |
318 struct taskentry *iter, *tmp; | |
319 | |
320 LL_FOREACH_SAFE(tasks, iter, tmp) { | |
321 if (difftime(time(NULL), task_uptime(iter->task)) < sciworkerd.timeout) | |
322 continue; | |
323 | |
324 /* Do not attempt to wait if kill failed to avoid lock. */ | |
325 log_info(TAG "task timeout, killing"); | |
326 | |
327 if (task_kill(iter->task) == 0) | |
328 task_wait(iter->task); | |
329 | |
330 LL_DELETE(tasks, iter); | |
331 LL_APPEND(taskfinished, iter); | |
332 } | |
333 } | |
334 | |
335 static int | |
336 publish(struct taskentry *iter) | |
337 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
338 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
339 json_t *obj; |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
340 int ret = 0; |
19 | 341 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
342 obj = json_pack("{sI ss ss si si}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
343 "job_id", iter->job_id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
344 "worker_name", sciworkerd.name, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
345 "console", task_console(iter->task), |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
346 "exitcode", task_code(iter->task).exitcode, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
347 "sigcode", task_code(iter->task).sigcode |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
348 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
349 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
350 if (apic_jobresult_add(&req, obj) < 0) { |
19 | 351 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
|
352 ret = -1; |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
353 } |
19 | 354 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
355 json_decref(obj); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
356 |
19 | 357 return ret; |
358 } | |
359 | |
360 static void | |
361 publish_all(void) | |
362 { | |
363 struct taskentry *iter, *tmp; | |
364 | |
365 LL_FOREACH_SAFE(taskfinished, iter, tmp) { | |
366 if (publish(iter) == 0) { | |
367 LL_DELETE(taskfinished, iter); | |
368 taskentry_free(iter); | |
369 } | |
370 } | |
371 } | |
372 | |
373 void | |
374 sciworkerd_init(void) | |
375 { | |
376 struct sigaction sa = {0}; | |
377 | |
378 log_open("sigworkerd"); | |
379 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
380 if (strlen(sciworkerd.name) == 0) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
381 log_die(TAG "no worker name defined"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
382 |
19 | 383 sigemptyset(&sa.sa_mask); |
384 sa.sa_handler = stop; | |
385 | |
386 if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) | |
387 log_die(TAG "sigaction: %s", strerror(errno)); | |
388 } | |
389 | |
390 void | |
391 sciworkerd_run(void) | |
392 { | |
393 while (run) { | |
394 fetch_jobs(); | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
395 start_all(); |
19 | 396 process_all(); |
397 ghost_all(); | |
398 publish_all(); | |
399 } | |
400 } | |
401 | |
402 void | |
403 sciworkerd_finish(void) | |
404 { | |
405 struct taskentry *iter, *tmp; | |
406 | |
407 LL_FOREACH_SAFE(taskpending, iter, tmp) | |
408 taskentry_free(iter); | |
34 | 409 LL_FOREACH_SAFE(tasks, iter, tmp) { |
410 task_kill(iter->task); | |
19 | 411 taskentry_free(iter); |
34 | 412 } |
19 | 413 LL_FOREACH_SAFE(taskfinished, iter, tmp) |
414 taskentry_free(iter); | |
415 } |