Mercurial > sci
annotate sciworkerd/sciworkerd.c @ 37:62aefd02ac59
make: remove config.mk
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 07 Aug 2022 08:41:06 +0200 |
parents | e52c762d8ba8 |
children | 4076b07c7a6f |
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 |
20 | 128 log_info(TAG "added %zu new pending tasks", total); |
19 | 129 } |
130 | |
131 /* | |
132 * Fetch jobs periodically, depending on the user setting. | |
133 */ | |
134 static void | |
135 fetch_jobs(void) | |
136 { | |
137 static time_t startup; | |
138 time_t now; | |
20 | 139 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
140 json_t *jobs; |
19 | 141 |
142 if (difftime((now = time(NULL)), startup) >= sciworkerd.fetchinterval) { | |
143 startup = now; | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
144 log_info(TAG "fetching jobs"); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
145 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
146 if (!(jobs = apic_job_todo(&req, sciworkerd.name))) |
19 | 147 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
|
148 else { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
149 merge(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
150 json_decref(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
151 } |
19 | 152 } |
153 } | |
154 | |
155 static inline size_t | |
156 count(const struct taskentry *head) | |
157 { | |
158 const struct taskentry *iter; | |
159 size_t tot = 0; | |
160 | |
161 LL_FOREACH(head, iter) | |
162 tot++; | |
163 | |
164 return tot; | |
165 } | |
166 | |
167 /* | |
168 * Start a task. We fetch its script code and then create the task with that | |
169 * script. | |
170 */ | |
171 static int | |
172 start(struct taskentry *entry) | |
173 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
174 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
175 json_t *doc; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
176 const char *script; |
19 | 177 pid_t pid; |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
178 int ret = -1; |
19 | 179 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
180 if (!(doc = apic_project_find(&req, entry->project_name))) |
19 | 181 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
|
182 if (json_unpack(doc, "{ss}", "script", &script) < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
183 json_decref(doc); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
184 return log_warn(TAG "invalid project JSON object"), -1; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
185 } |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
186 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
187 if (task_setup(entry->task, script) < 0) |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
188 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
|
189 else if ((pid = task_start(entry->task)) < 0) |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
190 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
|
191 else { |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
192 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
|
193 ret = 0; |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
194 } |
19 | 195 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
196 json_decref(doc); |
19 | 197 |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
198 return ret; |
19 | 199 } |
200 | |
201 static inline void | |
202 delete(struct taskentry *entry) | |
203 { | |
204 LL_DELETE(taskpending, entry); | |
205 task_free(entry->task); | |
206 free(entry); | |
207 } | |
208 | |
209 static void | |
210 start_all(void) | |
211 { | |
212 size_t running = count(tasks); | |
213 struct taskentry *entry; | |
214 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
215 while (running < sciworkerd.maxjobs && (entry = taskpending)) { |
19 | 216 if (start(entry) < 0) |
217 delete(entry); | |
218 else { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
219 running++; |
19 | 220 LL_DELETE(taskpending, entry); |
221 LL_APPEND(tasks, entry); | |
222 } | |
223 } | |
224 } | |
225 | |
226 static void | |
227 process_all(void) | |
228 { | |
229 struct taskentry *iter, *next; | |
230 struct taskcode code; | |
231 struct pollfd *fds; | |
232 size_t fdsz, i = 0; | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
233 pid_t pid; |
19 | 234 int ret; |
235 | |
236 /* First, read every pipes. */ | |
237 if (!(fdsz = count(tasks))) | |
238 return; | |
239 | |
240 fds = util_calloc(fdsz, sizeof (*fds)); | |
241 | |
242 for (iter = tasks; iter; iter = iter->next) | |
243 task_prepare(iter->task, &fds[i++]); | |
244 | |
245 if (poll(fds, fdsz, 5000) < 0) | |
246 log_warn("poll: %s", strerror(errno)); | |
247 | |
248 for (iter = tasks, i = 0; i < fdsz; ++i) { | |
249 next = iter->next; | |
250 | |
251 /* | |
252 * 0: EOF [wait] | |
253 * -1: error [kill + wait] | |
254 * >0: keep going [nothing] | |
255 */ | |
256 if ((ret = task_sync(iter->task, &fds[i])) < 0) { | |
257 log_warn(TAG "pipe error: %s, killing task", strerror(errno)); | |
258 | |
259 if (task_kill(iter->task) < 0) | |
260 log_warn(TAG "task kill error: %s", strerror(errno)); | |
261 } | |
262 | |
263 /* Now wait for the task to complete. */ | |
264 if (ret <= 0) { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
265 pid = task_pid(iter->task); |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
266 |
19 | 267 if (task_wait(iter->task) < 0) |
268 log_warn(TAG "task wait error: %s", strerror(errno)); | |
269 else { | |
270 code = task_code(iter->task); | |
271 | |
272 switch (task_status(iter->task)) { | |
273 case TASKSTATUS_EXITED: | |
274 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
|
275 (long long int)pid, code.exitcode); |
19 | 276 break; |
277 case TASKSTATUS_KILLED: | |
278 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
|
279 (long long int)pid, code.sigcode); |
19 | 280 break; |
281 default: | |
282 break; | |
283 } | |
284 } | |
285 | |
286 /* Remove that task and push to the outgoing queue. */ | |
287 LL_DELETE(tasks, iter); | |
288 LL_APPEND(taskfinished, iter); | |
289 } | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
290 |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
291 iter = next; |
19 | 292 } |
293 | |
294 free(fds); | |
295 } | |
296 | |
297 /* | |
298 * Kill all tasks that have been running for too long. | |
299 */ | |
300 static void | |
301 ghost_all(void) | |
302 { | |
303 struct taskentry *iter, *tmp; | |
304 | |
305 LL_FOREACH_SAFE(tasks, iter, tmp) { | |
306 if (difftime(time(NULL), task_uptime(iter->task)) < sciworkerd.timeout) | |
307 continue; | |
308 | |
309 /* Do not attempt to wait if kill failed to avoid lock. */ | |
310 log_info(TAG "task timeout, killing"); | |
311 | |
312 if (task_kill(iter->task) == 0) | |
313 task_wait(iter->task); | |
314 | |
315 LL_DELETE(tasks, iter); | |
316 LL_APPEND(taskfinished, iter); | |
317 } | |
318 } | |
319 | |
320 static int | |
321 publish(struct taskentry *iter) | |
322 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
323 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
324 json_t *obj; |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
325 int ret = 0; |
19 | 326 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
327 obj = json_pack("{sI ss ss si si}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
328 "job_id", iter->job_id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
329 "worker_name", sciworkerd.name, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
330 "console", task_console(iter->task), |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
331 "exitcode", task_code(iter->task).exitcode, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
332 "sigcode", task_code(iter->task).sigcode |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
333 ); |
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 if (apic_jobresult_add(&req, obj) < 0) { |
19 | 336 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
|
337 ret = -1; |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
338 } |
19 | 339 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
340 json_decref(obj); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
341 |
19 | 342 return ret; |
343 } | |
344 | |
345 static void | |
346 publish_all(void) | |
347 { | |
348 struct taskentry *iter, *tmp; | |
349 | |
350 LL_FOREACH_SAFE(taskfinished, iter, tmp) { | |
351 if (publish(iter) == 0) { | |
352 LL_DELETE(taskfinished, iter); | |
353 taskentry_free(iter); | |
354 } | |
355 } | |
356 } | |
357 | |
358 void | |
359 sciworkerd_init(void) | |
360 { | |
361 struct sigaction sa = {0}; | |
362 | |
363 log_open("sigworkerd"); | |
364 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
365 if (strlen(sciworkerd.name) == 0) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
366 log_die(TAG "no worker name defined"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
367 |
19 | 368 sigemptyset(&sa.sa_mask); |
369 sa.sa_handler = stop; | |
370 | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
371 util_strlcpy(apiconf.baseurl, sciworkerd.url, sizeof (apiconf.baseurl)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
372 |
19 | 373 if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) |
374 log_die(TAG "sigaction: %s", strerror(errno)); | |
375 } | |
376 | |
377 void | |
378 sciworkerd_run(void) | |
379 { | |
380 while (run) { | |
381 fetch_jobs(); | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
382 start_all(); |
19 | 383 process_all(); |
384 ghost_all(); | |
385 publish_all(); | |
386 } | |
387 } | |
388 | |
389 void | |
390 sciworkerd_finish(void) | |
391 { | |
392 struct taskentry *iter, *tmp; | |
393 | |
394 LL_FOREACH_SAFE(taskpending, iter, tmp) | |
395 taskentry_free(iter); | |
34 | 396 LL_FOREACH_SAFE(tasks, iter, tmp) { |
397 task_kill(iter->task); | |
19 | 398 taskentry_free(iter); |
34 | 399 } |
19 | 400 LL_FOREACH_SAFE(taskfinished, iter, tmp) |
401 taskentry_free(iter); | |
402 } |