立即处理可能影响正在运行的系统
FPC ARM 原子操作恢复内存顺序,HTTP.sys WebSocket 完成重构
本期修复了 FPC ARM 与 AArch64 上 mORMot 锁缺失内存屏障的问题;此前即使锁字互斥,受保护数据仍可能发生竞态。Windows 的 HTTP.sys 请求与 WebSocket 处理被大幅重构,并连续修复连接生命周期、overlapped I/O、发送、关闭与 ping 路径。直接使用低层 HTTP.sys wrapper 或 THttpApiWebSocketServerProtocol 连接索引的代码需要迁移。
要点
- FPC ARM 与 AArch64 锁操作现在提供完整内存屏障;旧实现可能丢失更新或破坏共享状态。
- HTTP.sys 请求引擎现在正确处理无限制的 chunked body,会断开留下未读 body 的失败连接,并隔离每个请求的状态。
- HTTP.sys WebSocket 连接管理改用 TLockedList ID、独立的接收/唤醒 overlapped 记录和受保护的关闭流程。
- THttpServerRequest.FullUrl 现为 RawUtf8,HttpApiRequest 已移除,多项低层 HTTP.sys 签名也已改变。
- optCleanMagicJson 可从 SOA 响应移除 JSON_BASE64_MAGIC;新增 SetErrorText、HtmlEscapeShortVar 与 TLockedList.Find。
- 请落到 build 2.4.17497,不要停留在 HTTP.sys 过渡版本 2.4.17464–2.4.17496。
升级建议
请采用最终 build 2.4.17497。FPC ARM/ARM64 部署应升级以获得内存顺序修复,并压力测试锁、线程池与定时器。Windows HTTP.sys/WebSocket 部署应避开 2.4.17464–2.4.17496,迁移已变化的公共符号,再测试 chunked 上传、upgrade、并发 send/close、客户端断开、关闭与 ping 超时。
32 条中的 32 条 · 上游 35 次提交
1
严重
ARM 原子 wrapper 集中实现内存屏障修复
后续提交为 FPC weak-atomic 目标定义带屏障的 InterlockedIncrement/InterlockedDecrement wrapper,加入 AArch64 汇编入口,并让锁、异步连接与 ECC 引用计数使用这些原语。
修复
mormot.core.base+4
c1a131a8+158-133
core: huge refactoring on arm32/64 about atomic operations
影响
这是 FPC ARM32/ARM64 内存顺序的稳定实现,可保护锁字之外的并发状态,尤其影响线程池、定时器与引用计数任务。
建议升级
FPC ARM/ARM64 生产系统应升级至 2.4.17497,并重跑并发与生命周期压力测试。
2
严重
FPC 非 Intel 锁成为完整内存屏障
FPC_WEAKATOMICS 标记非 Intel 目标,AArch64 LDXR/STLXR 路径加入 DMB 顺序,其他 FPC CPU 则在 TLightLock、TRWLightLock、TRWLock、TMultiLightLock 与 TOSLightLock 的 RTL 原子操作周围加屏障。
修复
mormot.core.base+2
b2b195da+190-8
core: Locked*() are now full memory barriers on FPC non-Intel CPUs
影响
在 FPC ARM/AArch64 上,锁字互斥此前不会排序受保护内存;提交记录了计数丢失、TSynThreadPool context 丢失与 TSynBackgroundTimer heap 损坏。
建议升级
对并发 FPC ARM/ARM64 服务应视为必须升级,但请使用包含后续重构的最终 build。
3
严重
不安全的 WebSocket 连接 class 重写已撤销
该提交完整撤销前一个基于 class 的连接列表重写,因为传给 IOCP 的结构必须以 TOverlapped 开头。
修复
mormot.net.server
1ff6986c+120-69
revert "net: rewritten http.sys WS connections list"
影响
这移除了可能让 completion callback 把对象元数据当作 TOverlapped 的无效 Windows 运行时布局;之后 record 与 TLockedList 工作取代了它。
建议升级
不要使用紧邻的前一版本;请落到最终 build 2.4.17497。
4
严重
基于 class 的 WebSocket 连接列表引入无效 IOCP 布局
该提交暂时把 THttpApiWebSocketConnection 从以 TOverlapped 开头的 record/object 改为 class,并重组协议连接数组;下一非 merge 提交完整撤销。
内部重构
mormot.net.server
91f43c69+69-120
net: rewritten http.sys WS connections list
影响
此版本不可部署:IOCP 要求 TOverlapped 位于零偏移,而 class 实例不满足;撤销后无持续 API 影响。
建议升级
跳过此版本,使用最终 build 2.4.17497。
5
高
HTTP.sys WebSocket 连接从索引迁移到稳定 ID
THttpApiWebSocketServerProtocol 改用 TLockedList 存储连接,为每个 THttpApiWebSocketConnection 提供 ID,并让 Send/Close 接收 THttpApiWebSocketConnectionID;独立读/唤醒 overlapped 记录协调 IOCP 生命周期与关闭。
破坏性变更
mormot.net.server
8bcdf7e7+281-196
net: http.sys WebSockets server now uses TLockList
影响
保存数组索引或以 integer 调用 protocol Send/Close 的代码必须改为保存 Conn.ID 并传稳定 ID;运行时获得抗 ABA 回收与更安全的并发关闭。
需要迁移
搜索 THttpApiWebSocketServerProtocol.Send/Close 与保存的连接索引,改为在 callback 中记录 THttpApiWebSocketConnection.ID。
公开 API
THttpApiWebSocketConnectionIDaddedTHttpApiWebSocketConnection.IDaddedTHttpApiWebSocketServerProtocol.Sendsignature-changedTHttpApiWebSocketServerProtocol.Closesignature-changed
6
高
每请求 WebSocket 状态取代共享最后连接
THttpApiWebSocketServer 把待处理连接存到 THttpApiServerRequest 而非 fLastConnection,使并发 upgrade 隔离到请求;THttpServerRequest.FullUrl 改为 virtual RawUtf8,公共 HttpApiRequest 被移除。
破坏性变更
mormot.lib.winhttp+1
c852c8cf+92-103
net: several fixed to THttpApiWebSocketServer
影响
已移除明确不具线程安全性的共享状态。把 FullUrl 当作 SynUnicode 的代码须改用 RawUtf8;读取 HttpApiRequest 的代码须改用受支持字段或内部 Windows 扩展。
需要迁移
搜索 FullUrl 声明/赋值与 HttpApiRequest 引用,编译前迁移并测试并发 upgrade。
公开 API
THttpServerRequest.FullUrlsignature-changedTHttpServerRequest.GetFullUrlsignature-changedTHttpServerRequest.HttpApiRequestremoved
7
高
低层 HTTP.sys helper 改变输出契约
HTTP_RESPONSE.SetStatus 现在返回 PRawUtf8 而非填充 var RawUtf8;RetrieveHeadersAndGetRemoteIPConnectionID 改为带 var Headers 的 procedure;新增 LookupTokenVar 与 VERB_TEXT。
破坏性变更
mormot.core.os.security+1
9c149153+41-16
lib: some http.sys API wrapper refinements
影响
直接使用这些 Windows 低层 wrapper 的代码在更新返回值与输出参数前会编译失败;典型高层 THttpServer 用户不受影响。
需要迁移
搜索 SetStatus 与 RetrieveHeadersAndGetRemoteIPConnectionID 调用,移除临时 status 字符串并传入 Headers 变量。
公开 API
HTTP_RESPONSE.SetStatussignature-changedRetrieveHeadersAndGetRemoteIPConnectionIDsignature-changedLookupTokenVaraddedVERB_TEXTadded
8
高
失败的 WebSocket upgrade 与接收现在可安全清理
服务器会完成失败 upgrade 的清理,在停止时拒绝新 upgrade,校验完整写入,每连接只允许一个 pending receive,以零字节完成失败接收,并等待 I/O 清空后再回收。
修复
mormot.net.server
97ab4cc4+64-24
net: some THttpApiWebSocketServer fixes
影响
Windows HTTP.sys WebSocket 的错误与关闭路径不再在 completion 可能到达时回收记录;未新增源码迁移。
建议升级
升级到最终 build,并在负载下测试握手失败、突然断开与服务器关闭。
9
高
websocket.dll completion 按 void 操作处理
WebSocketApi.CompleteAction 从返回 HRESULT 的函数修正为 procedure,移除结果检查,并仅在 HTTP 101 切换协议响应后开始接收。
修复
mormot.lib.winhttp+1
6f0344bf+19-45
net: fixed WebSocketApi.CompleteAction usage
影响
Windows 声明现在与 websocket.dll 一致,不再读取不存在的返回值;upgrade 顺序也避免在 HTTP 握手完成前读取。
建议升级
使用修正声明,并验证 WebSocket upgrade 成功与失败路径。
公开 API
WebSocketApi.CompleteActionsignature-changed
10
高
HTTP.sys 响应状态与 Range 失败路径得到强化
服务器在提交前标记响应,静态文件打开失败后立即退出,Range 起点越界时返回 416,捕获 OnBeforeBody 异常并一致清理响应状态。
修复
mormot.net.server
3b4da68d+34-23
net: some THttpApiServer fixes and cleanup
影响
Windows HTTP.sys 应用避免在失败后继续或重复响应,并为无效 byte range 返回正确状态。
建议升级
升级并重新测试静态文件 Range 请求与 OnBeforeBody 异常处理。
11
高
并发 WebSocket send 与 close 现已串行化
THttpApiWebSocketServerProtocol 现在在连接 Close/Send 周围加锁,pending-close 数组删除也改为传计数指针而非数组指针。
修复
mormot.net.server
3383af99+28-18
net: some THttpApiWebSocketServerProtocol fixes
影响
Windows WebSocket 后端避免应用线程与协议维护间竞态,也避免因更新错误 pending 计数而导致的内存破坏。
建议升级
不要停留在前一个连接列表重构版本;升级并压力测试并发 Send、Close 与断开。
12
高
WebSocket 发送声明与实现保持一致
遗漏的 mormot.net.server 声明更新让 WriteData 返回成功状态与写入数,移除旧的共享 overlapped 发送,并同步发送 response entity body。
修复
mormot.net.server
c9bcf0ea+16-24
net: missing file in previous commit
影响
前一提交缺少此 unit,可能无法编译或保留不一致发送行为;公共应用 API 不变。
建议升级
不要停在前一版本;使用完整最终系列。
13
高
HTTP.sys 会关闭仍有未读请求 body 的连接
SendError 现在可加入 Connection: close 与 HTTP_SEND_RESPONSE_FLAG_DISCONNECT;超大 body、bot 拒绝、OnBeforeBody 中止及 body 读取错误都走此路径。
修复
mormot.net.server
6a2970d5+21-9
net: properly disconnect http.sys client when needed
影响
服务器不再复用请求 body 未完全消费的 HTTP.sys 连接,避免下一请求继承污染的流状态。
建议升级
升级后重新测试被拒上传与 keep-alive 行为。
14
高
ping 失败不再终止 WebSocket guard
THttpApiWebSocketConnection.CheckIsActive 现在忽略非活动状态,在再次 ping 前关闭超时 peer,并捕获 Ping 异常,仅关闭受影响连接。
修复
mormot.net.server
21b62bc8+18-9
net: fixed http.sys ping process
影响
Windows HTTP.sys WebSocket 服务在 ping 失败时会保留 guard 线程,也不会 ping 已在关闭的连接。Delphi/FPC 应用 API 不变。
建议升级
使用 build 2.4.17497,并测试 ping 超时与关闭路径。
15
高
HTTP.sys body 接收现在符合 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 现在支持 overlapped I/O 所需的空输出指针。直接调用函数指针字段时必须传地址或 nil;同一提交暂时反转了发送判断,下一提交已修复。
需要迁移
把直接 ReceiveRequestEntityBody 调用改为传 @count 或 nil,并落到 2.4.17497,而非此中间版本。
公开 API
THttpApiFunction.ReceiveRequestEntityBodysignature-changed
16
高
WebSocket 写入与对端关闭回应走入正确路径
WriteData 仅在 HTTP.sys entity-body 完整写入时成功,发送循环以正确条件判断失败,客户端 close frame 会收到对应的服务端 close 回应。
修复
mormot.net.server
072bba0e+11-11
net: THttpApiWebSocketConnection fixes
影响
这修复了 WebSocket 重构期间引入的问题:此前 build 可能中止成功发送或错误处理 Windows 上的关闭握手。
建议升级
不要部署中间发送路径 build;使用 2.4.17497 并测试发送与对端关闭。
17
高
WebSocket 网络发送报告实际写入字节数
WEB_SOCKET_SEND_TO_NETWORK_ACTION 现在逐个写入 websocket.dll buffer,累计实际字节数传给 CompleteAction,并在 HTTP.sys body 写入失败时断开。
修复
mormot.net.server
4730c107+9-6
net: fixed WEB_SOCKET_SEND_TO_NETWORK_ACTION with http.sys
影响
Windows HTTP.sys WebSocket 发送不再在实际写入较少时声称完整长度,从而改善失败检测与协议状态。
建议升级
使用最终 build,并测试大包/分片发送与强制断开。
18
高
无限制 chunked HTTP.sys body 不再收到 413
长度检查仅在 MaximumAllowedContentLength 大于零时生效,因此零对 chunked body 继续表示无限制。
修复
mormot.net.server
7b05e490+4-3
net: fixed #642 THttpApiServer chunked body gets 413
影响
使用默认无限制配置的 Windows HTTP.sys endpoint 会接受 chunked 上传,而非返回 HTTP 413。
建议升级
若 chunked 请求使用 MaximumAllowedContentLength=0,请升级并重测有限与无限上传。
19
高
HTTP.sys 请求处理改为每请求对象
单体 THttpApiServer.DoExecute 被拆成私有 THttpApiServerRequest,封装请求、响应、buffer、日志和 send/error 方法;仍按线程复用,但响应与异常状态更明确。
内部重构
mormot.net.http+1
5adc88f8+507-518
net: huge THttpApiServer refactoring/rewrite
影响
Windows HTTP.sys 后端获得更清晰的请求隔离与错误处理,但这是多提交重构起点,不应单独采用。
值得一看
20
高
WebSocket 连接记录保持 overlapped 位于零偏移
连接恢复为 record/object 存储并把 TOverlapped 放在首字段,同时围绕指针重组分配、查找与 pending-close 数组。
内部重构
mormot.net.server
22a41512+61-94
net: some THttpApiWebSocketConnection refactoring
影响
这在撤销 class 尝试后恢复了 IOCP callback 所需布局,但仍是随后被 TLockedList 替代的中间架构。
值得一看
21
中
损坏的压缩 HTTP 内容不再抛出异常
THttpSocketCompressList.UncompressContent 用 try/except 包裹解压器;codec 抛异常时清空结果并返回 nil。
修复
mormot.net.http
f1ec718b+11-7
net: hardened THttpSocketCompressList.UncompressContent
影响
损坏的 gzip/deflate 输入会成为普通解压失败,不再把异常传播到 Delphi/FPC HTTP 请求路径;调用方应处理 nil。
建议升级
确认自定义调用把 nil 视为无效压缩内容,而非依赖 codec 异常。
公开 API
THttpSocketCompressList.UncompressContentbehaviour-changed
22
中
锁定列表可解析抗 ABA 的序列标识符
公共 TLockedListID 为 sequence 字段提供类型,TLockedList.Find 在列表锁下搜索非零 ID;32 位 FPC 的 LockedInc64 进位路径也使用 LockedInc32 以获得屏障。
新功能
mormot.core.base+1
4824b5db+32-8
core: new TLockedList.Find method
影响
基础设施可查找回收列表记录而不依赖不稳定指针;现有 Delphi/FPC 调用方仅在采用新 helper 时受影响。
值得一看
公开 API
TLockedListIDaddedTLockedList.Findadded
23
中
SOA 方法可返回不含 binary magic 前缀的 JSON
TInterfaceMethodOption 新增 optCleanMagicJson;设置该选项时,TInterfaceFactoryServer.ExecuteJson 会对响应调用 RemoveMagicFromJson。
新功能
mormot.core.interfaces+1
2ff79bbd+6-2
soa: new optCleanMagicJson option for #402
影响
选定接口方法可输出不含内部 JSON_BASE64_MAGIC 前缀的 JSON 字符串;现有服务除非显式启用,否则行为不变。
值得一看
公开 API
TInterfaceMethodOption.optCleanMagicJsonadded
24
中
JSON magic 移除重写为更快的 copy-on-write 扫描
RemoveMagicFromJson 先扫描字符串边界并检测 JSON_BASE64_MAGIC 前缀,仅在确需移除标记时分配可写副本。
性能
mormot.core.json
367cdf5a+46-43
core: rewritten RemoveMagicFromJson()
影响
SOA 与直接调用者保持相同公共 procedure,但普通 JSON 不再复制;行为仍只针对 magic 前缀 JSON 字符串。
值得一看
25
低
系统错误文本可直接写入 RawUtf8
公共 SetErrorText procedure 从 OS 错误码填充现有 RawUtf8,默认使用当前错误;GetErrorText 委托给它,HTTP 代码也复用该 helper。
新功能
mormot.core.os+2
f47c802c+263-237
core: new SetErrorText() function
影响
调用方可复用目标字符串并避免结果临时值;现有 GetErrorText 代码在 Delphi/FPC 下保持兼容。
公开 API
SetErrorTextadded
26
低
HTML 转义可填充调用方持有的 short string
公共 HtmlEscapeShortVar procedure 按指定格式把转义后的 RawUtf8 写入 ShortString;HtmlEscapeShort 现委托给它。
新功能
mormot.core.fmt
5ec9601b+14-4
core: new HtmlEscapeShortVar() wrapper function
影响
已有目标变量的 Delphi/FPC 调用方可避免函数结果临时值;现有调用保持兼容。
公开 API
HtmlEscapeShortVaradded
27
低
异步网络进行无功能变化清理
mormot.net.async 进行格式化与简化,不改变执行分支或公共声明。
内部重构
mormot.net.async
29b15f39+17-17
28
低
重写后的 HTTP.sys 请求对象完成清理
后续提交简化并格式化大规模重构后的 THttpApiServerRequest 实现,不改变预期行为。
内部重构
mormot.net.server
6dfbaf34+13-17
net: THttpApiServer cleanup after previous commit
影响
diff 中未见应用代码影响;这是 Windows HTTP.sys 实现内部维护。
29
低
示例记录 interface 与 implementation 目录结构
SAD、README 与项目指南说明 app/<entity>/interface 和 app/<entity>/implementation 的拆分、依赖方向及 local-mode 例外。
文档
recommended-patterns documentation
76e144c0+147-119
Document the app/<entity>/interface|implementation layout
影响
mORMot 运行时行为不变;采用该示例的团队获得更清晰架构指导。
30
低
CQRS 布局文档纳入评审修正
架构与开发文档在评审后澄清 interface/implementation 依赖,并调整示例服务引用。
文档
recommended-patterns documentation
4ecaf74e+16-15
Address review notes on the interface/implementation docs
影响
无运行时或公共框架 API 影响;该提交仅改进 recommended-patterns 说明。
31
低
示例构建说明与依赖列表得到修正
recommended-patterns 文档移除过时构建步骤,并使依赖列表与重组后的源码树一致。
文档
recommended-patterns documentation
5b856937+22-8
Fix stale build steps and dependency list in the example docs
影响
无框架或应用运行时变化;仅构建示例的开发者获得正确说明。
32
低
CQRS 示例分离契约与实现
recommended-patterns 的 query、command 与 DTO unit 移到 app/<entity>/interface,mapper 与 handler 移到 implementation;Delphi/FPC 项目路径同步更新。
杂项
recommended-patterns example
323eb2c9+70-62
Move CQRS interfaces from dom/ to app/<entity>/interface
影响
仅示例项目布局与构建路径变化;框架用户和生产后端不受影响,除非复制了该示例结构。