From 6d866978673b5a43bd4fe8a915f11e3ab833dbba Mon Sep 17 00:00:00 2001
From: Olle Johansson <oej@edvina.net>
Date: Tue, 27 Jun 2006 18:00:09 +0000
Subject: [PATCH] issue #7033 - Don't burst pokes to peers at load or reload.
 Open for a cool algorithm to space them out...

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@36178 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1856c9af2a..07576269b1 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2249,9 +2249,8 @@ static void sip_destroy_peer(struct sip_peer *peer)
 	if (peer->call)
 		sip_destroy(peer->call);
 
-	if (peer->mwipvt) {	/* We have an active subscription, delete it */
+	if (peer->mwipvt) 	/* We have an active subscription, delete it */
 		sip_destroy(peer->mwipvt);
-	}
 
 	if (peer->chanvars) {
 		ast_variables_destroy(peer->chanvars);
@@ -16257,12 +16256,23 @@ static int sip_get_codec(struct ast_channel *chan)
 	return p->peercapability;	
 }
 
-/*! \brief Send a poke to all known peers */
+/*! \brief Send a poke to all known peers 
+	Space them out 100 ms apart
+	XXX We might have a cool algorithm for this or use random - any suggestions?
+*/
 static void sip_poke_all_peers(void)
 {
+	int ms = 0;
+	
+	if (!speerobjs)	/* No peers, just give up */
+		return;
+
 	ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
 		ASTOBJ_WRLOCK(iterator);
-		sip_poke_peer(iterator);
+		if (iterator->pokeexpire > -1)
+			ast_sched_del(sched, iterator->pokeexpire);
+		ms += 100;
+		iterator->pokeexpire = ast_sched_add(sched, ms, sip_poke_peer_s, iterator);
 		ASTOBJ_UNLOCK(iterator);
 	} while (0)
 	);
-- 
GitLab