Opened 5 years ago

Closed 5 years ago

#390 closed баг (это не баг)

Нет CDR если нет связи с платой VE-01 по IP

Reported by: san Owned by: alx
Priority: средний Milestone: 1 очередь
Component: sw Keywords:
Cc:

Description (last modified by san)

От двух разных пользователей поступили жалобы что, несмотря на большое количество вызовов, файлы CDR не появляются в веб-интерфейсе. Описанная проблема возникла после того как плату SW убрали в отдельный от ve VLAN, до этого CDR появлялись в веб-интерфейсе.

  1. АТС Атняшка
  2. АТС Суда(r1777, ревизия VE-01 50) - Тут пользователь пошел дальше и провёл эксперимент - поменял настройки коммутатора, восстановив IP-соединение между платами, CDR начали появляться в веб-интерфейсе. Снова настроил VLAN - CDR перестали записываться. (эксперимент записан со слов пользователя в телефонном разговоре, так что может содержать неточности). На этой Атс можно попробовать воспроизвести деффект, раз у нас он не воспроизводится.

Attachments (3)

messages (13.8 KB ) - added by san 5 years ago.
storage.zip (7.3 KB ) - added by san 5 years ago.
mari.zip (50.7 KB ) - added by san 5 years ago.

Download all attachments as: .zip

Change History (18)

comment:1 by san, 5 years ago

Description: modified (diff)

comment:2 by alx, 5 years ago

Прошу обновить пакет sw до r1783, воспроизвести проблему (выполнить успешный звонок) и приложить сюда лог платы.

by san, 5 years ago

Attachment: messages added

comment:3 by alx, 5 years ago

Из приложенного журнала видно, что CDR плата SW-01 получает.

comment:4 by san, 5 years ago

В приложенном вложении лог следующего эксперимента.
Примерно в 6-00 UTC был осуществлён вызов окончания АДАСЭ 2817, разговор длился несколько секунд, ожидалось что появится CDR запись, но запись не появилась.

comment:5 by alx, 5 years ago

Возможно ли скачать из этой платы файл(ы) базы данных? Она хранится в файлах /usr/share/sw/storage.db*
Перед копированием базы было бы полезно выполнить рестарт swd.

in reply to:  4 comment:6 by alx, 5 years ago

Replying to san:

ожидалось что появится CDR запись, но запись не появилась.

Уточни, пожалуйста, что значит "не появилась". Что делали, что ожидали получить в результате, и что получили вместо ожидаемого результата.

comment:7 by alx, 5 years ago

В приложенном логе в последней CDR я вижу время ответа 5 января 1970 года. Рискну предположить, что эта дата не попадала в диапазон, заданный в веб-интерфейсе при попытке просмотра.

by san, 5 years ago

Attachment: storage.zip added

comment:8 by san, 5 years ago

что значит "не появилась"

После нажатия кнопки "обновить" CDR звонка совершенного сегодня не отобразилось в CDR записях с фильтром "Сегодня"

comment:9 by alx, 5 years ago

Как выяснилось, текущее время SW-01 передает плате VE-01 при каждой записи конфигурации. При получении этого времени плата VE-01 безусловно применяет его через вызов settimeofday(). В случае, если settimeofday() ошибку, в журнал платы VE-01 выводится соответствующее сообщение. В связи с этим было бы интересно посмотреть лог платы VE-01, предварительно установив журналу приоритет не ниже INFO, а затем записав настройки в плату. Возможно в журнале будет присутствовать сообщение "error settimg current time: *".

comment:10 by alx, 5 years ago

Как промежуточный итог рассмотренной ситуации я вижу здесь две разные проблемы:

  1. Неверное время в системных часах платы VE-01, хотя ожидалось, что время должно быть установлено при получении его от платы SW-01 по SPI (см. comment:9). Это отдельный вопрос, почему так происходит, предлагаю создать отдельный тикет.
  1. Отсутствие в базе данных некоторых записей CDR. Это очень странно, так как мы видим (по приложенному журналу), что CDR в плату SW-01 приходят. Однако в приложенной базе данных присутствует только одна последняя CDR из имеющихся в журнале. В коде я вижу только два условия незаписи - если это повторное сообщение с той же самой CDR (как видно из журнала, каждая CDR приходит дважды из соображений надежности) и если не смогли распарсить полученную CDR. Но в последнем случае в журнал должно выводиться сообщение "CDR parse error: xxxxxx", чего в журнале нет.

Если CDR успешно распрарсили, она сразу записывается в базу данных. При записи в базу тоже может возникнуть ошибка, но все ошибки кроме SQLITE_BUSY приводят к выводу в журнал записи "storage.db: error inserting into cdr: xxx (xxxxxxxxx)", чего мы в журнале не видим.

Остается ошибка SQLITE_BUSY, при возникновении которой CDR, которую не смогли записать в базу данных сразу, помещается во временный список в ОЗУ, из которого они записываются в базу позже (в отдельном потоке, выполняющемся каждый час), когда база освободится. И вот здесь есть ограничение на размер списка (защита от исчерпания всей свободной памяти): если в списке уже лежит 100 CDR, новый CDR молча уничтожается. Но, как видно из приложенного журнала, 100 CDR в течение часа в плату SW-01 не поступало, следовательно, ограничение размера временного списка достигнуто не было...

Как результат - я не понимаю, почему записей нет в базе...

Предлагаю сделать специальный вариант swd, в который добавить дополнительный отладочный вывод в ключевых точках. Дать ему поработать, например, сутки, после чего снова забрать журнал и базу данных для дальнейшего анализа. Как вариант, можно установить в плату SW-01 пакет sqlite3 и смотреть содержимое базы данных прямо в SW-01. Вероятно, это будет быстрее и удобнее чем каждый раз скачивать файлы...

comment:11 by alx, 5 years ago

В тестовой версии swd добавлен дополнительный вывод в журнал сообщений:

  • об успешном парсинге CDR;
  • об успешной записи принятой CDR в DB;
  • об откладывании записи CDR во временный список;
  • об уничтожении CDR из-за переполнения временного списка;
  • об успешной повторной записи в DB CDR из временного списка.
Last edited 5 years ago by alx (previous) (diff)

comment:12 by alx, 5 years ago

Проблема 1 (см. comment:10) исправлена в ve:r1679.

by san, 5 years ago

Attachment: mari.zip added

comment:13 by san, 5 years ago

Выше прикрепил архив с файлами, а вот описание самого эксперимента:

Эксперимент:

  1. Записал тестовый swd в плату
  2. Перезапустил swd
  3. Скачал базу old_storage
  4. UTC 7:57. наблюдал в Sip_окончаниях разговор и его завершение(вызываемый 2817)
  5. Перешел на вкладку CDR, сделал поиск по базе сегодня и с 1970 года.
  6. Перезапустил swd
  7. Скачал базу storage
  8. Скачал лог
  • странность 1: в логе я не вижу попытки записи CDR в 7-57
  • странность 2: когда я делал поиск по базе с 1970 года я не увидел записи от эксперимента comment:4

comment:14 by alx, 5 years ago

Пропадание CDR из базы объясняется тем, что каждый час из базы данных удаляются CDR соединений, закончившихся более 90 дней назад. Так как, как мы уже установили, в плате VE-01 системное время неправильное (5 января 1970 года), все сделанный в течение часа записи оказываются старее 90 дней и удаляются в начале очередного часа. Считаю, что этим и объясняется наблюдаемое поведение базы, на которое жаловались пользователи.

comment:15 by alx, 5 years ago

Resolution: это не баг
Status: newclosed
Note: See TracTickets for help on using tickets.