[asterisk-commits] mjordan: branch 12 r400312 - in /branches/12/main: cdr.c cel.c manager.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Oct 2 16:25:54 CDT 2013


Author: mjordan
Date: Wed Oct  2 16:25:50 2013
New Revision: 400312

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=400312
Log:
Only create Stasis subscriptions when enabled

Subscribing to Stasis isn't free.

As such, this patch makes AMI, CDR, and CEL - the "big 3" - only subscribe
when enabled. Toggling their availability via a .conf file will
unsubscribe/subscribe as appropriate.

Review: https://reviewboard.asterisk.org/r/2888/

Modified:
    branches/12/main/cdr.c
    branches/12/main/cel.c
    branches/12/main/manager.c

Modified: branches/12/main/cdr.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/cdr.c?view=diff&rev=400312&r1=400311&r2=400312
==============================================================================
--- branches/12/main/cdr.c (original)
+++ branches/12/main/cdr.c Wed Oct  2 16:25:50 2013
@@ -221,6 +221,7 @@
 
 static void cdr_detach(struct ast_cdr *cdr);
 static void cdr_submit_batch(int shutdown);
+static int cdr_toggle_runtime_options(void);
 
 /*! \brief The configuration settings for this module */
 struct module_config {
@@ -2566,9 +2567,12 @@
 void ast_cdr_set_config(struct ast_cdr_config *config)
 {
 	RAII_VAR(struct module_config *, mod_cfg, ao2_global_obj_ref(module_configs), ao2_cleanup);
+
 	ao2_cleanup(mod_cfg->general);
 	mod_cfg->general = config;
 	ao2_ref(mod_cfg->general, +1);
+
+	cdr_toggle_runtime_options();
 }
 
 int ast_cdr_is_enabled(void)
@@ -3847,6 +3851,63 @@
 	ast_cdr_engine_term();
 }
 
+/*!
+ * \brief Destroy the active Stasis subscriptions/router/topics
+ */
+static void destroy_subscriptions(void)
+{
+	stasis_message_router_unsubscribe_and_join(stasis_router);
+	stasis_router = NULL;
+
+	ao2_cleanup(cdr_topic);
+	cdr_topic = NULL;
+
+	channel_subscription = stasis_forward_cancel(channel_subscription);
+	bridge_subscription = stasis_forward_cancel(bridge_subscription);
+	parking_subscription = stasis_forward_cancel(parking_subscription);
+}
+
+/*!
+ * \brief Create the Stasis subcriptions for CDRs
+ */
+static int create_subscriptions(void)
+{
+	/* Use the CDR topic to determine if we've already created this */
+	if (cdr_topic) {
+		return 0;
+	}
+
+	cdr_topic = stasis_topic_create("cdr_engine");
+	if (!cdr_topic) {
+		return -1;
+	}
+
+	channel_subscription = stasis_forward_all(ast_channel_topic_all_cached(), cdr_topic);
+	if (!channel_subscription) {
+		return -1;
+	}
+	bridge_subscription = stasis_forward_all(ast_bridge_topic_all_cached(), cdr_topic);
+	if (!bridge_subscription) {
+		return -1;
+	}
+	parking_subscription = stasis_forward_all(ast_parking_topic(), cdr_topic);
+	if (!parking_subscription) {
+		return -1;
+	}
+
+	stasis_router = stasis_message_router_create(cdr_topic);
+	if (!stasis_router) {
+		return -1;
+	}
+	stasis_message_router_add_cache_update(stasis_router, ast_channel_snapshot_type(), handle_channel_cache_message, NULL);
+	stasis_message_router_add(stasis_router, ast_channel_dial_type(), handle_dial_message, NULL);
+	stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
+	stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
+	stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
+
+	return 0;
+}
+
 static int process_config(int reload)
 {
 	RAII_VAR(struct module_config *, mod_cfg, module_config_alloc(), ao2_cleanup);
@@ -3889,12 +3950,7 @@
 
 static void cdr_engine_cleanup(void)
 {
-	channel_subscription = stasis_forward_cancel(channel_subscription);
-	bridge_subscription = stasis_forward_cancel(bridge_subscription);
-	parking_subscription = stasis_forward_cancel(parking_subscription);
-	stasis_message_router_unsubscribe_and_join(stasis_router);
-	ao2_cleanup(cdr_topic);
-	cdr_topic = NULL;
+	destroy_subscriptions();
 }
 
 static void cdr_engine_shutdown(void)
@@ -3960,10 +4016,35 @@
 	}
 }
 
