Author: mmichelson
Date: Wed Jan 14 14:39:01 2015
New Revision: 430609

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430609
Log:
Prevent slow graceful shutdown when outbound publications never started.

The code was missing the case for explicitly destroying an outbound publication
when Asterisk had never actually published anything. The result was that 
Asterisk
would hang for a while on a graceful shutdown.

With this change, the case is taken into account, and on a graceful shutdown, 
these
publications are destroyed without the need to actually send a PUBLISH request.

ASTERISK-24655 #close
Reported by Kevin Harwell

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

Merged revisions 430608 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    trunk/   (props changed)
    trunk/res/res_pjsip_outbound_publish.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/res/res_pjsip_outbound_publish.c
URL: 
http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_outbound_publish.c?view=diff&rev=430609&r1=430608&r2=430609
==============================================================================
--- trunk/res/res_pjsip_outbound_publish.c (original)
+++ trunk/res/res_pjsip_outbound_publish.c Wed Jan 14 14:39:01 2015
@@ -662,25 +662,40 @@
        }
 }
 
+static int explicit_publish_destroy(void *data)
+{
+       struct ast_sip_outbound_publish_client *client = data;
+
+       pjsip_publishc_destroy(client->client);
+       ao2_ref(client, -1);
+
+       return 0;
+}
+
 /*! \brief Helper function which cancels and un-publishes a no longer used 
client */
 static int cancel_and_unpublish(struct ast_sip_outbound_publish_client *client)
 {
+       struct ast_sip_event_publisher_handler *handler;
        SCOPED_AO2LOCK(lock, client);
 
-       /* If this publish client is currently publishing stop and terminate 
any refresh timer */
-       if (client->started) {
-               struct ast_sip_event_publisher_handler *handler = 
find_publisher_handler_for_event_name(client->publish->event);
-
-               if (handler) {
-                       handler->stop_publishing(client);
-               }
-
-               client->started = 0;
-               if (ast_sip_push_task(NULL, cancel_refresh_timer_task, 
ao2_bump(client))) {
-                       ast_log(LOG_WARNING, "Could not stop refresh timer on 
outbound publish '%s'\n",
-                               ast_sorcery_object_get_id(client->publish));
-                       ao2_ref(client, -1);
-               }
+       if (!client->started) {
+               /* If the client was never started, there's nothing to 
unpublish, so just
+                * destroy the publication and remove its reference to the 
client.
+                */
+               ast_sip_push_task(NULL, explicit_publish_destroy, client);
+               return 0;
+       }
+
+       handler = find_publisher_handler_for_event_name(client->publish->event);
+       if (handler) {
+               handler->stop_publishing(client);
+       }
+
+       client->started = 0;
+       if (ast_sip_push_task(NULL, cancel_refresh_timer_task, 
ao2_bump(client))) {
+               ast_log(LOG_WARNING, "Could not stop refresh timer on outbound 
publish '%s'\n",
+                       ast_sorcery_object_get_id(client->publish));
+               ao2_ref(client, -1);
        }
 
        /* If nothing is being sent right now send the unpublish - the destroy 
will happen in the subsequent callback */


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to