Conversation
При пересинхронизации за 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' условие ''==='' ложно уводило звонок в «исходящий». Ветки сделаны взаимоисключающими, каналы заданы явно.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.