diff --git a/include/proto/peers.h b/include/proto/peers.h index 782b66e4d..9d4aaff23 100644 --- a/include/proto/peers.h +++ b/include/proto/peers.h @@ -28,7 +28,7 @@ #include #include -void peers_init_sync(struct peers *peers); +int peers_init_sync(struct peers *peers); void peers_register_table(struct peers *, struct stktable *table); void peers_setup_frontend(struct proxy *fe); diff --git a/src/cfgparse.c b/src/cfgparse.c index 1ca10bef2..5a6b705ef 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -9085,7 +9085,12 @@ int check_config_validity() curpeers->peers_fe = NULL; } else { - peers_init_sync(curpeers); + if (!peers_init_sync(curpeers)) { + ha_alert("Peers section '%s': out of memory, giving up on peers.\n", + curpeers->id); + cfgerr++; + break; + } last = &curpeers->next; continue; } diff --git a/src/peers.c b/src/peers.c index e61caaf93..c16617d90 100644 --- a/src/peers.c +++ b/src/peers.c @@ -2202,9 +2202,9 @@ static struct task *process_peer_sync(struct task * task, void *context, unsigne /* - * + * returns 0 in case of error. */ -void peers_init_sync(struct peers *peers) +int peers_init_sync(struct peers *peers) { struct peer * curpeer; struct listener *listener; @@ -2216,10 +2216,14 @@ void peers_init_sync(struct peers *peers) list_for_each_entry(listener, &peers->peers_fe->conf.listeners, by_fe) listener->maxconn = peers->peers_fe->maxconn; peers->sync_task = task_new(MAX_THREADS_MASK); + if (!peers->sync_task) + return 0; + peers->sync_task->process = process_peer_sync; peers->sync_task->context = (void *)peers; peers->sighandler = signal_register_task(0, peers->sync_task, 0); task_wakeup(peers->sync_task, TASK_WOKEN_INIT); + return 1; }