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

Исправлены привязка массивов PostgreSQL и конкурентное ожидание

PostgreSQL batch больше не сериализует неиспользованную ёмкость массивов и не теряет конечные quotes, устраняя явный сбой и тихое изменение данных. TPipeStream теперь возвращает EOF при достижении объявленного размера, а финальный POSIX poll сохраняет timeout при сигналах и временной нехватке ресурсов. Учёт thread pool стал атомарным; остальные commits добавляют общий task pool и расширяют конкурентные тесты.

Коротко

  • Переходите на build 2.4.17369 в 913a072a26c0305bc468a79b658137de5f7d124b.
  • Связанные массивы PostgreSQL теперь учитывают ValuesCount и сохраняют значения с одной или несколькими quotes в конце.
  • TPipeStream.Read больше не ждёт бесконечно, когда последний block заканчивается точно на объявленном размере stream.
  • Повторы POSIX poll сохраняют фактический timeout и единообразно обрабатывают EINTR, EAGAIN и POLLNVAL.
  • Учёт pending task в TSynThreadPool стал атомарным, включая сбой постановки в IOCP и wake-up ожидающих потоков.
  • Новые helpers TSynThreadTasks и TSynTestCase упрощают постоянные общие test workers.

Рекомендации по обновлению

Берите полный head build 2.4.17369, включая merge 913a072a. Обновляйтесь быстро, если production использует массивы PostgreSQL, TPipeStream, POSIX socket или TSynThreadPool.WaitFor. Проверьте смешанные external batch, значения с quotes, чтение pipe точного размера, прерванные socket wait и конкурентное завершение pool. В raw данных нет superseded_by, поэтому формальный avoid range не заявлен; не оставайтесь на промежуточном POSIX build 2.4.17366.

Сборка2.4.17356 → 2.4.17369
Коммиты15
Строки+615 -528
Чтение4 мин

14 из 14 записей · 15 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий Повторы POSIX poll учитывают реальный timeout и временные ошибки PollNoEintr отдельно возвращает errno, повторяет EINTR и EAGAIN, кратко спит при EAGAIN и пересчитывает конечный timeout по GetTickCount64. Helper используется в TNetSocketWrap.WaitFor, TPollSocketPoll.WaitForModified и WaitForSeveral. Временный retry loop из предыдущего RecvWait удалён. Исправления mormot.net.sock+1 e2ef363c+48-56

net: properly fixed poll() usage in POSIX

Влияние

POSIX серверы Delphi и FPC больше не продлевают ожидание бесконечно после сигналов, избегают busy loop при EAGAIN и получают единые timeout или fatal-error результаты для одного и нескольких sockets. Windows пути не изменены.

Публичный API

  • TNetSocketWrap.WaitForbehaviour-changed — Временные ошибки poll расходуют исходный wall-clock timeout, а не запускают его заново.

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

2 Высокий Счётчики завершения thread pool больше не гоняются с dispatch и wake-up TSynThreadPool атомарно увеличивает fPendingTasks до передачи работы IOCP или worker event. При сбое IocpPostQueuedStatus оба счётчика откатываются. Новый TaskDone выполняет единое атомарное уменьшение, будит WaitFor waiters при нуле и вызывает TaskAllDone для обычного и aborted завершения. Исправления mormot.core.threads 8b5a68ed+29-25

core: fixed some potential races in TSynThreadPool

Влияние

Конкурентные workers больше не теряют обновления pending и не позволяют WaitFor увидеть преждевременное завершение из-за гонки enqueue с decrement. Сбой Windows IOCP не оставляет pending work навсегда. Общая Pascal-правка действует и для non-IOCP pool Delphi и FPC.

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

3 Высокий Массивы PostgreSQL больше не создают неверные literals и не теряют конечные quotes TSqlDBPostgresStatement.BindParams обрезает локальную копию VArray до VInt64 перед сериализацией BoundArrayToJsonArray. BoundArrayToJsonArray считает две quotes экранированной парой только до последнего разделителя SQL literal и пропускает оба символа при подсчёте и копировании. Исправления mormot.db.sql+1 d91c3a57+20-9

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

