立即处理可能影响正在运行的系统TCrtSocket 文档称负的阶段超时会回退到 TimeOut,但最终 getter 只在存储值为 0 时回退。因此本期建议活动 socket 使用 0 触发回退;负值的确切运行时效果取决于 backend。
异步关闭修复泄漏,HTTP 超时按阶段拆分
这是一期影响较大的网络更新。异步服务器、隧道与 RTSP-over-HTTP 协同修复了所有权和关闭流程,TSynThreadPool 也消除了可能让排队任务一直休眠的竞争。HTTP 客户端新增独立的连接、发送和接收超时,Kerberos 服务端认证则统一到跨平台 wrapper,并移除一个公开方法。
要点
- TSynThreadPool now clears a worker's processing state under the pending-queue lock, preventing a queued task from being stranded by a wake-up race.
- Async socket, tunnel and RTSP-over-HTTP cleanup now closes file descriptors and transferred connections on failure and shutdown paths.
- TCrtSocket and HTTP clients now expose separate connect, send and receive timeouts; use 0, not a negative value, when requesting legacy fallback on a live TCrtSocket.
- TServerSspiKeyTab.ComputeServerHeader is removed; migrate direct callers to KerberosServerAuthHeader and prepare a POSIX keytab explicitly when required.
- Delphi users should land on build 2.4.17398, which repairs compilation after the timeout constructor refactor.
升级建议
异步服务器、隧道和 RTSP 部署应升级到最终 build 2.4.17398,并覆盖空闲连接、部分请求和待发送数据下的关闭测试。Delphi 用户不要停在 2.4.17393–2.4.17397。升级前搜索 TServerSspiKeyTab.ComputeServerHeader,并把直接调用改为 KerberosServerAuthHeader。
25 条中的 25 条 · 上游 26 次提交
1
严重
线程池唤醒竞争可能让排队任务永久搁置
TSynThreadPool.PopPendingContext 现在接收调用线程,并在持有 fPendingSafe 时清除其 fProcessingContext。因此队列检查与 worker 空闲状态发布相对于 Push 成为原子操作。
修复
mormot.core.threads+1
4860cac1+18-20
core: fixed TSynThreadPool.PopPendingContext race condition
影响
在非 IOCP 线程池路径上,Push 不会再把任务排到即将休眠且未被唤醒的 worker 后面。这避免了异步待处理任务一直停滞到无关事件到来。
建议升级
POSIX 及其他非 IOCP 异步负载应优先升级,并在 worker 进入空闲状态时对排队任务做压力测试。
2
高
直接 keytab HTTP 认证方法已移除
TServerSspiKeyTab.ComputeServerHeader 被删除。TServerSspiKeyTab 新增 FileSetter 与 nil-safe KeyTab getter,ServerSspiDataNtlm 也会先确认输入至少有四字节再读取 cardinal。
破坏性变更
mormot.lib.gssapi+1
03373d42+46-61
lib: removed TServerSspiKeyTab.ComputeServerHeader
影响
调用 ComputeServerHeader 的应用将无法编译。短小的畸形 SSPI/GSSAPI token 现在会被拒绝,不再越界读取 cardinal。
需要迁移
搜索 TServerSspiKeyTab.ComputeServerHeader,改为调用 KerberosServerAuthHeader;POSIX 使用特定 keytab 时先调用 PrepareKeyTab。
公开 API
TServerSspiKeyTab.ComputeServerHeaderremoved — 请使用 mormot.net.client 中的 KerberosServerAuthHeader。TServerSspiKeyTab.FileSetteradded
3
高
异步服务器关闭现在覆盖所有连接退出路径
TAsyncConnections 现在关闭待处理读取、等待 worker 与 accept loop、释放已跟踪连接、允许最终 GC 插入,并修正 ConnectionDelete 与 EndConnection 顺序。客户端请求失败路径也会统一中止已转移连接。
修复
mormot.net.async+1
c87c00ab+92-50
net: avoid connection leaks in async server
影响
长期运行的 Delphi 与 FPC 异步服务器在关闭、accept 失败和客户端设置错误时可避免连接对象与 socket 泄漏。销毁会先等待 worker 所有权稳定,再释放共享状态。
建议升级
异步服务器应升级,并测试空闲客户端、部分请求、待发送数据及 acoNoConnectionTrack 下的销毁。
4
高
RTSP-over-HTTP 设置会清理所有部分接管的连接
TRtspOverHttpServer.ConnectionCreate 显式跟踪 GET、POST 与 RTSP 连接所有权,并在 finally 中释放每个对象或原始 RTSP socket,除非所有权已成功转移。
修复
mormot.net.rtsphttp
213dd8c6+50-33
net: fixed potential leaks in TRtspOverHttpServer
影响
失败或中断的 RTSP-over-HTTP 配对不再泄漏 socket 和连接对象。现有 Delphi 与 FPC 应用 API 不变。
建议升级
测试 GET/POST 配对失败与 RTSP 设置中断,并监控 socket 和对象数量。
5
高
隧道失败路径会关闭两端 socket
TTunnelLocalThread.Destroy 关闭 fServerSock 与 fClientSock;TTunnelLocal.Open 和 OpenSocket 在异常及设置失败时使用 ShutdownAndClose,并将已转移 socket 置 nil。
修复
mormot.net.tunnel
2eb90dbc+17-5
net: fixed FD socket leak in TTunnelLocal
影响
反复失败的隧道打开不再在 POSIX、Delphi 或 FPC 目标上累积文件描述符或 socket handle。
建议升级
对 Open 与 OpenSocket 失败路径做压力测试,并确认描述符数量恢复到基线。
6
高
异步连接销毁会关闭 Stop 遗留的 socket
TPollAsyncConnection.Destroy 现在释放 fSecure,将 linger 设为立即关闭,并在 Stop 后 fSocket 仍有值时调用 ShutdownAndClose。
修复
mormot.net.async
5707c869+19-2
net: fixed TPollAsyncConnection.Destroy
影响
销毁部分停止的异步连接时不再遗留打开的 socket handle。该修复适用于 Delphi 与 FPC 异步 backend。
建议升级
部署更广泛的异步所有权修改时,请包含此析构修复。
7
高
即使 epoll 移除失败,取消订阅也会关闭 socket
当 fUnsubscribeShutdownSocket 启用时,TPollSocketEpoll.Unsubscribe 将原始 socket 的关闭移出 EPOLL_CTL_DEL 成功分支;即使 epoll 描述符已不可用也会关闭。
修复
mormot.net.sock
54de4647+11-10
net: fixed leaking socket FD in TPollSocketEpoll.Unsubscribe
影响
Linux 及其他基于 epoll 的服务器在取消订阅与拆除竞争或 EPOLL_CTL_DEL 失败时不再泄漏文件描述符。Windows 与非 epoll backend 不受影响。
建议升级
在 epoll 部署中,反复启动和停止异步服务时监控打开的文件描述符。
8
高
HTTP 超时重构后的 Delphi 编译已恢复
TCrtSocket 构造器现在调用受保护的虚方法 DoCreate,THttpClientSocket 则覆盖 DoCreate,不再重新声明 Create。这样保留了子类初始化,同时消除了 Delphi 的构造器冲突。
编译器与平台
mormot.net.client+1
fd5b3409+24-24
net: fixed Delphi compilation of THttpClientSocket
影响
完整的超时系列重新可在 Delphi 下编译。FPC 使用相同初始化路径,但应用代码无需修改。
建议升级
如果采用了任一新超时提交,请使用 build 2.4.17398 或更高版本。
9
中
异步连接注册前的回滚逻辑得到集中
受保护的 TAsyncConnections.ConnectionAbortAndNil 现在会清空调用者引用、保留调用者拥有的 socket,通过 fSockets 关闭已注册连接,并直接释放未注册实例。
修复
mormot.net.async
3742e9a7+62-25
net: new TAsyncConnections.ConnectionAbortAndNil method
影响
框架失败路径现在使用统一所有权规则,降低重复释放和泄漏风险。该 helper 为 protected,不新增公开应用 API。
10
中
隧道关闭不再调用缺失的 transmit closure
TTunnelLocal.SendFrame 在隧道终止时发送关闭帧前,会先检查 fTransmit 是否已赋值。
修复
mormot.net.tunnel
fbb9dc6b+1-1
tun - fix nil transmit try to send frame
影响
Delphi 与 FPC build 的隧道拆除可避免调用 nil closure。应用代码无需迁移。
建议升级
请将此修复与相邻的隧道清理提交一起采用,再测试隧道拆除。
11
中
Socket 新增独立的连接、发送和接收超时
TCrtSocket 新增 SetTimeouts 与 ConnectTimeout,并让 SendTimeout 和 ReceiveTimeout 同时可读写。连接、代理、TLS、发送和接收路径分别选择对应阶段值。
新功能
mormot.net.sock
221f7715+181-81
net: introduce 3 specific timeouts to TCrtSocket
影响
Delphi 与 FPC 代码可将慢速建连与请求/响应 I/O 分开调节。阶段值保持 0 时,现有 TimeOut 代码继续提供默认值。
值得一看
公开 API
TCrtSocket.SetTimeoutsaddedTCrtSocket.ConnectTimeoutaddedTCrtSocket.SendTimeoutbehaviour-changed — 该属性现在同时可读写。TCrtSocket.ReceiveTimeoutbehaviour-changed — 该属性现在同时可读写。
12
中
统一的 Kerberos HTTP helper 同时服务 Windows 与 POSIX
KerberosServerAuthHeader 将单轮 Negotiate helper 移到 mormot.net.client,拒绝 NTLM,并供 SSPI 与 GSSAPI 服务端授权共同使用。NOKERBEROSCLIENT 可排除该 helper。
新功能
mormot.lib.gssapi+3
0bc90ef6+79-75
net: new HTTP "Negotiate" KerberosServerAuthHeader() wrapper
影响
自定义 Delphi 与 FPC HTTP 服务器可在 Windows 和 POSIX 上使用同一公开 helper。它仅支持简单的两消息 Kerberos 交换,不支持 NTLM 或多轮协商。
值得一看
公开 API
KerberosServerAuthHeaderadded — mormot.net.client 中的最终跨平台名称。
13
中
扩展 HTTP 选项携带三个独立超时
THttpRequestExtendedOptions 新增 ConnectTimeoutMS、SendTimeoutMS、ReceiveTimeoutMS 与 GetTimeouts。序列化使用 tm、tc、ts、tr 字段,HTTP backend 在打开请求时使用解析后的值。
新功能
mormot.net.client
ad936f42+71-13
net: extended THttpRequestExtendedOptions to include the timeouts
影响
Delphi 与 FPC 应用可分别配置请求各阶段,已有的全零 record 仍通过 CreateTimeoutMS 与 backend 默认值回退。
值得一看
公开 API
THttpRequestExtendedOptions.ConnectTimeoutMSaddedTHttpRequestExtendedOptions.SendTimeoutMSaddedTHttpRequestExtendedOptions.ReceiveTimeoutMSaddedTHttpRequestExtendedOptions.GetTimeoutsadded
14
中
REST socket 客户端统一应用分阶段超时
TRestHttpClientSocket 将超时保存到 fExtendedOptions,在连接前通过 OpenOptions 传递,并在判断 socket 是否可复用时比较这些值。TCrtSocket getter 现在仅在阶段值为 0 时使用 TimeOut。
新功能interp
mormot.net.sock+1
50ade795+46-36
rest: properly use new THttpClientSocket timeouts
影响
REST 客户端可在重连过程中保持不同的连接、发送和接收策略。在最终实现中,活动 TCrtSocket 的负阶段值不再选择旧超时回退。
值得一看
请用 0 表示旧超时回退,并测试配置分阶段超时后的重连行为。
15
中
REST SSPI 认证可选择 POSIX keytab
在 POSIX 上,TRestServerAuthenticationSspi 新增由 TServerSspiKeyTab 支持的 KeyTab 属性。设置有效文件会初始化 GSSAPI 凭据,Idle 会刷新已更改的 keytab。
新功能
mormot.rest.server
be652e42+30-2
rest: optional TRestServerAuthenticationSspi.KeyTab support with GSSAPI
影响
POSIX REST 服务器可使用显式且可热刷新的 keytab,不必只依赖默认 GSSAPI 凭据。Windows SSPI 行为不变。
值得一看
公开 API
TRestServerAuthenticationSspi.KeyTabadded — 仅在 POSIX build 中可用。
16
中
REST 客户端在连接前设置超时策略
TRestHttpClientSocket 现在在 Connect 前创建并配置 THttpClientSocket,因此连接、代理和 TLS 建立阶段都会使用指定超时,而不只是后续 I/O。
新功能
mormot.rest.http.client
29dc590a+17-6
rest: enhance TRestHttpClientSocket to use the new timeouts
影响
Delphi 与 FPC backend 的 REST 连接现在可分别控制建连、写入和读取超时。
值得一看
17
中
异步服务器在关闭开始时立即唤醒轮询循环
TAsyncConnections.Destroy 在等待前先将 fSockets 标记为终止,并唤醒 POSIX 读写 poller。相关 HTTP 与代理关闭路径不再等待正常轮询超时。
性能
mormot.net.async+1
2b1b93ae+9-4
net: faster async server shutdown
影响
POSIX 异步服务器和代理客户端应能更快、更可预测地终止。Delphi Windows IOCP build 不使用这些轮询唤醒分支。
建议升级
重新测试 POSIX 服务器关闭延迟,并确认读写 poller 能迅速退出。
18
中
HTTP socket 复用基础 socket 的超时实现
THttpClientSocket 移除重复的超时字段和 setter,改用继承自 TCrtSocket 的超时存储。等待 header 使用 ReceiveTimeout,连接与 TLS 建立使用 ConnectTimeout。
内部重构
mormot.net.client
9a5f322d+47-74
net: THttpClientSocket can directly use the new TCrtSocket timeouts
影响
现有 HTTP 客户端保持相同类接口,但超时读写现在统一使用基础实现。调整超时的应用应测试连接与响应 header 等待。
值得一看
19
低
隧道发送前再次检查 transmit callback
TTunnelLocal.SendFrame 现在在调用 callback 前要求 Assigned(fTransmit),关闭帧路径也同样检查。
修复
mormot.net.tunnel
2ccea1a0+6-5
net: minor hardening of TTunnelLocal.SendFrame
影响
当隧道的 transmit callback 已被清除时,不再调用 nil callback。Delphi 或 FPC 应用代码无需修改。
20
低
跨平台 Negotiate 解析从 HTTP 服务器中提取
首个 ServerSspiAuthHeader 实现从 THttpServerSocketGeneric.Authorization 中提取 Authorization header 解析、Base64 解码、NTLM 拒绝及 SSPI/GSSAPI 响应生成。
新功能
mormot.lib.gssapi+2
9029fa16+59-2
net: new ServerSspiAuthHeader() cross-platform wrapper function
影响
这是同一期中的临时公开名称;最终 API 是 mormot.net.client 中的 KerberosServerAuthHeader。应用不应采用临时名称。
21
低
HTTP Negotiate 授权改用共享 helper
THttpServerSocketGeneric.Authorization 用共享认证 header helper 替换内联 SSPI/GSSAPI 解析,并集中处理 SspiKeyTab 访问器。
内部重构
mormot.net.server
71011fb6+11-48
net: simplified THttpServerSocketGeneric.Authorization NEGOTIATE support
影响
内置 HTTP Negotiate 行为得到统一,应用代码无需修改。Windows 与 POSIX 使用相同的单轮决策路径。
22
低
异步连接 flag 现在准确描述注册状态
内部 TPollAsyncConnectionFlags 值 fInList 重命名为 fRegistered,所有注册、移除和回收检查都改用新名称。
内部重构
mormot.net.async
c7708e55+14-13
net: renamed misleading TPollAsyncConnectionFlags fInList item
影响
公开 API 与运行时行为均不变。该重命名使 Delphi 与 FPC 源码 build 中的连接所有权检查更易审计。
23
低
共享的按 byte 索引 cardinal 表替换局部别名
mormot.core.base 公开 TByteToCardinal,格式化、Unicode、安全、密码学与 HTTP 相关例程统一复用它。PurgeHeaders 读取 header 长度前也改为检查 P,而非陈旧的 h 指针。
内部重构
mormot.core.base+6
066e5953+13-12
core: new TByteToCardinal type definition
影响
除 PurgeHeaders 的小型保护修正外,应用行为不变。需要 256 项 cardinal 查找表的 Delphi 与 FPC 调用者可使用该共享类型。
公开 API
TByteToCardinaladded
24
低
异步关闭测试覆盖空闲、部分与待处理流量
test.net.proto 扩展异步测试,覆盖空闲 socket、部分 header/body、大写入、慢客户端及禁用连接跟踪。TPollSockets.Pending 公开用于断言,TPollAsyncSockets.PollWrite 修正为读取访问器。
测试
mormot.net.async+2
a84c77d1+179-111
test: enhanced async process coverage
影响
测试本身不改变生产行为。此前无法读取 PollWrite 的代码现在可在非 IOCP build 上检查它。
公开 API
TPollSockets.PendingaddedTPollAsyncSockets.PollWritebehaviour-changed — 其访问器由 write fWrite 改为 read fWrite。
25
低
Issue 633 的关闭场景加入回归测试
test.net.proto 加入已报告的异步 HTTP 关闭模式,并验证释放服务器实例时空闲、慢速及待处理客户端都会关闭。
测试
test.net.proto
02bd02a7+96-2
test: include regression code from #633
影响
生产单元与公开 API 不变。该测试在 Delphi 与 FPC 测试运行中保护前述连接泄漏修复。