mORMot2 Daily每日上游提交速读

PostgreSQL 数组绑定与并发等待得到修复

PostgreSQL batch 不再序列化数组的未使用容量,也不会丢失末尾 quote,从而同时修复显式失败与静默值变化。TPipeStream 现在会在达到声明大小时返回 EOF,最终的 POSIX poll 路径则能在 signal 与临时资源耗尽时保持正确 timeout。thread pool 计数改为原子操作,其余提交构建共享 task pool helper 并扩展并发测试。

要点

  • 应采用 build 2.4.17369 的 913a072a26c0305bc468a79b658137de5f7d124b。
  • PostgreSQL bound array 现在遵循 ValuesCount,并保留以一个或多个 quote 结尾的值。
  • 当最后一个 block 恰好结束于声明的 stream 大小时,TPipeStream.Read 不再无限等待。
  • POSIX poll retry 现在保持实际 timeout,并一致处理 EINTR、EAGAIN 与 POLLNVAL。
  • TSynThreadPool 的 pending task 计数改为原子操作,也覆盖 IOCP 入队失败与 waiter wake-up。
  • 新的 TSynThreadTasks 与 TSynTestCase helper 简化了持久共享 test worker 的使用。

升级建议

采用包含 merge 913a072a 的完整 build 2.4.17369。若生产环境使用 PostgreSQL 数组参数、TPipeStream、POSIX socket 或 TSynThreadPool.WaitFor,应尽快升级。请复测混合 external batch、带 quote 的数组值、精确大小的 pipe read、被中断的 socket wait 与并发 pool completion。原始数据没有 superseded_by,因此不声明正式规避范围;不要停留在中间 POSIX build 2.4.17366。

版本号2.4.17356 → 2.4.17369
提交15
行数+615 -528
阅读2 分钟

14 条中的 14 条 · 上游 15 次提交

主题
# 条目 类别 单元
1 高 POSIX poll retry 现在遵守实际 timeout 与临时错误 PollNoEintr 现在单独返回捕获的 errno,对 EINTR 与 EAGAIN 都进行 retry,为 EAGAIN 短暂 sleep,并通过 GetTickCount64 重新计算有限 timeout。TNetSocketWrap.WaitFor、TPollSocketPoll.WaitForModified 与 WaitForSeveral 使用该 helper;前一提交加入 RecvWait 的临时 retry loop 被移除。 修复 mormot.net.sock+1 e2ef363c+48-56

net: properly fixed poll() usage in POSIX

影响

POSIX Delphi 与 FPC server 不会因重复 signal 无限延长 wait,避免 EAGAIN busy loop,并在单 socket 与多 socket polling 中得到一致的 timeout 或 fatal error 结果。Windows 路径未变。

公开 API

  • TNetSocketWrap.WaitForbehaviour-changed — 临时 poll error 消耗原始 wall-clock timeout,而不是重新开始。

Arnaud Bouchez · 14:49 UTC · 在 GitHub 上查看该提交 →

2 高 thread-pool completion 计数不再与 dispatch 或 waiter wake-up 竞争 TSynThreadPool 在向 IOCP 或 worker event 暴露工作前原子递增 fPendingTasks。IocpPostQueuedStatus 失败时回滚两个计数器。新的 TaskDone 执行唯一的原子递减,在归零时唤醒 WaitFor waiter,并在正常与 aborted 完成路径调用 TaskAllDone。 修复 mormot.core.threads 8b5a68ed+29-25

core: fixed some potential races in TSynThreadPool

影响

并发 worker 不会再因 enqueue 增量与 task 递减竞争而丢失 pending 更新或让 WaitFor 过早判定完成。Windows IOCP 提交失败也不会永久遗留 pending work。共享 Pascal 计数修复同样适用于 Delphi 与 FPC 非 IOCP pool。

Arnaud Bouchez · 09:18 UTC · 在 GitHub 上查看该提交 →

3 高 PostgreSQL 数组 batch 不再生成无效 literal 或丢失末尾 quote TSqlDBPostgresStatement.BindParams 在 BoundArrayToJsonArray 序列化前,将本地 VArray copy 截断到 VInt64。BoundArrayToJsonArray 仅在 SQL literal 终止符之前仍有字符时才把两个 quote 视为 escape pair,并在长度与复制阶段同时跳过两者。 修复 mormot.db.sql+1 d91c3a57+20-9

db: fixed PostgreSQL array binding of over-allocated arrays and of trailing quotes

影响

包含多个操作组的 external PostgreSQL batch 不再把未使用数组槽发送为无效连续逗号。以一个或多个 quote 结尾的文本也不会被静默截短。使用 PostgreSQL 数组参数的 Delphi 与 FPC 应用共用此修复路径。

