Skip to content

Ошибки движка OneScript 2.2, влияющие на многопоточную работу entity #153

Description

@sfaqer

Версия: entity 5.4.0.1, OneScript 2.2.0.

Аудит потокобезопасности entity нашел ошибки в самом движке. Все они исправлены PR в
EvilBeaver/OneScript (на 2026-10-02 открыты); до выхода версии с ними entity на 2.2 работает с
оговорками ниже.

Ошибка движка Чем это оборачивается в entity PR
ПриЗавершении вызывает обработчики по живому списку: подписка или отписка во время события дает «Collection was modified», и оставшиеся обработчики не вызываются Наблюдатель получает событие из обработчика завершения пула (освобождение, брошенная транзакция) и работает с другим источником данных, которым этот поток еще не пользовался. Пул того источника подписывается на завершение потока прямо во время события. Обработчики, подписанные позже, не вызываются: их пулы не получают назад соединения завершившегося потока (место занято до конца процесса), источники с автозакрытием не закрываются #1767
Исключение одного обработчика ПриЗавершении отменяет все следующие Любой обработчик завершения, подписанный раньше пула (прикладной или ИсточникДанных при сбое закрытия и журнала), падает — и пул не возвращает соединения завершившегося потока #1785
Параллельная первая загрузка библиотеки: второе задание принимает ее за циклическую зависимость, грузит повторно или видит модуль неинициализированным sql подключается лениво: #Использовать sql есть только в служебном конструкторе коннектора, который компилируется при открытии соединения, вне блокировки пула. Если первые соединения процесса открываются параллельно (например, источник инициализируется лениво в обработчиках запросов), открытие соединения падает #1768
Компиляция сценария, пока другой поток впервые загружает библиотеку или подключает компоненту, падает с ложным «Неизвестный символ» entity компилирует на горячих путях: конструктор коннектора на каждое новое соединение, декоратор на каждый экземпляр сущности. Если в это время прикладной код в другом потоке впервые подключает библиотеку, операция entity изредка падает #1775
Регистрация типов во время работы (ПодключитьСценарий, классы библиотек, компоненты) без блокировок Сама entity типы во время работы не регистрирует; затрагивает приложения, которые делают это из заданий параллельно с работой entity #1765

Что делать на 2.2

  • Вызывать МенеджерСущностей.Инициализировать() (или любую операцию с БД) в основном потоке до
    запуска фоновых заданий и веб-сервера: sql загрузится один раз, до параллельной работы.
  • В наблюдателях, получающих события при завершении потока, не работать с другими источниками
    данных.
  • Обработчики ПриЗавершении в прикладном коде не должны бросать исключений.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions