[svn-commits] mmichelson: branch mmichelson/queue_bugbug r394790 - in /team/mmichelson/queu...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Jul 19 09:37:35 CDT 2013


Author: mmichelson
Date: Fri Jul 19 09:37:31 2013
New Revision: 394790

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=394790
Log:
Commit some progress.

This contains two things
1) A bunch of debugging that will eventually be removed due to some
local optimization problems I encountered.
2) Handling for agent login and logoff events.


Modified:
    team/mmichelson/queue_bugbug/apps/app_queue.c
    team/mmichelson/queue_bugbug/main/bridging.c
    team/mmichelson/queue_bugbug/main/core_local.c

Modified: team/mmichelson/queue_bugbug/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/apps/app_queue.c?view=diff&rev=394790&r1=394789&r2=394790
==============================================================================
--- team/mmichelson/queue_bugbug/apps/app_queue.c (original)
+++ team/mmichelson/queue_bugbug/apps/app_queue.c Fri Jul 19 09:37:31 2013
@@ -1920,6 +1920,12 @@
 	if (!payload) {
 		return;
 	}
+	if (!caller_snapshot) {
+		ast_log(LOG_NOTICE, "I'm sending a NULL CALLER snapshot\n");
+	} 
+	if (!agent_snapshot) {
+		ast_log(LOG_NOTICE, "I'm sending a NULL AGENT snapshot\n");
+	}
 
 	ast_multi_channel_blob_add_channel(payload, "caller", caller_snapshot);
 	ast_multi_channel_blob_add_channel(payload, "agent", agent_snapshot);
@@ -5142,6 +5148,29 @@
 			queue_agent_complete_type(), blob);
 }
 
+static void queue_agent_cb(void *userdata, struct stasis_subscription *sub,
+		struct stasis_topic *topic, struct stasis_message *msg)
+{
+	struct ast_channel_blob *agent_blob;
+
+	if (stasis_subscription_final_message(sub, msg)) {
+		return;
+	}
+
+	agent_blob = stasis_message_data(msg);
+
+	if (ast_channel_agent_login_type() == stasis_message_type(msg)) {
+		ast_queue_log("NONE", agent_blob->snapshot->uniqueid,
+			ast_json_string_get(ast_json_object_get(agent_blob->blob, "agent")),
+			"AGENTLOGIN", "%s", agent_blob->snapshot->name);
+	} else if (ast_channel_agent_logoff_type() == stasis_message_type(msg)) {
+		ast_queue_log("NONE", agent_blob->snapshot->uniqueid,
+			ast_json_string_get(ast_json_object_get(agent_blob->blob, "agent")),
+			"AGENTLOGOFF", "%s|%ld", agent_blob->snapshot->name,
+			(long) ast_json_integer_get(ast_json_object_get(agent_blob->blob, "logintime")));
+	}
+}
+
 struct local_optimization {
 	AST_DECLARE_STRING_FIELDS(
 		AST_STRING_FIELD(dest_bridge_uniqueid);
@@ -5212,7 +5241,9 @@
 	}
 
 	ast_string_field_set(queue_data, caller_uniqueid, ast_channel_uniqueid(qe->chan));
+	ast_log(LOG_NOTICE, "Initial caller uniqueid is %s\n", queue_data->caller_uniqueid);
 	ast_string_field_set(queue_data, agent_uniqueid, ast_channel_uniqueid(peer));
+	ast_log(LOG_NOTICE, "Initial agent uniqueid is %s\n", queue_data->agent_uniqueid);
 	queue_data->queue = queue_ref(qe->parent);
 	queue_data->starttime = starttime;
 	queue_data->holdstart = holdstart;
@@ -5286,6 +5317,7 @@
 		RAII_VAR(struct ast_channel_snapshot *, caller, NULL, ao2_cleanup);
 		RAII_VAR(struct ast_channel_snapshot *, agent, NULL, ao2_cleanup);
 
+		ast_log(LOG_NOTICE, "Getting a transfer event...\n");
 		/* BUGBUG Once atxfer_features is merged, we need to also return when
 		 * atxfer_msg->dest == AST_ATTENDED_TRANSFER_THREEWAY
 		 */
@@ -5294,11 +5326,16 @@
 		}
 
 		ao2_lock(queue_data);
-		if (ast_strlen_zero(queue_data->bridge_uniqueid) ||
-				((atxfer_msg->to_transferee.bridge_snapshot && strcmp(queue_data->bridge_uniqueid,
+		ast_log(LOG_NOTICE, "queue bridge id is %s\n", queue_data->bridge_uniqueid);
+		ast_log(LOG_NOTICE, "to_transferee bridge id is %s\n", atxfer_msg->to_transferee.bridge_snapshot ?
+				atxfer_msg->to_transferee.bridge_snapshot->uniqueid : "NULL");
+		ast_log(LOG_NOTICE, "to_transfer_target bridge id is %s\n", atxfer_msg->to_transfer_target.bridge_snapshot ?
+				atxfer_msg->to_transfer_target.bridge_snapshot->uniqueid : "NULL");
+
+		if ((!atxfer_msg->to_transferee.bridge_snapshot || strcmp(queue_data->bridge_uniqueid,
 						atxfer_msg->to_transferee.bridge_snapshot->uniqueid)) &&
-				 (atxfer_msg->to_transfer_target.bridge_snapshot && strcmp(queue_data->bridge_uniqueid,
-					 atxfer_msg->to_transfer_target.bridge_snapshot->uniqueid)))) {
+				 (!atxfer_msg->to_transfer_target.bridge_snapshot || strcmp(queue_data->bridge_uniqueid,
+					 atxfer_msg->to_transfer_target.bridge_snapshot->uniqueid))) {
 			ao2_unlock(queue_data);
 			return;
 		}
@@ -5349,6 +5386,8 @@
 
 	dest = ast_json_integer_get(ast_json_object_get(ast_multi_channel_blob_get_json(optimization_blob), "dest"));
 
+	ast_log(LOG_NOTICE, "dest is %s\n", dest == AST_UNREAL_OWNER ? "OWNER" : "CHAN");
+
 	ast_log(LOG_NOTICE, "Destination bridge is %s\n",
 			dest == AST_UNREAL_OWNER ? local_one->bridgeid : local_two->bridgeid);
 
@@ -5399,8 +5438,12 @@
 
 	ast_string_field_set(queue_data, bridge_uniqueid, optimization->dest_bridge_uniqueid);
 	if (is_caller) {
+		ast_log(LOG_NOTICE, "Changing caller uniqueid from %s to %s\n",
+				queue_data->caller_uniqueid, optimization->source_chan_uniqueid);
 		ast_string_field_set(queue_data, caller_uniqueid, optimization->source_chan_uniqueid);
 	} else {
+		ast_log(LOG_NOTICE, "Changing agent uniqueid from %s to %s\n",
+				queue_data->agent_uniqueid, optimization->source_chan_uniqueid);
 		ast_string_field_set(queue_data, agent_uniqueid, optimization->source_chan_uniqueid);
 	}
 
@@ -9990,6 +10033,8 @@
 static const struct ast_data_entry queue_data_providers[] = {
 	AST_DATA_ENTRY("asterisk/application/queue/list", &queues_data_provider),
 };
+	
+static struct stasis_message_router *agent_router;
 
 static int unload_module(void)
 {
@@ -10016,6 +10061,7 @@
 		stasis_message_router_remove(message_router, queue_agent_dump_type());
 		stasis_message_router_remove(message_router, queue_agent_ringnoanswer_type());
 	}
+	stasis_message_router_unsubscribe_and_join(agent_router);
 
 	STASIS_MESSAGE_TYPE_CLEANUP(queue_caller_join_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(queue_caller_leave_type);
@@ -10093,7 +10139,7 @@
 	int res;
 	struct ast_flags mask = {AST_FLAGS_ALL, };
 	struct ast_config *member_config;
-	struct stasis_message_router *message_router;
+	struct stasis_message_router *manager_router;
 
 	queues = ao2_container_alloc(MAX_QUEUE_BUCKETS, queue_hash_cb, queue_cmp_cb);
 
@@ -10164,8 +10210,13 @@
 		res = -1;
 	}
 
-	message_router = ast_manager_get_message_router();
-	if (!message_router) {
+	manager_router = ast_manager_get_message_router();
+	if (!manager_router) {
+		return AST_MODULE_LOAD_DECLINE;
+	}
+
+	agent_router = stasis_message_router_create(ast_channel_topic_all());
+	if (!agent_router) {
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
@@ -10186,75 +10237,85 @@
 	STASIS_MESSAGE_TYPE_INIT(queue_agent_dump_type);
 	STASIS_MESSAGE_TYPE_INIT(queue_agent_ringnoanswer_type);
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_caller_join_type(),
 				  queue_channel_manager_event,
 				  "QueueCallerJoin");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_caller_leave_type(),
 				  queue_channel_manager_event,
 				  "QueueCallerLeave");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_caller_abandon_type(),
 				  queue_channel_manager_event,
 				  "QueueCallerAbandon");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_status_type(),
 				  queue_member_manager_event,
 				  "QueueMemberStatus");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_added_type(),
 				  queue_member_manager_event,
 				  "QueueMemberAdded");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_removed_type(),
 				  queue_member_manager_event,
 				  "QueueMemberRemoved");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_pause_type(),
 				  queue_member_manager_event,
 				  "QueueMemberPause");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_penalty_type(),
 				  queue_member_manager_event,
 				  "QueueMemberPenalty");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_member_ringinuse_type(),
 				  queue_member_manager_event,
 				  "QueueMemberRinginuse");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_agent_called_type(),
 				  queue_multi_channel_manager_event,
 				  "AgentCalled");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_agent_connect_type(),
 				  queue_multi_channel_manager_event,
 				  "AgentConnect");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_agent_complete_type(),
 				  queue_multi_channel_manager_event,
 				  "AgentComplete");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_agent_dump_type(),
 				  queue_multi_channel_manager_event,
 				  "AgentDump");
 