公开 API

  • BoundArrayToJsonArraybehaviour-changed — doubled quote 按 pair 消费,不再把 SQL 结束 quote 当作数据。

Dimitris Kounalakis · 18:45 UTC · 在 GitHub 上查看该提交 →

4 高 精确大小的 pipe read 现在返回 EOF 而非再次等待 TPipeStream.Read 在 reset fCanRead 前检查 fPending、fSize 与 fPosition。当没有剩余 byte 且已达到声明大小时,它以 result 0 退出循环,不再启动下一次等待。 修复 mormot.core.threads 82960cd5+6-2

core: fixed TPipeStream.Read

影响

按大小读取 pipe 直至 EOF 的 consumer,在最后 block 恰好结束于 fSize 时不再挂起。修复位于共享 Pascal 实现,因此同时适用于 Delphi 与 FPC。

公开 API

  • TPipeStream.Readbehaviour-changed — 完全消费声明大小后立即返回 0。

Arnaud Bouchez · 17:58 UTC · 在 GitHub 上查看该提交 →

5 中 POSIX receive wait 可识别无效 descriptor 并重试提前唤醒 TNetSocketWrap.RecvWait 暂时对 nrRetry 循环,并重新计算剩余 POSIX timeout。POSIX event 转换也把 POLLNVAL 映射为 neError 与 pseError。下一提交把 retry 控制移入 PollNoEintr,并移除 RecvWait loop。 修复 mormot.net.sock+1 f3ea20ed+35-19

net: fixed TNetSocketWrap.RecvWait on POSIX

影响

Build 2.4.17366 改善了 POSIX receive wait,但它是随即被更广泛 poll 修复取代的中间实现。POLLNVAL 分类保留在最终代码中;应用应采用后续 head,而不是单独采用此 commit。

公开 API

  • TNetSocketWrap.RecvWaitbehaviour-changed — 该中间 retry loop 被下一提交替换。

Arnaud Bouchez · 13:50 UTC · 在 GitHub 上查看该提交 →

6 中 thread-task pool 可直接调度 TNotifyEvent callback 新的 TSynThreadEventTask 保存 Sender、Worker 与 Tag,并在 DoExecute 中调用 Worker(Sender)。TSynThreadTasks.Add 新增 overload,可分配并排队 Count 个此类 task,并返回接受数量。TSynThreadTask.DoExecute 的可见性从 public 改为 protected。 新功能 mormot.core.threads 6fb9233f+50-4

core: TSynThreadTasks.Add() overload redirecting to a TNotifyEvent

影响

Delphi 与 FPC 代码无需定义 task subclass 即可提交 object-method callback。现有 subclass 仍可 override DoExecute,但直接从外部调用 DoExecute 的代码将因该方法变为 protected 而无法编译。

值得一看

若应用代码直接调用 TSynThreadTask.DoExecute,请移除该调用并通过 TSynThreadTasks.Add 提交 task。新的 callback job 可使用 Sender/Worker overload。

公开 API

  • TSynThreadEventTaskadded
  • TSynThreadTasks.Add(Sender, Worker, Count, Tag)added
  • TSynThreadTask.DoExecutesignature-changed — 可见性从 public 改为 protected。

Arnaud Bouchez · 12:11 UTC · 在 GitHub 上查看该提交 →

7 低 test case 新增共享 task 提交与完成 helper TSynTestCase 围绕延迟创建的 TSynTests.Tasks pool 公开 RunTask、RunTasks 与 WaitTasks。TSynTests.Destroy 在 inherited destruction 后释放该 pool,test runner 在调用每个 case 的 CleanUp 前等待 queued task。额外 trace 记录同步 Run、wait 与 progress。 新功能 mormot.core.test a7ca5495+81-18

core: new TSynTestCase.RunTask/RunTasks/WaitTasks methods

影响

自定义 mormot.core.test suite 可调度重复 TNotifyEvent worker,而无需维护自己的 pool。现有应用 backend 不受影响,除非其基于这些 class 构建自定义测试基础设施。

值得一看

对于自定义并发测试,可考虑用 RunTask、RunTasks 与 WaitTasks 替换每 case pool,并确认 CleanUp 不会在共享 task 完成前释放状态。

公开 API

  • TSynTestCase.RunTaskadded
  • TSynTestCase.RunTasksadded
  • TSynTestCase.WaitTasksadded
  • TSynTests.Tasksadded

Arnaud Bouchez · 12:48 UTC · 在 GitHub 上查看该提交 →

8 低 共享 test task 获得默认 timeout 与平台适配 worker 数 TSynTestCase.WaitTasks 新增 5000 ms 默认值,task log 更明确,TSynTests.Tasks 在创建 TSynThreadTasks 前把初始值 16 交给 ThreadCountAdjust。TSynThreadPool.WaitFor 文档也明确支持并发 waiter。 内部重构 mormot.core.test+1 ba3f2135+16-9