Влияние

External PostgreSQL batch с несколькими группами операций больше не отправляет неиспользованные элементы как неверные цепочки запятых. Текст с quote или несколькими quotes в конце больше тихо не сокращается. Путь общий для Delphi и FPC приложений с массивами PostgreSQL.

Публичный API

  • BoundArrayToJsonArraybehaviour-changed — Doubled quotes обрабатываются парами без принятия конечной SQL quote за данные.

Dimitris Kounalakis · 18:45 UTC · открыть коммит на GitHub →

4 Высокий Чтение pipe точного размера возвращает EOF вместо нового ожидания TPipeStream.Read проверяет fPending, fSize и fPosition до сброса fCanRead. Когда байтов не осталось и объявленный размер достигнут, цикл завершается с result 0 без нового ожидания. Исправления mormot.core.threads 82960cd5+6-2

core: fixed TPipeStream.Read

Влияние

Чтение sized pipe до EOF больше не зависает, когда последний block заканчивается точно на fSize. Исправление находится в общей Pascal реализации и действует для Delphi и FPC.

Публичный API

  • TPipeStream.Readbehaviour-changed — Немедленно возвращает 0 после полного чтения объявленного размера.

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

5 Средний POSIX receive wait распознаёт неверные descriptors и повторяет раннее пробуждение TNetSocketWrap.RecvWait временно повторяет nrRetry с пересчётом оставшегося POSIX timeout. Преобразование событий POSIX также отображает POLLNVAL в neError и pseError. Следующий commit переносит retry в PollNoEintr и удаляет цикл RecvWait. Исправления 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 заменён следующим commit.

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

6 Средний Thread-task pool может напрямую выполнять callback TNotifyEvent Новый TSynThreadEventTask хранит Sender, Worker и Tag и вызывает Worker(Sender) из DoExecute. TSynThreadTasks.Add получает overload, создающий и ставящий в очередь Count tasks и возвращающий принятое число. Видимость TSynThreadTask.DoExecute меняется с public на protected. Новые возможности mormot.core.threads 6fb9233f+50-4

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

Влияние

Код Delphi и FPC может отправлять callback метода объекта без отдельного task subclass. Существующие subclasses по-прежнему override DoExecute, но внешний прямой вызов больше не компилируется, поскольку метод стал protected.

Стоит взглянуть

Если код напрямую вызывает TSynThreadTask.DoExecute, удалите вызов и отправляйте task через TSynThreadTasks.Add. Новые callback jobs могут использовать overload Sender/Worker.

Публичный API

  • TSynThreadEventTaskadded
  • TSynThreadTasks.Add(Sender, Worker, Count, Tag)added
  • TSynThreadTask.DoExecutesignature-changed — Видимость меняется с public на protected.

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

7 Низкий Test cases получили helpers общего запуска и завершения tasks TSynTestCase публикует RunTask, RunTasks и WaitTasks поверх лениво создаваемого pool TSynTests.Tasks. TSynTests.Destroy освобождает pool после inherited destruction, а runner ждёт queued tasks до CleanUp каждого case. Дополнительный trace записывает синхронные Run, ожидания и progress. Новые возможности mormot.core.test a7ca5495+81-18

core: new TSynTestCase.RunTask/RunTasks/WaitTasks methods

Влияние

Пользовательские suites mormot.core.test могут запускать повторные TNotifyEvent workers без собственного pool. Существующие backend не затронуты, если не строят свою тестовую инфраструктуру на этих классах.

Стоит взглянуть

Для пользовательских конкурентных тестов можно заменить pool каждого case на RunTask, RunTasks и WaitTasks; проверьте, что CleanUp не освобождает состояние до завершения общих tasks.

Публичный API

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

Модули

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

8 Низкий Общие test tasks получили default timeout и адаптированное число workers TSynTestCase.WaitTasks получает default 5000 мс, сообщения task log уточняются, а TSynTests.Tasks пропускает начальные 16 через ThreadCountAdjust до создания TSynThreadTasks. Документация TSynThreadPool.WaitFor теперь заявляет поддержку конкурентных waiters. Внутреннее устройство mormot.core.test+1 ba3f2135+16-9