+/*!
+ * \brief Checks if CDRs are enabled and enables/disables the necessary options
+ */
+static int cdr_toggle_runtime_options(void)
+{
+	RAII_VAR(struct module_config *, mod_cfg,
+		ao2_global_obj_ref(module_configs), ao2_cleanup);
+
+	if (ast_test_flag(&mod_cfg->general->settings, CDR_ENABLED)) {
+		if (create_subscriptions()) {
+			destroy_subscriptions();
+			ast_log(AST_LOG_ERROR, "Failed to create Stasis subscriptions\n");
+			return -1;
+		}
+		if (ast_test_flag(&mod_cfg->general->settings, CDR_BATCHMODE)) {
+			cdr_enable_batch_mode(mod_cfg->general);
+		} else {
+			ast_log(LOG_NOTICE, "CDR simple logging enabled.\n");
+		}
+	} else {
+		destroy_subscriptions();
+		ast_log(LOG_NOTICE, "CDR logging disabled.\n");
+	}
+
+	return 0;
+}
+
 int ast_cdr_engine_init(void)
 {
-	RAII_VAR(struct module_config *, mod_cfg, NULL, ao2_cleanup);
-
 	if (process_config(0)) {
 		return -1;
 	}
@@ -3975,34 +4056,6 @@
 	}
 	ao2_container_register("cdrs_by_channel", active_cdrs_by_channel, cdr_container_print_fn);
 
-	cdr_topic = stasis_topic_create("cdr_engine");
-	if (!cdr_topic) {
-		return -1;
-	}
-
-	channel_subscription = stasis_forward_all(ast_channel_topic_all_cached(), cdr_topic);
-	if (!channel_subscription) {
-		return -1;
-	}
-	bridge_subscription = stasis_forward_all(ast_bridge_topic_all_cached(), cdr_topic);
-	if (!bridge_subscription) {
-		return -1;
-	}
-	parking_subscription = stasis_forward_all(ast_parking_topic(), cdr_topic);
-	if (!parking_subscription) {
-		return -1;
-	}
-
-	stasis_router = stasis_message_router_create(cdr_topic);
-	if (!stasis_router) {
-		return -1;
-	}
-	stasis_message_router_add_cache_update(stasis_router, ast_channel_snapshot_type(), handle_channel_cache_message, NULL);
-	stasis_message_router_add(stasis_router, ast_channel_dial_type(), handle_dial_message, NULL);
-	stasis_message_router_add(stasis_router, ast_channel_entered_bridge_type(), handle_bridge_enter_message, NULL);
-	stasis_message_router_add(stasis_router, ast_channel_left_bridge_type(), handle_bridge_leave_message, NULL);
-	stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL);
-
 	sched = ast_sched_context_create();
 	if (!sched) {
 		ast_log(LOG_ERROR, "Unable to create schedule context.\n");
@@ -4013,19 +4066,7 @@
 	ast_register_cleanup(cdr_engine_cleanup);
 	ast_register_atexit(cdr_engine_shutdown);
 
-	mod_cfg = ao2_global_obj_ref(module_configs);
-
-	if (ast_test_flag(&mod_cfg->general->settings, CDR_ENABLED)) {
-		if (ast_test_flag(&mod_cfg->general->settings, CDR_BATCHMODE)) {
-			cdr_enable_batch_mode(mod_cfg->general);
-		} else {
-			ast_log(LOG_NOTICE, "CDR simple logging enabled.\n");
-		}
-	} else {
-		ast_log(LOG_NOTICE, "CDR logging disabled.\n");
-	}
-
-	return 0;
+	return cdr_toggle_runtime_options();
 }
 
 void ast_cdr_engine_term(void)
