Skip to content

Commit 6bac27c

Browse files
jfsmigfvennetier
authored andcommitted
gridinit_cmd: Make 'stop' wait for the process to terminate
1 parent 0bbed29 commit 6bac27c

File tree

1 file changed

+55
-47
lines changed

1 file changed

+55
-47
lines changed

main/gridinit_cmd.c

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ struct dump_as_is_arg_s {
5656
guint count_errors;
5757
};
5858

59-
struct command_s {
60-
const gchar *name;
61-
int (*action) (int argc, char **args);
62-
};
63-
6459
struct child_info_s {
6560
char *key;
6661
char *group;
@@ -308,29 +303,12 @@ open_cnx(void)
308303
}
309304

310305
static int
311-
send_commandf(void (*dumper)(FILE *, void *), void *udata, const char *fmt, ...)
312-
{
313-
FILE *req_stream;
314-
if (NULL != (req_stream = open_cnx())) {
315-
va_list va;
316-
va_start(va, fmt);
317-
vfprintf(req_stream, fmt, va);
318-
va_end(va);
319-
320-
fflush(req_stream);
321-
dumper(req_stream, udata);
322-
fclose(req_stream);
323-
return 1;
324-
}
325-
326-
return 0;
327-
}
328-
329-
static int
330-
send_commandv(void (*dumper)(FILE *, void*), void *udata, int argc, char **args)
306+
send_commandv(void (*dumper)(FILE *, void*), void *udata, const char *cmd, int argc, char **args)
331307
{
332308
FILE *req_stream;
333309
if (NULL != (req_stream = open_cnx())) {
310+
fputs(cmd, req_stream);
311+
fputc(' ', req_stream);
334312
for (int i=0; i<argc ;i++) {
335313
fputs(args[i], req_stream);
336314
fputc(' ', req_stream);
@@ -355,7 +333,7 @@ _fetch_services(void)
355333
jobs = read_services_list(in_stream);
356334
}
357335

358-
int rc = send_commandv(_on_reply, NULL, 1, (char*[]){"status",NULL});
336+
int rc = send_commandv(_on_reply, NULL, "status", 0, (char*[]){NULL});
359337
if (!rc) {
360338
g_list_free_full(jobs, (GDestroyNotify)child_info_free);
361339
return NULL;
@@ -370,15 +348,14 @@ _filter_services(GList *original, char **filters, int *counters)
370348
gboolean matches(struct child_info_s *ci) {
371349
for (int i=0; filters[i] ;i++) {
372350
const char *pattern = filters[i];
373-
int *pcounter = counters + i;
374351
if (pattern[0]=='@') {
375352
if (gridinit_group_in_set(pattern+1, ci->group)) {
376-
(*pcounter) ++;
353+
if (counters) counters[i] ++;
377354
return TRUE;
378355
}
379356
} else {
380357
if (!g_ascii_strcasecmp(ci->key, pattern)) {
381-
(*pcounter) ++;
358+
if (counters) counters[i] ++;
382359
return TRUE;
383360
}
384361
}
@@ -400,11 +377,11 @@ command_status(int lvl, int argc, char **args)
400377
{
401378
char fmt_title[256], fmt_line[256];
402379

403-
int *counters = alloca(sizeof(int) * (argc-1));
404-
memset(counters, 0, sizeof(int) * (argc-1));
380+
int *counters = alloca(sizeof(int) * (argc+1));
381+
memset(counters, 0, sizeof(int) * (argc+1));
405382

406383
GList *all_jobs = _fetch_services();
407-
GList *jobs = _filter_services(all_jobs, args+1, counters);
384+
GList *jobs = _filter_services(all_jobs, args, counters);
408385

409386
/* compute the max length of several variable field, for well aligned
410387
* columns on the output. */
@@ -491,7 +468,7 @@ command_status(int lvl, int argc, char **args)
491468

492469
/* If patterns have been specified, we must find items (the user
493470
* expects something to show up */
494-
for (int i=0; i<argc-1 ;i++) {
471+
for (int i=0; i<argc ;i++) {
495472
if (!counters[i])
496473
count_misses ++;
497474
}
@@ -524,27 +501,54 @@ static int
524501
command_start(int argc, char **args)
525502
{
526503
struct dump_as_is_arg_s dump_args = {};
527-
int rc = send_commandv(dump_as_is, &dump_args, argc, args);
504+
int rc = send_commandv(dump_as_is, &dump_args, "start", argc, args);
528505
return !rc
529506
|| dump_args.count_errors != 0
530507
|| dump_args.count_success == 0;
531508
}
532509

533510
static int
534-
command_stop(int argc, char **args)
511+
command_kill(int argc, char **args)
535512
{
536513
struct dump_as_is_arg_s dump_args = {};
537-
int rc = send_commandv(dump_as_is, &dump_args, argc, args);
514+
int rc = send_commandv(dump_as_is, &dump_args, "stop", argc, args);
538515
return !rc
539516
|| dump_args.count_errors != 0
540517
|| dump_args.count_success == 0;
541518
}
542519

520+
static int
521+
command_stop(int argc, char **args)
522+
{
523+
gboolean _all_down(void) {
524+
gboolean rc = TRUE;
525+
GList *all_jobs = _fetch_services();
526+
GList *jobs = _filter_services(all_jobs, args, NULL);
527+
for (GList *l = jobs; l ;l=l->next) {
528+
struct child_info_s *ci = l->data;
529+
if (ci->pid > 0)
530+
rc = FALSE;
531+
}
532+
g_list_free_full(all_jobs, (GDestroyNotify)child_info_free);
533+
g_list_free(jobs);
534+
return rc;
535+
}
536+
537+
while (!_all_down()) {
538+
g_print("# Stopping...\n");
539+
int rc = command_kill(argc, args);
540+
if (rc != 0)
541+
return rc;
542+
g_usleep(G_TIME_SPAN_SECOND);
543+
}
544+
return 0;
545+
}
546+
543547
static int
544548
command_restart(int argc, char **args)
545549
{
546550
struct dump_as_is_arg_s dump_args = {};
547-
int rc = send_commandv(dump_as_is, &dump_args, argc, args);
551+
int rc = send_commandv(dump_as_is, &dump_args, "restart", argc, args);
548552
return !rc
549553
|| dump_args.count_errors != 0
550554
|| dump_args.count_success == 0;
@@ -554,7 +558,7 @@ static int
554558
command_repair(int argc, char **args)
555559
{
556560
struct dump_as_is_arg_s dump_args = {};
557-
int rc = send_commandv(dump_as_is, &dump_args, argc, args);
561+
int rc = send_commandv(dump_as_is, &dump_args, "repair", argc, args);
558562
return !rc
559563
|| dump_args.count_errors != 0
560564
|| dump_args.count_success == 0;
@@ -565,7 +569,7 @@ command_reload(int argc, char **args)
565569
{
566570
struct dump_as_is_arg_s dump_args = {};
567571
(void) argc, (void) args;
568-
int rc = send_commandf(dump_as_is, &dump_args, "reload\n");
572+
int rc = send_commandv(dump_as_is, &dump_args, "reload", 0, (char*[]){NULL});
569573
return !rc
570574
|| dump_args.count_errors != 0
571575
|| dump_args.count_success == 0;
@@ -574,13 +578,17 @@ command_reload(int argc, char **args)
574578

575579
/* ------------------------------------------------------------------------- */
576580

577-
static struct command_s COMMANDS[] = {
578-
{ "status", command_status0 },
579-
{ "status2", command_status1 },
580-
{ "status3", command_status2 },
581-
{ "start", command_start },
582-
{ "stop", command_stop },
583-
{ "restart", command_restart },
581+
struct command_s {
582+
const gchar *name;
583+
int (*action) (int argc, char **args);
584+
} COMMANDS[] = {
585+
{ "status", command_status0 },
586+
{ "status2", command_status1 },
587+
{ "status3", command_status2 },
588+
{ "start", command_start },
589+
{ "stop", command_stop },
590+
{ "kill", command_kill },
591+
{ "restart", command_restart },
584592
{ "reload", command_reload },
585593
{ "repair", command_repair },
586594
{ NULL, NULL }
@@ -652,7 +660,7 @@ main(int argc, char ** args)
652660

653661
for (cmd=COMMANDS; cmd->name ;cmd++) {
654662
if (0 == g_ascii_strcasecmp(cmd->name, args[opt_index])) {
655-
int rc = cmd->action(argc-opt_index, args+opt_index);
663+
int rc = cmd->action(argc-(opt_index+1), args+(opt_index+1));
656664
close(1);
657665
close(2);
658666
return rc;

0 commit comments

Comments
 (0)