core: Remove non-critical cleanup from startup aborts.

When built-in components of Asterisk fail to start they cause the
Asterisk startup to abort.  In these cases only the most critical
cleanup should be performed - closing databases and terminating
proceses.  These cleanups are registered using ast_register_atexit, all
other cleanups should not be run during startup abort.

The main reason for this change is that these cleanup procedures are
untestable from the partially initialized states, if they fail it could
prevent us from ever running the critical cleanup with ast_run_atexits.

Change-Id: Iecc2df98008b21509925ff16740bd5fa29527db3
This commit is contained in:
Corey Farrell
2018-03-10 04:33:33 -05:00
parent 99702af57a
commit c09a10bb1b
9 changed files with 13 additions and 46 deletions

View File

@@ -1565,7 +1565,6 @@ int ast_cel_engine_init(void)
ao2_global_obj_replace_unref(cel_linkedids, container);
ao2_cleanup(container);
if (!container) {
cel_engine_cleanup();
return -1;
}
@@ -1574,17 +1573,14 @@ int ast_cel_engine_init(void)
ao2_global_obj_replace_unref(cel_dialstatus_store, container);
ao2_cleanup(container);
if (!container) {
cel_engine_cleanup();
return -1;
}
if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
cel_engine_cleanup();
return -1;
}
if (ast_cli_register(&cli_status)) {
cel_engine_cleanup();
return -1;
}
@@ -1592,12 +1588,10 @@ int ast_cel_engine_init(void)
ao2_global_obj_replace_unref(cel_backends, container);
ao2_cleanup(container);
if (!container) {
cel_engine_cleanup();
return -1;
}
if (aco_info_init(&cel_cfg_info)) {
cel_engine_cleanup();
return -1;
}
@@ -1610,7 +1604,6 @@ int ast_cel_engine_init(void)
struct cel_config *cel_cfg = cel_config_alloc();
if (!cel_cfg) {
cel_engine_cleanup();
return -1;
}
@@ -1623,12 +1616,10 @@ int ast_cel_engine_init(void)
}
if (create_subscriptions()) {
cel_engine_cleanup();
return -1;
}
if (ast_cel_check_enabled() && create_routes()) {
cel_engine_cleanup();
return -1;
}

View File

@@ -1074,7 +1074,6 @@ static void local_shutdown(void)
int ast_local_init(void)
{
if (STASIS_MESSAGE_TYPE_INIT(ast_local_optimization_begin_type)) {
return -1;
}
@@ -1094,17 +1093,13 @@ int ast_local_init(void)
locals = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, locals_cmp_cb);
if (!locals) {
ao2_cleanup(local_tech.capabilities);
local_tech.capabilities = NULL;
return -1;
}
/* Make sure we can register our channel type */
if (ast_channel_register(&local_tech)) {
ast_log(LOG_ERROR, "Unable to register channel class 'Local'\n");
ao2_ref(locals, -1);
ao2_cleanup(local_tech.capabilities);
local_tech.capabilities = NULL;
return -1;
}
ast_cli_register_multiple(cli_local, ARRAY_LEN(cli_local));

View File

@@ -913,24 +913,20 @@ int devstate_init(void)
}
device_state_topic_all = stasis_topic_create("ast_device_state_topic");
if (!device_state_topic_all) {
devstate_cleanup();
return -1;
}
device_state_topic_pool = stasis_topic_pool_create(ast_device_state_topic_all());
if (!device_state_topic_pool) {
devstate_cleanup();
return -1;
}
device_state_cache = stasis_cache_create_full(device_state_get_id,
device_state_aggregate_calc, device_state_aggregate_publish);
if (!device_state_cache) {
devstate_cleanup();
return -1;
}
device_state_topic_cached = stasis_caching_topic_create(ast_device_state_topic_all(),
device_state_cache);
if (!device_state_topic_cached) {
devstate_cleanup();
return -1;
}
@@ -938,7 +934,6 @@ int devstate_init(void)
devstate_change_cb, NULL);
if (!devstate_message_sub) {
ast_log(LOG_ERROR, "Failed to create subscription creating uncached device state aggregate events.\n");
devstate_cleanup();
return -1;
}

View File

@@ -2404,17 +2404,18 @@ static void test_dsp_shutdown(void)
int ast_dsp_init(void)
{
int res = _dsp_init(0);
if (_dsp_init(0)) {
return -1;
}
#ifdef TEST_FRAMEWORK
if (!res) {
AST_TEST_REGISTER(test_dsp_fax_detect);
AST_TEST_REGISTER(test_dsp_dtmf_detect);
ast_register_cleanup(test_dsp_shutdown);
}
#endif
return res;
return 0;
}
int ast_dsp_reload(void)

View File

@@ -1167,17 +1167,10 @@ int ast_features_init(void)
int res;
res = ast_features_config_init();
if (res) {
return res;
}
res |= ast_register_application2(app_bridge, bridge_exec, NULL, NULL, NULL);
res |= ast_manager_register_xml_core("Bridge", EVENT_FLAG_CALL, action_bridge);
if (res) {
features_shutdown();
} else {
ast_register_cleanup(features_shutdown);
}
return res;
}

View File

@@ -2000,9 +2000,5 @@ int ast_features_config_init(void)
res |= __ast_custom_function_register(&featuremap_function, NULL);
res |= ast_cli_register_multiple(cli_features_config, ARRAY_LEN(cli_features_config));
if (res) {
ast_features_config_shutdown();
}
return res;
}

View File

@@ -1173,13 +1173,13 @@ static void indications_shutdown(void)
/*! \brief Load indications module */
int ast_indications_init(void)
{
if (!(ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS,
ast_tone_zone_hash, ast_tone_zone_cmp))) {
ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS,
ast_tone_zone_hash, ast_tone_zone_cmp);
if (!ast_tone_zones) {
return -1;
}
if (load_indications(0)) {
indications_shutdown();
return -1;
}

View File

@@ -1433,7 +1433,6 @@ int load_pbx_builtins(void)
for (x = 0; x < ARRAY_LEN(builtins); x++) {
if (ast_register_application2(builtins[x].name, builtins[x].execute, NULL, NULL, NULL)) {
ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name);
unload_pbx_builtins();
return -1;
}
}

View File

@@ -383,20 +383,17 @@ int ast_sorcery_init(void)
wizards = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, WIZARD_BUCKETS,
ast_sorcery_internal_wizard_hash_fn, NULL, ast_sorcery_internal_wizard_cmp_fn);
if (!wizards) {
sorcery_cleanup();
return -1;
}
observers = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, NULL, NULL);
if (!observers) {
sorcery_cleanup();
return -1;
}
instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS,
ast_sorcery_hash_fn, NULL, ast_sorcery_cmp_fn);
if (!instances) {
sorcery_cleanup();
return -1;
}