Требует действийможет затронуть работающую систему
Блокировки туннеля и сертификатов стабилизированы в build 16672
Эта серия исправляет взаимные блокировки и гонки в туннельных ретрансляторах, цепочках сертификатов, поиске часового пояса и завершении POSIX-пула потоков. Публичный метод расширения TWebSocketProtocol.SetSubprotocol также заменён, поэтому пользовательские подклассы WebSocket требуют изменения исходного кода. Пользователям туннелей и Zstandard следует брать финальный build, а не промежуточную ревизию.
Коротко
- Переходите на 2.4.16672: синхронизация туннелей менялась до последнего коммита после дополнительных исправлений BSD и Delphi.
- В пользовательских подклассах TWebSocketProtocol нужно заменить переопределения SetSubprotocol на IsSubprotocol и, при необходимости настройки, SetName.
- TEccCertificateChain.ValidateItems больше не блокирует себя; вызовы нужно сериализовать, а SaveToBinary теперь берёт write lock.
- POSIX TSynThreadPool теперь использует кольцевую очередь O(1) и безопасно отклоняет или отменяет контексты при завершении.
- Параллельные вызовы TAlgoZstd создают временные контексты вместо ожидания одного общего; модуль по-прежнему явно отмечен как незавершённый.
Рекомендации по обновлению
Для туннелей, POSIX-пула потоков, цепочек ECC-сертификатов и Zstandard используйте build 2.4.16672. Не останавливайтесь на промежуточной ревизии туннельной серии. Перед сборкой найдите SetSubprotocol в пользовательских WebSocket-протоколах и параллельные вызовы ValidateItems в обработке сертификатов.
20 из 20 записей · 20 коммитов в апстриме
1
Высокий
Туннельные callbacks освобождаются вне блокировок ретранслятора и сессии
В mormot.net.tunnel класс TTunnelList теперь наследуется от TSynPersistent и использует отдельный TRWLightLock fSessionSafe. Новый Extract удаляет ITunnelTransmit, сохраняя локальную ссылку; Delete и TTunnelRelay.ConsoleDelete освобождают её после выхода из блокировки. ConsoleTunnelSend также вызывает удалённый callback вне fConsoleSafe.
Несовместимые изменения
mormot.net.tunnel
aef05e96+70-41
net: some Tunnel logic fixes
Влияние
Закрытие туннеля и доставка кадров больше не запускают финализаторы интерфейсов или удалённый код под общей блокировкой ретранслятора, снижая риск взаимной блокировки и повторного входа. Код, наследующий TTunnelList или использующий унаследованное свойство Safe, перестанет компилироваться из-за смены базового класса.
Стоит взглянуть
Перейдите на build 2.4.16672, затем перед сборкой туннельных сервисов найдите подклассы TTunnelList и обращения к .Safe.
Публичный API
TTunnelListsignature-changed — Базовый класс меняется с TObjectRWLightLock на TSynPersistent; унаследованный интерфейс Safe исчезает.TTunnelList.Extractadded — Удаляет сессию и возвращает её ITunnelTransmit для освобождения вне блокировки.
Модули
2
Высокий
Выбор WebSocket subprotocol разделяет распознавание и настройку экземпляра
TWebSocketProtocol.SetSubprotocol удалён. Новый публичный virtual IsSubprotocol выполняет только распознавание, а protected virtual SetName настраивает клонированный или выбранный экземпляр через свойство Name. Binary, relay, client и Engine.IO протоколы используют это разделение, чтобы не изменять общий прототип при поиске.
Несовместимые изменения
mormot.net.relay+2
17f74f81+31-25
net: new TWebSocketProtocol.IsSubprotocol/SetName methods
Влияние
Согласование subprotocol становится потокобезопасным, поскольку поиск больше не изменяет общий объект протокола. Любой пользовательский подкласс, переопределяющий или вызывающий SetSubprotocol, перестанет компилироваться и должен разделить распознавание и настройку экземпляра.
Требуется миграция
Замените переопределения SetSubprotocol на IsSubprotocol; переносите изменения состояния в SetName, если выбранное имя настраивает clone.
Публичный API
TWebSocketProtocol.SetSubprotocolremoved — Заменён на IsSubprotocol для распознавания и SetName для настройки экземпляра.TWebSocketProtocol.IsSubprotocoladded — Публичный virtual-метод распознавания subprotocol без изменения состояния.TWebSocketProtocol.Namebehaviour-changed — Запись Name теперь вызывает virtual SetName для настройки экземпляра.
3
Высокий
Проверка цепочки устраняет deadlock, но требует сериализации вызывающим кодом
TEccCertificateChain.ValidateItems удаляет внешний fSafe.ReadLock, поскольку каждый вложенный IsValid сам получает блокировку цепочки и мог вызвать взаимную блокировку. Публичная документация теперь явно указывает, что ValidateItems не потокобезопасен и должен выполняться после загрузки.
Несовместимые изменения
mormot.crypt.ecc
fbb6f6dc+7-10
crypt: fixed potential deadlock in TEccCertificateChain.ValidateItems
Влияние
Проверка больше не блокирует сама себя, но параллельное изменение или другой ValidateItems может вступить в гонку с незащищённым обходом fItems. Backend, одновременно перезагружающий и проверяющий цепочку, должен сериализовать метод снаружи.
Требуется миграция
Найдите ValidateItems и исключите его одновременное выполнение с загрузкой цепочки, обновлением отзыва или другим вызовом проверки.
Публичный API
TEccCertificateChain.ValidateItemsbehaviour-changed — Метод теперь явно не потокобезопасен и требует сериализации вызывающей стороной.
Модули
4
Высокий
Завершение POSIX-пула устраняет гонку с постановкой задач
TSynThreadPool переименовывает POSIX-блокировку очереди в fPendingSafe и устанавливает fTerminated под этой же блокировкой. Enqueue проверяет завершение внутри неё, workers отменяют захваченный контекст при остановке, а DoTaskAbort делает TaskAbort безопасным при исключениях. TSynParallelProcess также явно инициализирует TOSLightLock, как требуется на BSD.
Исправления
mormot.core.threads
76f15a86+60-44
core: another pass on TSynThreadPool shuhtdown logic
Влияние
Производитель больше не может поставить работу в пул, уже начавший уничтожение, а ожидающие контексты реже утекут или заблокируют остановку. Это важно для POSIX-серверов на TSynThreadPool; Windows IOCP использует отдельный путь.
Рекомендуется обновиться
Обновите POSIX-сервисы, уничтожающие активные пулы, и проверьте завершение под нагрузкой.
Модули
5
Высокий
Туннельные списки больше не вызывают удалённый код под read lock
TTunnelList добавляет Get для копирования ITunnelTransmit под read lock. TunnelSend, GetInfo и GetAllInfo затем вызывают методы интерфейса после разблокировки; GetAllInfo делает снимок интерфейсов и идентификаторов сессий. DeleteFrom запрещает удаление из самого себя, а последующие commits дополнительно уточняют эту последовательность.
Исправления
mormot.net.tunnel
4be92b7a+44-39
net: fixed race/deadlock in TTunnelList
Влияние
Callback, повторно входящий в список или освобождающий другой интерфейс, больше не может заблокировать read-write lock списка. Поскольку область менялась до build 16672, проверяйте создание ретранслятора, передачу кадров и завершение только на финальной ревизии.
Стоит взглянуть
Используйте исправление только в полной серии до build 16672 и выполните конкурентные тесты жизненного цикла туннеля.
Публичный API
TTunnelList.Getadded — Возвращает потокобезопасную локальную ссылку ITunnelTransmit для сессии.
Модули
6
Высокий
Дополнительный commit устраняет три дефекта инициализации и вложенности locks
TAlgoZstd теперь лениво создаёт общие контексты сжатия и распаковки под соответствующими locks. THttpPeerCrypt явно инициализирует и завершает новый TOSLightLock для BSD. TTunnelList.DeleteFrom копирует идентификаторы сессий под read lock исходного списка и удаляет их после разблокировки, избегая вложенных блокировок списков.
Исправления
mormot.lib.zstd+2
0a0f36a4+23-13
all: fixes several locking issues
Влияние
Исправлены регрессии из ранних commit этой серии: преждевременное создание контекстов Zstandard, неинициализированная блокировка peer-клиента на BSD и возможный цикл блокировок туннельных списков. Builds 16660-16667 не подходят как конечная точка для этих компонентов.
Рекомендуется обновиться
Пропустите затронутые промежуточные builds и используйте 2.4.16672 для Zstandard, peer-cache и туннелей.
7
Высокий
Поиск часового пояса защищает общий кэш последнего результата
TSynTimeZone добавляет fLastZoneSafe — отдельный TLightLock для fLastZone и fLastIndex. LockedSearch читает и обновляет кэш под новой блокировкой, оставляя хешированный поиск зоны под существующим внешним read lock.
Исправления
mormot.core.search
55fa224e+17-12
core: fixed TSynTimeZone.LockedSearch thread safety
Влияние
Параллельные преобразования с разными идентификаторами зон больше не создают гонку между текстом и индексом последней зоны, которая могла вернуть несоответствующий кэшированный индекс. Многопоточным REST-backend на TSynTimeZone.Default следует взять исправление.
Рекомендуется обновиться
Обновите сервисы с параллельными преобразованиями TSynTimeZone и повторите межзонные тесты дат.
Модули
8
Высокий
Delphi-сборки адаптированы к изменившимся туннельным типам
mormot.net.tunnel добавляет публичный псевдоним динамического массива ITunnelTransmits, использует его для хранения TTunnelList и локальных копий, меняет параметр интерфейса Get на out и заменяет не встраиваемую ссылку TRAIL_SIZE в FrameSession на SizeOf(TTunnelSession).
Компилятор и платформы
mormot.net.tunnel
804bc970+6-5
net: fixed Delphi compilation
Влияние
Предыдущая туннельная ревизия не компилировалась Delphi. Этот commit восстанавливает совместимость, но логика туннеля снова меняется в build 16672, поэтому следует использовать вершину выпуска.
Рекомендуется обновиться
Не останавливайтесь на build 16668; собирайте Delphi-проекты туннелей с build 16672.
Публичный API
ITunnelTransmitsadded — Публичный псевдоним для array of ITunnelTransmit.TTunnelList.Getsignature-changed — Выходной параметр ITunnelTransmit меняется с var на out.
Модули
9
Высокий
Туннельные потоки BSD теперь инициализируют системную блокировку
TTunnelLocalThread.Create вызывает fSafe.Init, а destructor — fSafe.Done. На BSD TOSLightLock отображается в TRtlCriticalSection и не может полагаться только на нулевую память экземпляра. Изменение ORM лишь поясняет уже соблюдаемое требование для TOrmPropertiesAbstract.fSafe.
Компилятор и платформы
mormot.net.tunnel+1
428ee221+6-4
net: fixed TTunnelLocalThread.Create on BSD
Влияние
Без этого создание туннеля на BSD могло работать с неинициализированной critical section. Последующие commits продолжают менять туннельный код, поэтому исправление следует брать в build 16672.
10
Средний
Бинарный экспорт сертификатов теперь исключает параллельную запись
TEccCertificateChain.SaveToBinary заменяет fSafe.ReadLock на fSafe.WriteLock, поскольку сериализация временно переключает флаг TEccCertificate.fStoreOnlyPublicKey каждого сертификата до и после SaveToStream.
Исправления
mormot.crypt.ecc
6c82cf93+4-4
crypt: fixed TEccCertificateChain.SaveToBinary thread safety
Влияние
Параллельные SaveToBinary больше не создают гонку на временном флаге сертификата и не формируют несогласованную private/public сериализацию. Более сильная блокировка может сериализовать редкие одновременные экспорты, но бинарный формат не меняется.
Рекомендуется обновиться
Обновите backend, экспортирующий одну TEccCertificateChain из нескольких потоков.
Публичный API
TEccCertificateChain.SaveToBinarybehaviour-changed — Теперь берёт write lock цепочки на время сериализации.
Модули
11
Средний
Вызовы Zstandard больше не сериализуются за одним общим контекстом
TAlgoZstd заранее выделяет общие контексты сжатия и распаковки и использует TryLock для каждой операции. Конкурирующий поток создаёт и освобождает временный ZSTD_CCtx или ZSTD_DCtx вместо ожидания общего контекста.
Производительность
mormot.lib.zstd
83c4df20+44-36
lib: fixed TAlgoZstd context usage
Влияние
Параллельные операции Zstandard могут выполняться одновременно вместо одной очереди блокировки. Модуль всё ещё отмечен как незавершённый и только для FPC, а build 16668 переводит создание общего контекста на ленивую схему, поэтому этот commit не является безопасной отдельной целью.
Стоит взглянуть
Если включён mormot.lib.zstd, выполняйте нагрузочные тесты только на build 16668 или новее; предпочтителен итог выпуска.
Модули
12
Средний
Извлечение POSIX-задач из очереди теперь выполняется за O(1)
Массив ожидания POSIX TSynThreadPool превращён в фиксированную кольцевую FIFO с индексами fPendingFirst и fPendingLast. PopPendingContext сдвигает индекс вместо перемещения всех оставшихся указателей, а очередь один раз выделяется по QueueLength.
Производительность
mormot.core.threads
6f064610+43-30
core: ensure TSynThreadPool POSIX queue is O(1)
Влияние
Стоимость извлечения больше не зависит от размера накопленной очереди, сокращая удержание внутренней блокировки при всплесках. Изменение относится только к POSIX и не меняет публичный API TSynThreadPool.
Модули
13
Средний
Ожидание tunnel accept больше не расходует CPU при конкуренции
TTunnelLocalThread.fSafe меняется с TLightLock на TOSLightLock. Пока фоновый поток заблокирован в accept, OnReceived может ожидать через futex-путь Linux или современной Windows.
Производительность
mormot.net.tunnel
75bf7660+4-4
net: optimized TTunnelLocalThread accept() step
Влияние
Ранние туннельные кадры больше не крутятся на CPU в ожидании принятия локального сокета. Изменение потребовало исправления BSD-инициализации в следующем build.
Модули
14
Средний
Конкуренция peer-cache клиента переводится на системную блокировку
THttpPeerCrypt.fClientSafe меняется с TLightLock на TOSLightLock, поэтому ожидание при конкуренции использует платформенный futex-подобный механизм вместо чистого spin.
Производительность
mormot.net.server
a5e68484+3-3
net: refined THttpPeerCrypt HTTP client lock
Влияние
Фоновые прямые загрузки должны потреблять меньше CPU при конкуренции потоков за общий HTTP-клиент. В этой ревизии ещё нет явных Init и Done для BSD, добавленных в build 16668.
Модули
15
Низкий
Координация POSIX-пула возвращается к короткой spin-блокировке
Внутреннее поле POSIX TSynThreadPool.fSafe меняется с TOSLightLock на четырёхбайтовый TLightLock, а связанные Init и Done удаляются. Защищённые участки только назначают указатели и метаданные очереди.
Производительность
mormot.core.threads
844e8029+5-8
core: refined TSynThreadPool internal POSIX lock
Влияние
Очень короткие операции POSIX-пула избегают накладных расходов системной блокировки. Очередь и завершение снова переработаны в builds 16670 и 16671, поэтому это не самостоятельная конечная точка.
Модули
16
Низкий
Блокировка транзакций SQL-прокси переходит на облегчённый системный примитив
TSqlDBProxyConnectionProtocol.fSafe меняется с TOSLock на TOSLightLock, соответствующий более лёгкому futex-backed mutex на Linux и Windows 8+. Алгоритм транзакций и публичные методы не меняются.
Производительность
mormot.db.proxy
907c92f5+3-3
db: refined TSqlDBProxyConnectionProtocol lock
Влияние
Удалённые транзакции SQL-прокси могут иметь меньшие накладные расходы при слабой конкуренции. Миграция исходного кода и изменение поведения приложений не требуются.
Модули
17
Низкий
Очистка блокировок сохраняет поведение времени выполнения
Комментарии и области блокировок уточнены в mormot.core.os, mormot.net.async, mormot.rest.http.server и mormot.soa.server. Асинхронный TLS-путь повторно проверяет Enabled под fGC1.Safe, а поиск SOA-сессии освобождает read lock перед возвратом.
Внутреннее устройство
mormot.core.os+3
ccde07c6+8-7
core: some code refactoring with no functional change
Влияние
Публичный API и предполагаемое поведение приложений не меняются. Повторная проверка предотвращает двойную настройку TLS при одновременной инициализации нескольких соединений.
18
Низкий
Многопоточный стенд проверяет все семейства облегчённых блокировок
Новый модуль test.core.threads добавляет 1166 строк стресс-тестов TLightLock, TOSLightLock, TOSRWLightLock, TRWLightLock и связанного поведения на нескольких worker-потоках.
Тесты
719cd877+1168-2
tests: extended T*Lock coverage
Влияние
Код приложений не меняется. Набор повышает уверенность в последних переработках locks, но сам по себе не доказывает отсутствие гонок во всех высокоуровневых туннельных и shutdown-последовательностях.
19
Низкий
LDAP-тесты покрывают пользовательские атрибуты членов группы
TNetworkProtocols добавляет проверки пользовательского разбора членов LDAP-групп, включая нормализованные distinguished names и настроенный путь атрибута member. Изменён только test/test.net.proto.pas.
Тесты
4e783875+8-4
tests: cover LDAP custom members parsing
Влияние
Код приложений и runtime фреймворка не меняются. Тесты защищают поведение пользовательских LDAP-членов, добавленное в предыдущем выпуске.
20
Низкий
Основной test runner теперь запускает новый набор тестов блокировок
test/mormot2tests.dpr добавляет test.core.threads в uses, включая новые тесты блокировок в обычный исполняемый файл mormot2tests.
Тесты
62bd0e82+5-2
tests: include test.core.threads in mormot2tests project
Влияние
На runtime и код приложений влияния нет. Постоянные тестовые прогоны теперь выполняют стенд блокировок из предыдущего commit.