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