@@ -4063,17 +4104,7 @@
 		}
 	}
 
-	if (ast_test_flag(&mod_cfg->general->settings, CDR_ENABLED)) {
-		if (!ast_test_flag(&mod_cfg->general->settings, CDR_BATCHMODE)) {
-			ast_log(LOG_NOTICE, "CDR simple logging enabled.\n");
-		} else {
-			cdr_enable_batch_mode(mod_cfg->general);
-		}
-	} else {
-		ast_log(LOG_NOTICE, "CDR logging disabled, data will be lost.\n");
-	}
-
-	return 0;
-}
-
-
+	return cdr_toggle_runtime_options();
+}
+
+

Modified: branches/12/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/cel.c?view=diff&rev=400312&r1=400311&r2=400312
==============================================================================
--- branches/12/main/cel.c (original)
+++ branches/12/main/cel.c Wed Oct  2 16:25:50 2013
@@ -547,17 +547,6 @@
 	return 0;
 }
 
-static int do_reload(void)
-{
-	if (aco_process_config(&cel_cfg_info, 1) == ACO_PROCESS_ERROR) {
-		return -1;
-	}
-
-	ast_verb(3, "CEL logging %sabled.\n", ast_cel_check_enabled() ? "en" : "dis");
-
-	return 0;
-}
-
 const char *ast_cel_get_type_name(enum ast_cel_event_type type)
 {
 	return S_OR(cel_event_types[type], "Unknown");
@@ -1374,23 +1363,31 @@
 	cel_report_event(localone, AST_CEL_LOCAL_OPTIMIZE, NULL, extra, NULL);
 }
 
-static void ast_cel_engine_term(void)
-{
-	aco_info_destroy(&cel_cfg_info);
-	ao2_global_obj_release(cel_configs);
-	stasis_message_router_unsubscribe_and_join(cel_state_router);
-	cel_state_router = NULL;
-	ao2_cleanup(cel_aggregation_topic);
-	cel_aggregation_topic = NULL;
-	ao2_cleanup(cel_topic);
-	cel_topic = NULL;
+static void destroy_subscriptions(void)
+{
+ 	stasis_message_router_unsubscribe_and_join(cel_state_router);
+ 	cel_state_router = NULL;
+
+ 	ao2_cleanup(cel_aggregation_topic);
+ 	cel_aggregation_topic = NULL;
+ 	ao2_cleanup(cel_topic);
+ 	cel_topic = NULL;
+
 	cel_channel_forwarder = stasis_forward_cancel(cel_channel_forwarder);
 	cel_bridge_forwarder = stasis_forward_cancel(cel_bridge_forwarder);
 	cel_parking_forwarder = stasis_forward_cancel(cel_parking_forwarder);
 	cel_cel_forwarder = stasis_forward_cancel(cel_cel_forwarder);
-	ast_cli_unregister(&cli_status);
-	ao2_cleanup(cel_dialstatus_store);
-	cel_dialstatus_store = NULL;
+}
+
+static void ast_cel_engine_term(void)
+{
+	destroy_subscriptions();
+
+	aco_info_destroy(&cel_cfg_info);
+	ao2_global_obj_release(cel_configs);
+ 	ast_cli_unregister(&cli_status);
+ 	ao2_cleanup(cel_dialstatus_store);
+ 	cel_dialstatus_store = NULL;
 	ao2_cleanup(linkedids);
 	linkedids = NULL;
 	ao2_cleanup(cel_backends);
@@ -1398,29 +1395,12 @@
 	STASIS_MESSAGE_TYPE_CLEANUP(cel_generic_type);
 }
 
-int ast_cel_engine_init(void)
+/*!
+ * \brief Create the Stasis subscriptions for CEL
+ */
+static int create_subscriptions(void)
 {
 	int ret = 0;
-	if (!(linkedids = ast_str_container_alloc(NUM_APP_BUCKETS))) {
-		return -1;
-	}
-
-	if (!(cel_dialstatus_store = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS, dialstatus_hash, dialstatus_cmp))) {
-		return -1;
-	}
-
-	if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
-		return -1;
-	}
-
-	if (ast_cli_register(&cli_status)) {
-		return -1;
-	}
-
-	cel_backends = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash, cel_backend_cmp);
-	if (!cel_backends) {
-		return -1;
-	}
 
 	cel_aggregation_topic = stasis_topic_create("cel_aggregation_topic");
 	if (!cel_aggregation_topic) {
@@ -1515,11 +1495,33 @@
 		cel_local_cb,
 		NULL);
 