core: refined tests thread pool

Влияние

Пользовательские test suites могут не указывать timeout, если подходят пять секунд, а общий pool учитывает ограниченные Windows-конфигурации вроде PRISM. Поведение production server не меняется.

Публичный API

  • TSynTestCase.WaitTaskssignature-changed — TimeOutMS теперь по умолчанию равен 5000.

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

9 Низкий Stress-тесты queue используют общий task pool набора TTestCoreThreads.TSynQueueSlow2 удаляет частный TSynThreadTasks. Push и waiter tasks отправляются через Owner.Tasks, завершение ждёт TSynTestCase.WaitTasks, а сценарии queue разделены по отдельным try/finally. Тесты f8583177+179-191

tests: refined TTestCoreThreads.TSynQueueSlow2

Влияние

Тесты выполняют queue wake, finalize и reset на той же постоянной worker-инфраструктуре, что и остальные cross-thread cases. Поведение production backend не меняется.

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

10 Низкий Cross-thread tests переходят на постоянный task pool TTestCoreThreads создаёт один TSynThreadTasks в Setup, освобождает его до events в CleanUp и заменяет dispatch TLoggedWorker на Add и WaitFor. Тесты lock, read-write lock, TSynQueue и TSynEvent отправляют работу в этот pool; WorkerCount проходит ThreadCountAdjust. Тесты feb9bf67+52-58

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

Влияние

Набор тестов проверяет повторное использование queue и завершение на постоянных workers вместо повторного создания threads. Production backend и публичное runtime-поведение не меняются.

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

11 Низкий Тесты queue wake-up используют завершение pool вместо ручных счётчиков TTestCoreThreads.TSynQueueSlow2 удаляет Done pointers, атомарные счётчики done и polling loop WaitForTasks. TSynQueuePushTask и TSynQueueWaitTask выполняют только операции queue, завершение обеспечивает TSynThreadTasks.WaitFor, а trace показывает планирование tasks. Тесты e474d85c+42-68

test: rewritten TTestCoreThreads.TSynQueueSlow2

Влияние

Regression test теперь проверяет собственный учёт pending task thread pool вместе с wake, finalize и reset TSynQueue. Production-код приложений не меняется.

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

12 Низкий Конкурентные тесты queue учитывают число workers в PRISM TTestCoreThreads.TSynQueueSlow2 берёт waiters из Owner.Tasks.WorkThreadCount и ограничивает фиксированные массивы восемью элементами. Все циклы и masks используют runtime-число. TSynTests.Tasks также пишет класс pool и реальное число workers. Тесты mormot.core.test 1fc7cd6e+26-24

test: fixed threads adaptation on PRISM

Влияние

Thread test suite больше не предполагает восемь workers в Windows ARM PRISM, где pool может иметь четыре. Production-код Delphi и FPC не меняется.

Модули

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

13 Низкий Core thread tests переходят с частного pool на общий test pool TTestCoreThreads удаляет поле fTasks, создание в Setup, освобождение в CleanUp и локальные wrappers RunTask, RunTasks и WaitTasks. Существующие вызовы используют унаследованные helpers TSynTestCase и TSynTests.Tasks. Тесты ac230852+2-28

test: let TTestCoreThreads use new sharead thread pool

Влияние

Конкурентные тесты используют один постоянный pool для всего набора и не создают workers повторно. Миграция тестов не меняет production API приложений Delphi или FPC.

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

14 Низкий Тесты peer-cache ждут привязки HTTP listener TNetworkProtocols.RunPeerCacheDirect вызывает localserver.WaitStarted после назначения OnRequest и до direct-resource запросов. Остальные изменения исправляют только отступы huge-content теста и комментарий в mormot.net.sock.posix. Тесты mormot.net.sock.posix aa663674+9-8

test: fixed TNetworkProtocols.RunPeerCacheDirect HTTP server startup

Влияние

Тест больше не соревнуется с запуском порта 8889 на медленных hosts. Runtime-код приложений Delphi и FPC не меняется.

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