Skip to content

Develop - #3

Merged
boffart merged 4 commits into
masterfrom
develop
Jul 21, 2026
Merged

Develop#3
boffart merged 4 commits into
masterfrom
develop

Conversation

@boffart

@boffart boffart commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Alexey Portnov and others added 4 commits April 21, 2026 02:58
При пересинхронизации за 2 месяца (после обновления модуля) pending-записи
старше 7 дней навсегда оставались в очереди: воркер downloadRecords.php
отсеивал их фильтром start >= now-7d, а synchCdr.php с overlap 10 мин их
тоже не трогал — окно уходило вперёд.

- Lookback расширен до 31 дня (MTS хранит записи 30 дней).
- Записи со start старше 31 дня помечаются gone при каждом запуске —
  они в MTS уже физически удалены, нет смысла оставлять их pending.

Найдено при тесте на 172.16.32.77: 2 pending от 2026-02-25/27 висели
бесконечно при lookback=7.
Воркер пытался выполнить raw UPDATE через глобальный DI 'db', который
указывает на основную БД MikoPBX (astdb.db). Таблица mts_cdr живёт в
отдельном SQLite-файле модуля (custom_modules/ModuleMtsPbx/db/module.db),
поэтому запрос падал с PDOException. На клиенте ошибка приводила к
автоматическому отключению модуля MikoPBX.

- Пометка expired pending → gone теперь идёт через ORM (CallHistory::find
  + save), которая корректно роутит запрос в БД модуля.
- Блок защищён локальным try/catch, чтобы случайная ошибка не падала
  весь воркер.
- В оба cron-воркера (synchCdr.php, downloadRecords.php) добавлен
  set_exception_handler — любая необработанная ошибка теперь логируется
  и завершает скрипт штатно, а не оставляет module-monitor MikoPBX
  поводом отключить модуль.

Воспроизведение и фикс проверены на 172.16.32.77.
Причина: окно синхронизации привязано к времени начала звонка, а CDR
появляется в индексе MTS только после завершения звонка. Длинные звонки
(дольше перекрытия в 10 минут) и звонки с отложенной индексацией терялись:
к моменту их появления основное окно уже уходило вперёд.

Изменения:
- synchCdr.php: режим --lookback=N — запрашивает CDR за последние N минут,
  не двигая offset (им управляет основной проход).
- MtsPbxConf.php: вторая cron-задача */30 с --lookback=720 (12 часов).

Учтены замечания код-ревью:
- Единый pid-lock для основного и глубокого проходов: они не должны
  работать одновременно, иначе при пересекающихся окнах возникают гонки
  (дубли строк mts_cdr из-за неатомарного find-or-create, порча mp3 из-за
  параллельной записи в один файл).
- Глубокий проход добирает только отсутствующие звонки: существующие
  пропускаются целиком (без перекачки записи, UPDATE и повторной публикации
  в Beanstalk).
- Исправлен предсуществующий баг классификации внутренних звонков
  (rel===1): блок без else проваливался в ветки ниже и давал неверную
  атрибуцию каналов; при пустом 'an' условие ''==='' ложно уводило звонок
  в «исходящий». Ветки сделаны взаимоисключающими, каналы заданы явно.
@boffart
boffart merged commit 81bdb2e into master Jul 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant