Требует действийможет затронуть работающую систему
Атомики FPC ARM получают порядок памяти, HTTP.sys WebSockets перестраиваются
В выпуске исправлены отсутствующие барьеры памяти в блокировках mORMot для FPC ARM и AArch64: защищённые данные могли конфликтовать, хотя слово блокировки оставалось взаимно исключающим. В Windows обработка запросов и WebSocket в HTTP.sys существенно переписана и затем стабилизирована для жизненного цикла соединений, overlapped I/O, отправки, завершения и ping. Прямым пользователям низкоуровневых HTTP.sys wrappers и индексов соединений THttpApiWebSocketServerProtocol нужна миграция исходников.
Коротко
- Операции блокировок FPC ARM и AArch64 теперь задают полные барьеры памяти; прежний код мог терять обновления или повреждать общее состояние.
- Движок HTTP.sys правильно принимает unlimited chunked bodies, разрывает соединения с непрочитанным телом после ошибки и изолирует состояние каждого запроса.
- Управление HTTP.sys WebSocket теперь использует ID TLockedList, отдельные overlapped-записи чтения/пробуждения и защищённое завершение.
- THttpServerRequest.FullUrl теперь RawUtf8, HttpApiRequest удалён, а несколько низкоуровневых HTTP.sys signatures изменены.
- optCleanMagicJson удаляет JSON_BASE64_MAGIC из SOA-ответов; добавлены SetErrorText, HtmlEscapeShortVar и TLockedList.Find.
- Переходите на build 2.4.17497; не оставайтесь на переходных HTTP.sys builds 2.4.17464–2.4.17496.
Рекомендации по обновлению
Переходите на финальный build 2.4.17497. Развёртывания FPC ARM/ARM64 должны обновиться ради исправления порядка памяти и нагрузочно проверить locks, thread pools и timers. Для Windows HTTP.sys/WebSocket избегайте builds 2.4.17464–2.4.17496, перенесите изменённые публичные символы и проверьте chunked uploads, upgrades, конкурентные send/close, отключения, shutdown и ping timeouts.
32 из 32 записей · 35 коммитов в апстриме
1
Критический
ARM atomic wrappers централизуют исправление барьеров
Следующий коммит задаёт barrier-aware wrappers InterlockedIncrement/InterlockedDecrement для FPC weak-atomic, добавляет AArch64 asm entry points и переводит locks, async connection и ECC reference counters на эти примитивы.
Исправления
mormot.core.base+4
c1a131a8+158-133
core: huge refactoring on arm32/64 about atomic operations
Влияние
Это стабилизированная реализация порядка памяти FPC ARM32/ARM64. Она защищает concurrent state за пределами lock word, особенно thread pools, timers и reference-counted work.
Рекомендуется обновиться
Production-системам FPC ARM/ARM64 следует перейти на 2.4.17497 и повторить concurrency/lifetime stress tests.
2
Критический
FPC non-Intel locks становятся полными барьерами памяти
FPC_WEAKATOMICS помечает non-Intel targets, пути AArch64 LDXR/STLXR добавляют DMB ordering, остальные FPC CPU окружают RTL atomics барьерами в TLightLock, TRWLightLock, TRWLock, TMultiLightLock и TOSLightLock.
Исправления
mormot.core.base+2
b2b195da+190-8
core: Locked*() are now full memory barriers on FPC non-Intel CPUs
Влияние
В FPC ARM/AArch64 исключение lock word не упорядочивало защищённую память. Коммит документирует потерянные increments и TSynThreadPool contexts, а также heap corruption TSynBackgroundTimer.
Рекомендуется обновиться
Считайте обновление обязательным для concurrent FPC ARM/ARM64 services, но используйте финальный build с follow-up refactor.
3
Критический
Небезопасная переделка WebSocket-соединений в class отменена
Коммит полностью отменяет предыдущее class-based переписывание, поскольку TOverlapped обязан оставаться первыми байтами структуры для IOCP.
Исправления
mormot.net.server
1ff6986c+120-69
revert "net: rewritten http.sys WS connections list"
Влияние
Удалён неверный Windows layout, при котором completion callback мог принять object metadata за TOverlapped. Последующие record и TLockedList изменения его заменяют.
Рекомендуется обновиться
Не используйте непосредственно предыдущую ревизию; переходите на финальный build 2.4.17497.
Модули
4
Критический
Class-based список WebSocket вводит неверный IOCP layout
Коммит временно превращает THttpApiWebSocketConnection из TOverlapped-rooted record/object в class и перестраивает массивы протокола. Следующий non-merge коммит полностью его отменяет.
Внутреннее устройство
mormot.net.server
91f43c69+69-120
net: rewritten http.sys WS connections list
Влияние
Эту ревизию нельзя развёртывать: IOCP требует TOverlapped по offset zero, чего class instance не даёт. После revert постоянного API-эффекта нет.
Рекомендуется обновиться
Пропустите эту ревизию и используйте финальный build 2.4.17497.
Модули
5
Высокий
Соединения HTTP.sys WebSocket переходят с индексов на стабильные ID
THttpApiWebSocketServerProtocol хранит соединения в TLockedList, выдаёт каждому THttpApiWebSocketConnection ID, а Send и Close принимают THttpApiWebSocketConnectionID. Отдельные overlapped-записи чтения/пробуждения координируют IOCP и shutdown.
Несовместимые изменения
mormot.net.server
8bcdf7e7+281-196
net: http.sys WebSockets server now uses TLockList
Влияние
Код, сохранявший индекс массива или вызывавший Send/Close с integer, должен хранить Conn.ID и передавать стабильный ID. Runtime получает ABA-safe recycling и более безопасный concurrent shutdown.
Требуется миграция
Найдите THttpApiWebSocketServerProtocol.Send/Close и сохранённые индексы; сохраняйте THttpApiWebSocketConnection.ID в callbacks.
Публичный API
THttpApiWebSocketConnectionIDaddedTHttpApiWebSocketConnection.IDaddedTHttpApiWebSocketServerProtocol.Sendsignature-changedTHttpApiWebSocketServerProtocol.Closesignature-changed
Модули
6
Высокий
Состояние WebSocket на запрос заменяет общий last connection
THttpApiWebSocketServer хранит pending connection в THttpApiServerRequest вместо fLastConnection, делая concurrent upgrades локальными запросу. THttpServerRequest.FullUrl становится virtual RawUtf8, публичное HttpApiRequest удалено.
Несовместимые изменения
mormot.lib.winhttp+1
c852c8cf+92-103
net: several fixed to THttpApiWebSocketServer
Влияние
Удалено явно thread-unsafe общее состояние. Код с FullUrl как SynUnicode должен перейти на RawUtf8, а чтение HttpApiRequest — на поддерживаемые поля или внутреннее Windows-расширение.
Требуется миграция
Найдите объявления/присваивания FullUrl и ссылки HttpApiRequest; мигрируйте до сборки и проверьте concurrent upgrades.
Публичный API
THttpServerRequest.FullUrlsignature-changedTHttpServerRequest.GetFullUrlsignature-changedTHttpServerRequest.HttpApiRequestremoved
7
Высокий
Низкоуровневые HTTP.sys helpers меняют выходные контракты
HTTP_RESPONSE.SetStatus теперь возвращает PRawUtf8 вместо заполнения var RawUtf8, RetrieveHeadersAndGetRemoteIPConnectionID становится procedure с var Headers, добавлены LookupTokenVar и VERB_TEXT.
Несовместимые изменения
mormot.core.os.security+1
9c149153+41-16
lib: some http.sys API wrapper refinements
Влияние
Прямые пользователи низкоуровневых Windows wrappers не соберутся до адаптации return/output parameters. Обычные high-level пользователи THttpServer не затронуты.
Требуется миграция
Найдите вызовы SetStatus и RetrieveHeadersAndGetRemoteIPConnectionID, удалите временные status strings и передайте Headers.
Публичный API
HTTP_RESPONSE.SetStatussignature-changedRetrieveHeadersAndGetRemoteIPConnectionIDsignature-changedLookupTokenVaraddedVERB_TEXTadded
8
Высокий
Неудачные WebSocket upgrades и reads теперь безопасно завершаются
Сервер завершает неудачные upgrades, отвергает новые при остановке, проверяет полную запись, допускает один pending receive на соединение, завершает ошибочный receive нулём байт и ждёт окончания I/O перед recycle.
Исправления
mormot.net.server
97ab4cc4+64-24
net: some THttpApiWebSocketServer fixes
Влияние
Error и shutdown paths Windows HTTP.sys WebSocket больше не перерабатывают записи при возможных completions. Новой миграции исходников нет.
Рекомендуется обновиться
Обновитесь до финального build и под нагрузкой проверьте failed handshake, резкое отключение и shutdown сервера.
Модули
9
Высокий
Completion websocket.dll обрабатывается как void
WebSocketApi.CompleteAction исправлен с функции HRESULT на procedure, проверки результата удалены, а receive начинается только после ответа HTTP 101.
Исправления
mormot.lib.winhttp+1
6f0344bf+19-45
net: fixed WebSocketApi.CompleteAction usage
Влияние
Windows-объявление соответствует websocket.dll и не читает несуществующий result. Порядок upgrade также не начинает read до завершения HTTP handshake.
Рекомендуется обновиться
Используйте исправленное объявление и проверьте успешный и неудачный WebSocket upgrade.
Публичный API
WebSocketApi.CompleteActionsignature-changed
10
Высокий
Состояние ответа HTTP.sys и ошибки Range усилены
Сервер помечает response до отправки, выходит после ошибки открытия static file, возвращает 416 для Range за файлом, перехватывает OnBeforeBody exceptions и последовательно очищает state.
Исправления
mormot.net.server
3b4da68d+34-23
net: some THttpApiServer fixes and cleanup
Влияние
Windows HTTP.sys applications не продолжают и не дублируют response после ошибки и возвращают правильный status для неверного byte range.
Рекомендуется обновиться
Обновитесь и повторно проверьте static-file Range и обработку исключений OnBeforeBody.
Модули
11
Высокий
Конкурентные WebSocket send и close сериализованы
THttpApiWebSocketServerProtocol теперь блокирует Close и Send, а удаление из pending-close получает указатель счётчика вместо указателя массива.
Исправления
mormot.net.server
3383af99+28-18
net: some THttpApiWebSocketServerProtocol fixes
Влияние
Windows WebSocket backends избегают гонок между application threads и обслуживанием протокола, а также повреждения памяти из-за неверного pending count.
Рекомендуется обновиться
Обновитесь вместо сохранения предыдущего refactor и нагрузочно проверьте concurrent Send, Close и disconnect.
Модули
12
Высокий
Объявление WebSocket send синхронизировано с реализацией
Недостающее объявление mormot.net.server заставляет WriteData возвращать успех и written count, удаляет старый общий overlapped для send и синхронно отправляет response entity body.
Исправления
mormot.net.server
c9bcf0ea+16-24
net: missing file in previous commit
Влияние
Предыдущий коммит без этого unit был неполным и мог не собраться или сохранить несовпадающее send-поведение. Публичный application API не меняется.
Рекомендуется обновиться
Не останавливайтесь на предыдущей ревизии; используйте завершённую финальную серию.
Модули
13
Высокий
HTTP.sys закрывает соединения с непрочитанным телом запроса
SendError может добавлять Connection: close и HTTP_SEND_RESPONSE_FLAG_DISCONNECT. Этот путь используется для oversized body, bot rejection, OnBeforeBody abort и read errors.
Исправления
mormot.net.server
6a2970d5+21-9
net: properly disconnect http.sys client when needed
Влияние
Сервер больше не переиспользует HTTP.sys connection с непрочитанным телом, предотвращая повреждённое состояние следующего запроса.
Рекомендуется обновиться
После обновления проверьте rejected uploads и keep-alive.
Модули
14
Высокий
Ошибки ping больше не завершают WebSocket guard
THttpApiWebSocketConnection.CheckIsActive теперь игнорирует неактивные состояния, закрывает просроченные peers до нового ping и перехватывает исключения Ping, закрывая только затронутое соединение.
Исправления
mormot.net.server
21b62bc8+18-9
net: fixed http.sys ping process
Влияние
Сервисы Windows HTTP.sys WebSocket сохраняют guard thread при ошибке ping и не пингуют уже закрывающиеся соединения. API приложений Delphi и FPC не меняется.
Рекомендуется обновиться
Используйте build 2.4.17497 и проверьте ping timeout и shutdown.
Модули
15
Высокий
Получение тела HTTP.sys соответствует контракту Windows API
В объявлении ReceiveRequestEntityBody pBytesReceived меняется с var cardinal на PCardinal. Синхронное чтение передаёт @bytesread, overlapped WebSocket — nil, ошибки записи обнуляют счётчик.
Исправления
mormot.lib.winhttp+1
e795d965+14-13
net: fixed http.sys API incorrect usage
Влияние
Wrapper теперь поддерживает null output pointer для overlapped I/O. Прямые вызовы поля функции должны передавать адрес или nil; этот же коммит временно инвертировал send-test, исправленный следующим.
Требуется миграция
Обновите прямые вызовы ReceiveRequestEntityBody на @count или nil и переходите на 2.4.17497, а не на эту промежуточную ревизию.
Публичный API
THttpApiFunction.ReceiveRequestEntityBodysignature-changed
16
Высокий
Запись WebSocket и ответ на закрытие идут по правильным путям
WriteData теперь успешен только при полной записи тела HTTP.sys, цикл отправки правильно проверяет ошибку, а close frame клиента получает соответствующий ответ сервера.
Исправления
mormot.net.server
072bba0e+11-11
net: THttpApiWebSocketConnection fixes
Влияние
Исправлены регрессии переписывания WebSocket: прежние builds могли прерывать успешную отправку или неверно обрабатывать close handshake в Windows.
Рекомендуется обновиться
Не развёртывайте промежуточный build send-path; используйте 2.4.17497 и проверьте send и закрытие peer.
Модули
17
Высокий
WebSocket network send сообщает фактически записанные байты
WEB_SOCKET_SEND_TO_NETWORK_ACTION теперь пишет каждый buffer websocket.dll, суммирует фактические байты для CompleteAction и отключается при ошибке записи HTTP.sys.
Исправления
mormot.net.server
4730c107+9-6
net: fixed WEB_SOCKET_SEND_TO_NETWORK_ACTION with http.sys
Влияние
Windows HTTP.sys WebSocket больше не заявляет запрошенный размер, если в сеть ушло меньше байт, улучшая обнаружение ошибок и состояние протокола.
Рекомендуется обновиться
Используйте финальный build и проверьте крупные/fragmented sends и принудительные отключения.
Модули
18
Высокий
Unlimited chunked HTTP.sys bodies больше не получают 413
Проверка длины применяет MaximumAllowedContentLength только при значении больше нуля, поэтому ноль сохраняет смысл unlimited для chunked body.
Исправления
mormot.net.server
7b05e490+4-3
net: fixed #642 THttpApiServer chunked body gets 413
Влияние
Windows HTTP.sys endpoints с default unlimited принимают chunked uploads вместо HTTP 413.
Рекомендуется обновиться
Обновитесь, если chunked requests используют MaximumAllowedContentLength=0, и проверьте limited/unlimited uploads.
Модули
19
Высокий
Обработка HTTP.sys становится объектом на запрос
Монолитный THttpApiServer.DoExecute разделён на private THttpApiServerRequest с request, response, buffers, logging и send/error methods. Переиспользование по thread сохранено, состояние ответа и исключений стало явным.
Внутреннее устройство
mormot.net.http+1
5adc88f8+507-518
net: huge THttpApiServer refactoring/rewrite
Влияние
Windows HTTP.sys получает более явную изоляцию запросов и error handling, но это начало multi-commit rewrite и не подходит как отдельная точка обновления.
Стоит взглянуть
20
Высокий
Записи WebSocket сохраняют overlapped по смещению ноль
Соединения возвращены к record/object с TOverlapped первым полем, а allocation, lookup и pending-close arrays перестроены вокруг pointers.
Внутреннее устройство
mormot.net.server
22a41512+61-94
net: some THttpApiWebSocketConnection refactoring
Влияние
Восстановлен layout для IOCP callbacks после отменённой class-попытки, но это промежуточная архитектура, затем заменённая TLockedList.
Стоит взглянуть
Модули
21
Средний
Повреждённый сжатый HTTP-контент больше не выбрасывает исключение
THttpSocketCompressList.UncompressContent оборачивает decompressor в try/except, очищает result и возвращает nil при исключении codec.
Исправления
mormot.net.http
f1ec718b+11-7
net: hardened THttpSocketCompressList.UncompressContent
Влияние
Повреждённый gzip/deflate становится обычной ошибкой распаковки вместо исключения в Delphi/FPC HTTP path. Callers должны обрабатывать nil.
Рекомендуется обновиться
Проверьте, что custom callers считают nil неверным compressed content, а не ожидают codec exception.
Публичный API
THttpSocketCompressList.UncompressContentbehaviour-changed
Модули
22
Средний
Заблокированные списки находят ABA-resistant идентификаторы
Публичный TLockedListID типизирует sequence, а TLockedList.Find ищет ненулевой ID под блокировкой списка. В 32-bit FPC перенос LockedInc64 использует LockedInc32 ради барьера.
Новые возможности
mormot.core.base+1
4824b5db+32-8
core: new TLockedList.Find method
Влияние
Инфраструктура может находить recycled records без нестабильных pointers. Существующие Delphi/FPC callers не меняются, если не используют helper.
Стоит взглянуть
Публичный API
TLockedListIDaddedTLockedList.Findadded
23
Средний
SOA-методы могут возвращать JSON без binary magic prefixes
TInterfaceMethodOption получает optCleanMagicJson. TInterfaceFactoryServer.ExecuteJson вызывает RemoveMagicFromJson для ответа при наличии опции.
Новые возможности
mormot.core.interfaces+1
2ff79bbd+6-2
soa: new optCleanMagicJson option for #402
Влияние
Выбранные interface methods могут выдавать JSON-строки без внутреннего JSON_BASE64_MAGIC. Существующие services не меняются без opt-in.
Стоит взглянуть
Публичный API
TInterfaceMethodOption.optCleanMagicJsonadded
24
Средний
Удаление JSON magic переписано как быстрый copy-on-write scan
RemoveMagicFromJson сначала сканирует границы строк и JSON_BASE64_MAGIC, выделяя writable copy только при фактическом удалении маркера.
Производительность
mormot.core.json
367cdf5a+46-43
core: rewritten RemoveMagicFromJson()
Влияние
SOA и прямые callers сохраняют public procedure, но обычный JSON не копируется. Поведение ограничено строками с magic prefix.
Стоит взглянуть
Модули
25
Низкий
Текст системной ошибки можно записать прямо в RawUtf8
Публичная procedure SetErrorText заполняет существующий RawUtf8 по OS error code, по умолчанию текущему. GetErrorText делегирует ей, HTTP-код переиспользует helper.
Новые возможности
mormot.core.os+2
f47c802c+263-237
core: new SetErrorText() function
Влияние
Callers могут переиспользовать destination string и избежать temporary; существующий GetErrorText остаётся совместимым в Delphi и FPC.
Публичный API
SetErrorTextadded
26
Низкий
HTML escaping может заполнять short string вызывающего
Публичная procedure HtmlEscapeShortVar пишет escaped RawUtf8 в ShortString с выбранным format; HtmlEscapeShort теперь делегирует wrapper.
Новые возможности
mormot.core.fmt
5ec9601b+14-4
core: new HtmlEscapeShortVar() wrapper function
Влияние
Delphi/FPC callers с готовым destination могут избежать временного результата. Существующие вызовы совместимы.
Публичный API
HtmlEscapeShortVaradded
Модули
27
Низкий
Async networking получает нефункциональную очистку
mormot.net.async отформатирован и упрощён без изменения исполняемых ветвей или публичных объявлений.
Внутреннее устройство
mormot.net.async
29b15f39+17-17
net: some code cleanup with no functional change
Влияние
Влияния на application code Delphi или FPC не ожидается.
Модули
28
Низкий
Переписанный объект запроса HTTP.sys очищен
Следующий коммит упрощает и форматирует новую реализацию THttpApiServerRequest после крупного переписывания без изменения задуманного поведения.
Внутреннее устройство
mormot.net.server
6dfbaf34+13-17
net: THttpApiServer cleanup after previous commit
Влияние
В diff нет влияния на application code; это обслуживание внутренней реализации Windows HTTP.sys.
Модули
29
Низкий
Пример документирует папки interface и implementation
SAD, README и project guides описывают разделение app/<entity>/interface и app/<entity>/implementation, направление dependencies и исключение local mode.
Документация
recommended-patterns documentation
76e144c0+147-119
Document the app/<entity>/interface|implementation layout
Влияние
Runtime mORMot не меняется; команды, следующие примеру, получают более ясное архитектурное руководство.
30
Низкий
Документация CQRS layout учитывает замечания ревью
Документы архитектуры и разработки уточняют dependencies interface/implementation и ссылки example service после ревью.
Документация
recommended-patterns documentation
4ecaf74e+16-15
Address review notes on the interface/implementation docs
Влияние
Нет влияния на runtime или public framework API; улучшено только объяснение recommended-patterns.
31
Низкий
Инструкции сборки и зависимости примера исправлены
Документация recommended-patterns удаляет устаревшие build steps и синхронизирует dependencies с новым source tree.
Документация
recommended-patterns documentation
5b856937+22-8
Fix stale build steps and dependency list in the example docs
Влияние
Нет изменений framework или runtime; исправлены лишь инструкции для сборки примера.
32
Низкий
CQRS-пример разделяет контракты и реализации
Query, command и DTO units recommended-patterns перемещены в app/<entity>/interface, mappers и handlers — в implementation; пути проектов Delphi и FPC обновлены.
Обслуживание
recommended-patterns example
323eb2c9+70-62
Move CQRS interfaces from dom/ to app/<entity>/interface
Влияние
Меняются только layout примера и build paths. Пользователи framework и production backends не затронуты, если не копировали структуру.