res_pjsip_mwi: fix unsolicited mwi blocks PJSIP stack

The PJSIP taskprocessors could be overflowed on startup
if there are many (thousands) realtime endpoints
configured with unsolicited mwi.
The PJSIP stack could be totally unresponsive for a few minutes
after boot completed.

This patch creates a separate PJSIP serializers pool for mwi
and makes unsolicited mwi use serializers from this pool.
This patch also adds 2 new global options to tune taskprocessor
alert levels: 'mwi_tps_queue_high' and 'mwi_tps_queue_low'.

This patch also adds new global option 'mwi_disable_initial_unsolicited'
to disable sending unsolicited mwi to all endpoints on startup.
If disabled then unsolicited mwi will start processing
on next endpoint's contact update.

ASTERISK-26230 #close

Change-Id: I4c8ecb82c249eb887930980a800c9f87f28f861a
This commit is contained in:
Alexei Gradinari
2016-08-08 13:53:32 -04:00
parent 9042ad40f2
commit 403b63571c
7 changed files with 333 additions and 6 deletions

View File

@@ -0,0 +1,35 @@
"""pjsip: add global MWI options
Revision ID: c7a44a5a0851
Revises: 4a6c67fa9b7a
Create Date: 2016-08-03 15:08:22.524727
"""
# revision identifiers, used by Alembic.
revision = 'c7a44a5a0851'
down_revision = '4a6c67fa9b7a'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
YESNO_NAME = 'yesno_values'
YESNO_VALUES = ['yes', 'no']
def upgrade():
############################# Enums ##############################
# yesno_values have already been created, so use postgres enum object
# type to get around "already created" issue - works okay with mysql
yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
op.add_column('ps_globals', sa.Column('mwi_tps_queue_high', sa.Integer))
op.add_column('ps_globals', sa.Column('mwi_tps_queue_low', sa.Integer))
op.add_column('ps_globals', sa.Column('mwi_disable_initial_unsolicited', yesno_values))
def downgrade():
op.drop_column('ps_globals', 'mwi_tps_queue_high')
op.drop_column('ps_globals', 'mwi_tps_queue_low')
op.drop_column('ps_globals', 'mwi_disable_initial_unsolicited')