-	/* If somehow we failed to add any routes, just shut down the whole
-	 * thing and fail it.
-	 */
 	if (ret) {
-		ast_cel_engine_term();
+		ast_log(AST_LOG_ERROR, "Failed to register for Stasis messages\n");
+	}
+
+	return ret;
+}
+
+int ast_cel_engine_init(void)
+{
+	if (!(linkedids = ast_str_container_alloc(NUM_APP_BUCKETS))) {
+		return -1;
+	}
+
+	if (!(cel_dialstatus_store = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS, dialstatus_hash, dialstatus_cmp))) {
+		return -1;
+	}
+
+	if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
+		return -1;
+	}
+
+	if (ast_cli_register(&cli_status)) {
+		return -1;
+	}
+
+	cel_backends = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash, cel_backend_cmp);
+	if (!cel_backends) {
 		return -1;
 	}
 
@@ -1548,7 +1550,34 @@
 		}
 	}
 
-	ast_register_cleanup(ast_cel_engine_term);
+	if (ast_cel_check_enabled() && create_subscriptions()) {
+		return -1;
+	}
+
+	ast_register_atexit(&ast_cel_engine_term);
+	return 0;
+}
+
+static int do_reload(void)
+{
+	unsigned int was_enabled = ast_cel_check_enabled();
+	unsigned int is_enabled;
+
+	if (aco_process_config(&cel_cfg_info, 1) == ACO_PROCESS_ERROR) {
+		return -1;
+	}
+
+	is_enabled = ast_cel_check_enabled();
+
+	if (!was_enabled && is_enabled) {
+		if (create_subscriptions()) {
+			return -1;
+		}
+	} else if (was_enabled && !is_enabled) {
+		destroy_subscriptions();
+	}
+
+	ast_verb(3, "CEL logging %sabled.\n", is_enabled ? "en" : "dis");
 
 	return 0;
 }
@@ -1596,12 +1625,21 @@
 {
 	RAII_VAR(struct cel_config *, mod_cfg, ao2_global_obj_ref(cel_configs), ao2_cleanup);
 	RAII_VAR(struct ast_cel_general_config *, cleanup_config, mod_cfg->general, ao2_cleanup);
+	int was_enabled = ast_cel_check_enabled();
+	int is_enabled;
 
 	if (mod_cfg) {
 		mod_cfg->general = config;
 		if (mod_cfg->general) {
 			ao2_ref(mod_cfg->general, +1);
 		}
+
+		is_enabled = ast_cel_check_enabled();
+		if (!was_enabled && is_enabled) {
+			create_subscriptions();
+		} else if (was_enabled && !is_enabled) {
+			destroy_subscriptions();
+		}
 	}
 }
 

