Страница 1 из 1

asterisk и mssql

Добавлено: 18 июн 2018, 17:04
alexkayzer
Добрый день, коллеги!
Кто-нибудь сталкивался с работой 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 сервер)
В чем может быть проблема может кто-то сталкивался?

Re: asterisk и mssql

Добавлено: 18 июн 2018, 18:28
zzuz
Команды SQL выполняются астериском телепатически ?

Re: asterisk и mssql

Добавлено: 19 июн 2018, 09:23
alexkayzer
Нет, при поступлении вызова в процедуру передается входящий номер и ИД канала.
В другую процедуру при установке ДНД передается номер абонента и статус(снял или поставил ДНД) - вот эта чаще всех вызывает блокировки таблиц

Re: asterisk и mssql

Добавлено: 19 июн 2018, 10:03
zzuz
В какую процедуру ? Настроенную где , как ? Где она вызывается ? Зачем она вызывается ? Почему она вызывается ? Зачем Вы ждете телепатов ? Или это телепаты вызывают процедуру ? Что вообще происходит?
Следующие ответы будут такие же как и ваши вопросы.

Re: asterisk и mssql

Добавлено: 19 июн 2018, 10:30
alexkayzer
Есть процедура которая вызывается при нажатии на телефоне кнопки ДНД - она пишет в некую таблицу 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 ( снял или поставил)

res_odbc.conf
[mssql]
enables =>yes
dsn => mssql
pre-connect => yes
username => XXXX
password = XXXX

func_odbc.conf
[dnd_status]
prefix=mssql
dsn=mssql
readsql= exec EMIS_SetDND_DIALPLAN 'SIP/${PSIP}','${VAL}'

odbc.ini
[mssql]
Description=MSSQL connection to 'KISDB' database
Driver=FreeTDS
Database=XXXX
username=XXXX
password=XXXX
Server=mssql2014
Port=1433
Trace=No
TDS_Version = 7.4

odbcinis.ini
[ODBC]
Trace = Yes
TraceFile = /var/log/odbc.log
ForceTrace = Yes
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

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

# Command and connection timeouts
; timeout = 10
; connect timeout = 10

# 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]

Re: asterisk и mssql

Добавлено: 19 июн 2018, 10:59
zzuz
В func_odbc.conf у вас у функции только параметр readsql . Запись функция mssql_dnd_status не предусматривает?

Заодно Вы можете протестировать вручную работу самого драйвера odbc , выполнив в цикле что-то типа

Код: Выделить всё

while 1 ; do echo "exec EMIS_SetDND_DIALPLAN 'SIP/$RANDOM','$RANDOM'" | isql mssql ; sleep 0.3 ; done 
на тестовой БД .

Re: asterisk и mssql

Добавлено: 19 июн 2018, 12:35
alexkayzer
Я же говорю что все корректно отрабатывает, но иногда возникают блокировки.
А read или write роли не играет - mssql сервер сам разбирается с процедурой писать или нет.
Все работает-работает - бац все колом встало, пока программисты блокировку с таблицы не снимут, потом опять все работает.

Re: asterisk и mssql

Добавлено: 19 июн 2018, 13:35
Repz
alexkayzer писал(а):А read или write роли не играет - mssql сервер сам разбирается с процедурой писать или нет.
Ну и чего вы от asterisk хотите, для read блокировка таблицы не требуется, разбирайтесь с mssql. И блокировка всей таблицы это не айс, привет программистам!

Re: asterisk и mssql

Добавлено: 19 июн 2018, 14:03
BorisTheBlade
Видимо надо дебажить mssql сервер.
Или попробовать воркараунд запуск SQL через agi-скрипт.

Re: asterisk и mssql

Добавлено: 20 июн 2018, 15:15
alexkayzer
кто-нибудь знает где выключить autocommit для транзакций через ODBC?