-	stasis_message_router_add(message_router,
+	stasis_message_router_add(manager_router,
 				  queue_agent_ringnoanswer_type(),
 				  queue_multi_channel_manager_event,
 				  "AgentRingNoAnswer");
+
+	stasis_message_router_add(agent_router,
+			ast_channel_agent_login_type(),
+			queue_agent_cb,
+			NULL);
+
+	stasis_message_router_add(agent_router,
+			ast_channel_agent_logoff_type(),
+			queue_agent_cb,
+			NULL);
 
 	ast_extension_state_add(NULL, NULL, extension_state_cb, NULL);
 

Modified: team/mmichelson/queue_bugbug/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/main/bridging.c?view=diff&rev=394790&r1=394789&r2=394790
==============================================================================
--- team/mmichelson/queue_bugbug/main/bridging.c (original)
+++ team/mmichelson/queue_bugbug/main/bridging.c Fri Jul 19 09:37:31 2013
@@ -4907,6 +4907,16 @@
  * write it into the bridge yet because optimization has the
  * bridge locked.
  */
+
+	ast_log(LOG_NOTICE, "Optimization bridge dump\n");
+	ast_log(LOG_NOTICE, "dst_channel is %s\n", ast_channel_name(dst_bridge_channel->chan));
+	ast_log(LOG_NOTICE, "src_channel is %s\n", ast_channel_name(src_bridge_channel->chan));
+	ast_log(LOG_NOTICE, "pvt->owner is %s\n", ast_channel_name(pvt->owner));
+	ast_log(LOG_NOTICE, "pvt->chan is %s\n", ast_channel_name(pvt->chan));
+	ast_log(LOG_NOTICE, "dst_bridge is %s\n", dst_bridge->uniqueid);
+	ast_log(LOG_NOTICE, "pvt->owner bridge is %s\n", ast_channel_internal_bridge(pvt->owner)->uniqueid);
+	ast_log(LOG_NOTICE, "pvt->chan bridge is %s\n", ast_channel_internal_bridge(pvt->chan)->uniqueid);
+
 	other = ast_bridge_channel_peer(src_bridge_channel);
 	if (other && other->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
 		unsigned int id = ast_atomic_fetchadd_int((int *) &optimization_id, +1);

Modified: team/mmichelson/queue_bugbug/main/core_local.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/main/core_local.c?view=diff&rev=394790&r1=394789&r2=394790
==============================================================================
--- team/mmichelson/queue_bugbug/main/core_local.c (original)
+++ team/mmichelson/queue_bugbug/main/core_local.c Fri Jul 19 09:37:31 2013
@@ -385,14 +385,9 @@
 		struct ast_json *json_object)
 {
 	struct ast_multi_channel_blob *payload;
-	RAII_VAR(struct ast_json *, blob, ast_json_null(), ast_json_unref);
 	RAII_VAR(struct ast_channel_snapshot *, local_one_snapshot, NULL, ao2_cleanup);
 	RAII_VAR(struct ast_channel_snapshot *, local_two_snapshot, NULL, ao2_cleanup);
 
-	if (!blob) {
-		return NULL;
-	}
-
 	local_one_snapshot = ast_channel_snapshot_create(p->base.owner);
 	if (!local_one_snapshot) {
 		return NULL;
@@ -403,7 +398,7 @@
 		return NULL;
 	}
 
-	payload = ast_multi_channel_blob_create(blob);
+	payload = ast_multi_channel_blob_create(json_object);
 	if (!payload) {
 		return NULL;
 	}
@@ -417,10 +412,12 @@
 static void local_optimization_started_cb(struct ast_unreal_pvt *base, struct ast_channel *source,
 		enum ast_unreal_channel_indicator dest, unsigned int id)
 {
-	RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref);
+	RAII_VAR(struct ast_json *, json_object, ast_json_null(), ast_json_unref);
 	RAII_VAR(struct ast_multi_channel_blob *, payload, NULL, ao2_cleanup);
 	RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
 	struct local_pvt *p = (struct local_pvt *)base;
+
+	ast_log(LOG_NOTICE, "Publishing dest of %s\n", dest == AST_UNREAL_OWNER ? "OWNER" : "CHAN");
 
 	json_object = ast_json_pack("{s: i, s: i}",
 			"dest", dest, "id", id);
@@ -452,7 +449,7 @@
 /*! \brief Callback for \ref ast_unreal_pvt_callbacks \ref optimization_finished_cb */
 static void local_optimization_finished_cb(struct ast_unreal_pvt *base, int success, unsigned int id)
 {
-	RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref);
+	RAII_VAR(struct ast_json *, json_object, ast_json_null(), ast_json_unref);
 	RAII_VAR(struct ast_multi_channel_blob *, payload, NULL, ao2_cleanup);
 	RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
 	struct local_pvt *p = (struct local_pvt *)base;




More information about the svn-commits mailing list