Modified: branches/12/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/manager.c?view=diff&rev=400312&r1=400311&r2=400312
==============================================================================
--- branches/12/main/manager.c (original)
+++ branches/12/main/manager.c Wed Oct  2 16:25:50 2013
@@ -1106,6 +1106,7 @@
 static int httptimeout = 60;
 static int broken_events_action = 0;
 static int manager_enabled = 0;
+static int subscribed = 0;
 static int webmanager_enabled = 0;
 static int manager_debug = 0;	/*!< enable some debugging code in the manager */
 static int authtimeout;
@@ -7794,16 +7795,8 @@
  */
 static int manager_subscriptions_init(void)
 {
-	int res;
-
-	res = STASIS_MESSAGE_TYPE_INIT(ast_manager_get_generic_type);
-	if (res != 0) {
-		return -1;
-	}
-	manager_topic = stasis_topic_create("manager_topic");
-	if (!manager_topic) {
-		return -1;
-	}
+	int res = 0;
+
 	rtp_topic_forwarder = stasis_forward_all(ast_rtp_topic(), manager_topic);
 	if (!rtp_topic_forwarder) {
 		return -1;
@@ -7823,6 +7816,36 @@
 	if (res != 0) {
 		return -1;
 	}
+	return 0;
+}
+
+static int subscribe_all(void)
+{
+	if (manager_subscriptions_init()) {
+		ast_log(AST_LOG_ERROR, "Failed to initialize manager subscriptions\n");
+		return -1;
+	}
+	if (manager_system_init()) {
+		ast_log(AST_LOG_ERROR, "Failed to initialize manager system handling\n");
+		return -1;
+	}
+	if (manager_channels_init()) {
+		ast_log(AST_LOG_ERROR, "Failed to initialize manager channel handling\n");
+		return -1;
+	}
+	if (manager_mwi_init()) {
+		ast_log(AST_LOG_ERROR, "Failed to initialize manager MWI handling\n");
+		return -1;
+	}
+	if (manager_bridging_init()) {
+		return -1;
+	}
+	if (manager_endpoints_init()) {
+		ast_log(AST_LOG_ERROR, "Failed to initialize manager endpoints handling\n");
+		return -1;
+	}
+
+	subscribed = 1;
 	return 0;
 }
 
@@ -7848,27 +7871,12 @@
 	manager_enabled = 0;
 
 	if (!reload) {
-		if (manager_subscriptions_init()) {
-			ast_log(AST_LOG_ERROR, "Failed to initialize manager subscriptions\n");
+		int res = STASIS_MESSAGE_TYPE_INIT(ast_manager_get_generic_type);
+		if (res != 0) {
 			return -1;
 		}
-		if (manager_system_init()) {
-			ast_log(AST_LOG_ERROR, "Failed to initialize manager system handling\n");
-			return -1;
-		}
-		if (manager_channels_init()) {
-			ast_log(AST_LOG_ERROR, "Failed to initialize manager channel handling\n");
-			return -1;
-		}
-		if (manager_mwi_init()) {
-			ast_log(AST_LOG_ERROR, "Failed to initialize manager MWI handling\n");
-			return -1;
-		}
-		if (manager_bridging_init()) {
-			return -1;
-		}
-		if (manager_endpoints_init()) {
-			ast_log(AST_LOG_ERROR, "Failed to initialize manager endpoints handling\n");
+		manager_topic = stasis_topic_create("manager_topic");
+		if (!manager_topic) {
 			return -1;
 		}
 	}
@@ -8056,6 +8064,13 @@
 		}
 	}
 
+	if (manager_enabled && !subscribed) {
+		if (subscribe_all() != 0) {
+			ast_log(LOG_ERROR, "Manager subscription error\n");
+			return -1;
+		}
+	}
+
 	ast_sockaddr_copy(&amis_desc_local_address_tmp, &amis_desc.local_address);
 
 	/* if the amis address has not been set, default is the same as non secure ami */




More information about the asterisk-commits mailing list