Добрый день, коллеги!
Кто-нибудь сталкивался с работой astersik и mssql через freetds?
Проблема заключается в том, что периодически после выполнения процедуры( mssql у нас нужен исключительно для выполнения некоторых процедур, а не логирования CDR), на сервере mssql возникают блокировки таблиц. Прогеры говорят что * не закрывает соединение за собой. Но по факту * держит соединение открытым и в рамках него осуществляет выполнение процедур.
Причем это происходит настолько рандомно, что не знаем от чего отталкиваться. Одна и таже процедура может выполняться 100 раз, а на 101ый блокировка. Или бывает что подряд 2 или 3.
или через 30 попыток.
Version: freetds v0.91
TDS version: 7.4
Astersik 14.6.0-rc1
MSSQL Version 12.0.4100.1 ( 14 сервер)
В чем может быть проблема может кто-то сталкивался?
Нет, при поступлении вызова в процедуру передается входящий номер и ИД канала.
В другую процедуру при установке ДНД передается номер абонента и статус(снял или поставил ДНД) - вот эта чаще всех вызывает блокировки таблиц
В какую процедуру ? Настроенную где , как ? Где она вызывается ? Зачем она вызывается ? Почему она вызывается ? Зачем Вы ждете телепатов ? Или это телепаты вызывают процедуру ? Что вообще происходит?
Следующие ответы будут такие же как и ваши вопросы.
Линия24 - Системы Массового Телефонного Обслуживания
Есть процедура которая вызывается при нажатии на телефоне кнопки ДНД - она пишет в некую таблицу MSSQL время нажатия этой самой кнопки и номер телефона.
Процедуры вызывается на удаленном сервере MSSQL 2014. C которым Asterisk связан через драйвер FREETDS. Extension.conf
[dnd_on_off]
exten=> line-status,1,NoOp() ; обработка реакции на DND
same => n..............( тут куча всяких действий по определению постановка это или снятие ДНД, присвоение значений переменных PSIP и VAL и т.д.)
same => n,NoOp(${mssql_dnd_status(${PSIP},${VAL})}) PSIP = номер телефона, VAL = 1 или 0 ( снял или поставил)
freetds.conf
[global]
# TDS protocol version
tds version = 7.4
# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
dump file = /var/log/freetds.log
dump file append = yes
debug flags = 0xffff
# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512
[mssql]
host= mssql2014
port = 1433
tds version = 7.4
Ошибки
func_odbc.c: SQL Execute returned an error -1: 08S01: [FreeTDS][SQL Server]Write to the server failed (47)
WARNING[20653][C-0000a214] func_odbc.c: SQL Exec Direct failed (-1)![exec EMIS_SetDND_DIALPLAN 8115 1]
ERROR[20653][C-0000a214] func_odbc.c: Unable to execute query [exec EMIS_SetDND_DIALPLAN 8115 1]
Я же говорю что все корректно отрабатывает, но иногда возникают блокировки.
А read или write роли не играет - mssql сервер сам разбирается с процедурой писать или нет.
Все работает-работает - бац все колом встало, пока программисты блокировку с таблицы не снимут, потом опять все работает.
alexkayzer писал(а):А read или write роли не играет - mssql сервер сам разбирается с процедурой писать или нет.
Ну и чего вы от asterisk хотите, для read блокировка таблицы не требуется, разбирайтесь с mssql. И блокировка всей таблицы это не айс, привет программистам!