core: refined tests thread pool

影响

自定义 test suite 在 5 秒合适时可省略 timeout,共享 pool 也会遵守 PRISM 等受限 Windows 配置。生产 server 行为未变。

公开 API

  • TSynTestCase.WaitTaskssignature-changed — TimeOutMS 现在默认值为 5000。

Arnaud Bouchez · 13:14 UTC · 在 GitHub 上查看该提交 →

9 低 queue stress test 复用 suite-wide task pool TTestCoreThreads.TSynQueueSlow2 移除私有 TSynThreadTasks instance。push 与 waiter task 通过 Owner.Tasks 提交,完成等待改用 TSynTestCase.WaitTasks,同时各 queue 场景拥有独立 try/finally 生命周期。 测试 f8583177+179-191

tests: refined TTestCoreThreads.TSynQueueSlow2

影响

测试在与其他 cross-thread case 相同的持久 worker 基础设施上执行 queue wake、finalize 与 reset。生产 backend 行为没有变化。

Arnaud Bouchez · 13:16 UTC · 在 GitHub 上查看该提交 →

10 低 cross-thread 测试迁移到单一持久 task pool TTestCoreThreads 在 Setup 中创建一个 TSynThreadTasks,在 CleanUp 中先于 event state 释放,并以 Add 与 WaitFor 替换 TLoggedWorker dispatch。lock、read-write lock、TSynQueue 与 TSynEvent 测试都向该 pool 提交任务,WorkerCount 还经过 ThreadCountAdjust。 测试 feb9bf67+52-58

test: persistent task pool shared by all cross-thread tests

影响

测试套件用稳定 worker 验证 queue 复用与任务完成,而不是反复创建后台 thread。生产 backend 代码与公开 runtime 行为未变。

Arnaud Bouchez · 12:13 UTC · 在 GitHub 上查看该提交 →

11 低 queue wake-up 测试改用 pool completion 而非手动计数器 TTestCoreThreads.TSynQueueSlow2 移除 Done pointer、原子 done counter 与轮询 WaitForTasks loop。TSynQueuePushTask 与 TSynQueueWaitTask 仅执行 queue 操作,完成等待交给 TSynThreadTasks.WaitFor,并加入 task 调度 trace。 测试 e474d85c+42-68

test: rewritten TTestCoreThreads.TSynQueueSlow2

影响

回归测试现在会在检查 TSynQueue wake、finalize 与 reset 行为时,同时覆盖 thread pool 自身的 pending-task 计数。生产应用代码未变。

Arnaud Bouchez · 09:36 UTC · 在 GitHub 上查看该提交 →

12 低 queue 并发测试适配 PRISM 可用 worker 数量 TTestCoreThreads.TSynQueueSlow2 从 Owner.Tasks.WorkThreadCount 获取 waiters,并把固定结果数组上限设为 8。所有 loop 与 mask 都使用 runtime 数量。TSynTests.Tasks 还记录 pool class 与实际 worker 数。 测试 mormot.core.test 1fc7cd6e+26-24

test: fixed threads adaptation on PRISM

影响

thread test suite 在 Windows ARM PRISM 上不再假定有 8 个 worker;该环境的 pool 可能只有 4 个。生产 Delphi 与 FPC 应用代码未变。

Arnaud Bouchez · 13:25 UTC · 在 GitHub 上查看该提交 →

13 低 core thread 测试从私有 pool 切换到共享 test pool TTestCoreThreads 移除 fTasks 字段、Setup 分配、CleanUp 释放,以及本地 RunTask、RunTasks、WaitTasks wrapper。现有测试调用改为解析到 TSynTestCase 继承 helper,因此使用 TSynTests.Tasks。 测试 ac230852+2-28

test: let TTestCoreThreads use new sharead thread pool

影响

并发测试为整个 suite 复用一个持久 pool,避免反复创建 worker。该测试迁移不改变 Delphi 或 FPC 生产应用 API。

Arnaud Bouchez · 12:49 UTC · 在 GitHub 上查看该提交 →

14 低 peer-cache 测试会等待 HTTP listener 完成绑定 TNetworkProtocols.RunPeerCacheDirect 在设置 OnRequest 后、发出 direct-resource 请求前调用 localserver.WaitStarted。其余改动仅修正 huge-content 测试缩进与 mormot.net.sock.posix 注释。 测试 mormot.net.sock.posix aa663674+9-8

test: fixed TNetworkProtocols.RunPeerCacheDirect HTTP server startup

影响

该测试在较慢 host 上不再与 port 8889 启动竞争。Delphi 或 FPC backend 的应用代码没有 runtime 变化。

Arnaud Bouchez · 15:00 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