mORMot2 DailyЕжедневный обзор коммитов апстрима

Блокировки туннеля и сертификатов стабилизированы в 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 в обработке сертификатов.

Сборка2.4.16652 → 2.4.16672
Коммиты20
Строки+1559 -296
Чтение5 мин

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 для освобождения вне блокировки.

Модули

Arnaud Bouchez · 16:57 UTC · открыть коммит на GitHub →

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 для настройки экземпляра.

Arnaud Bouchez · 09:19 UTC · открыть коммит на GitHub →

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 — Метод теперь явно не потокобезопасен и требует сериализации вызывающей стороной.

Модули

Arnaud Bouchez · 09:26 UTC · открыть коммит на GitHub →

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 использует отдельный путь.

Arnaud Bouchez · 16:56 UTC · открыть коммит на GitHub →

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 для сессии.

Модули

Arnaud Bouchez · 11:33 UTC · открыть коммит на GitHub →

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 не подходят как конечная точка для этих компонентов.

Arnaud Bouchez · 12:46 UTC · открыть коммит на GitHub →

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 следует взять исправление.

Модули

Arnaud Bouchez · 08:57 UTC · открыть коммит на GitHub →

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, поэтому следует использовать вершину выпуска.

Публичный API

  • ITunnelTransmitsadded — Публичный псевдоним для array of ITunnelTransmit.
  • TTunnelList.Getsignature-changed — Выходной параметр ITunnelTransmit меняется с var на out.

Модули

Arnaud Bouchez · 13:41 UTC · открыть коммит на GitHub →

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.

Arnaud Bouchez · 12:22 UTC · открыть коммит на GitHub →

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 сериализацию. Более сильная блокировка может сериализовать редкие одновременные экспорты, но бинарный формат не меняется.

Публичный API

  • TEccCertificateChain.SaveToBinarybehaviour-changed — Теперь берёт write lock цепочки на время сериализации.

Модули

Arnaud Bouchez · 08:50 UTC · открыть коммит на GitHub →

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 или новее; предпочтителен итог выпуска.

Модули

Arnaud Bouchez · 10:00 UTC · открыть коммит на GitHub →

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.

Arnaud Bouchez · 13:54 UTC · открыть коммит на GitHub →

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.

Модули

Arnaud Bouchez · 11:43 UTC · открыть коммит на GitHub →

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.

Модули

Arnaud Bouchez · 12:22 UTC · открыть коммит на GitHub →

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, поэтому это не самостоятельная конечная точка.

Arnaud Bouchez · 12:20 UTC · открыть коммит на GitHub →

16 Низкий Блокировка транзакций SQL-прокси переходит на облегчённый системный примитив TSqlDBProxyConnectionProtocol.fSafe меняется с TOSLock на TOSLightLock, соответствующий более лёгкому futex-backed mutex на Linux и Windows 8+. Алгоритм транзакций и публичные методы не меняются. Производительность mormot.db.proxy 907c92f5+3-3

db: refined TSqlDBProxyConnectionProtocol lock

Влияние

Удалённые транзакции SQL-прокси могут иметь меньшие накладные расходы при слабой конкуренции. Миграция исходного кода и изменение поведения приложений не требуются.

Модули

Arnaud Bouchez · 12:20 UTC · открыть коммит на GitHub →

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 при одновременной инициализации нескольких соединений.

Arnaud Bouchez · 11:33 UTC · открыть коммит на GitHub →

18 Низкий Многопоточный стенд проверяет все семейства облегчённых блокировок Новый модуль test.core.threads добавляет 1166 строк стресс-тестов TLightLock, TOSLightLock, TOSRWLightLock, TRWLightLock и связанного поведения на нескольких worker-потоках. Тесты 719cd877+1168-2

tests: extended T*Lock coverage

Влияние

Код приложений не меняется. Набор повышает уверенность в последних переработках locks, но сам по себе не доказывает отсутствие гонок во всех высокоуровневых туннельных и shutdown-последовательностях.

Arnaud Bouchez · 07:41 UTC · открыть коммит на GitHub →

19 Низкий LDAP-тесты покрывают пользовательские атрибуты членов группы TNetworkProtocols добавляет проверки пользовательского разбора членов LDAP-групп, включая нормализованные distinguished names и настроенный путь атрибута member. Изменён только test/test.net.proto.pas. Тесты 4e783875+8-4

tests: cover LDAP custom members parsing

Влияние

Код приложений и runtime фреймворка не меняются. Тесты защищают поведение пользовательских LDAP-членов, добавленное в предыдущем выпуске.

Arnaud Bouchez · 07:40 UTC · открыть коммит на GitHub →

20 Низкий Основной test runner теперь запускает новый набор тестов блокировок test/mormot2tests.dpr добавляет test.core.threads в uses, включая новые тесты блокировок в обычный исполняемый файл mormot2tests. Тесты 62bd0e82+5-2

tests: include test.core.threads in mormot2tests project

Влияние

На runtime и код приложений влияния нет. Постоянные тестовые прогоны теперь выполняют стенд блокировок из предыдущего commit.

Arnaud Bouchez · 07:43 UTC · открыть коммит на GitHub →

Активность апстрима коммитов в день · последние 60 дней
Коммиты977
Активных дней44/60
Пик активности2026-09-30
Максимум60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13