Требует действийможет затронуть работающую системуПроверены все 14 non-merge commits, один merge исключён. Без mormot.commit.inc и mormot.commit-num.inc итог составляет 569 добавлений и 493 удаления. Проверен финальный исходный код 913a072a26c0305bc468a79b658137de5f7d124b. Ни один commit не содержит superseded_by.
Исправлены привязка массивов 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.
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 пути не изменены.
Рекомендуется обновиться
Берите build 2.4.17367 или новее и проверьте interrupted read, poll с нулевым timeout, бесконечное ожидание и shutdown cancellation на POSIX.
Публичный API
TNetSocketWrap.WaitForbehaviour-changed — Временные ошибки poll расходуют исходный wall-clock timeout, а не запускают его заново.
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.
Рекомендуется обновиться
Обновитесь до build 2.4.17369 и нагрузочно проверьте concurrent Push, WaitFor, завершение pool и сбой enqueue на всех используемых backend.
Модули
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.
Рекомендуется обновиться
Обновитесь до head build 2.4.17369 и проверьте смешанные Update/Add batch и значения с одной или двумя quotes в конце.
Публичный API
BoundArrayToJsonArraybehaviour-changed — Doubled quotes обрабатываются парами без принятия конечной SQL quote за данные.
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.
Рекомендуется обновиться
Обновитесь до build 2.4.17369 и добавьте regression read, где последняя запись точно достигает объявленного размера.
Публичный API
TPipeStream.Readbehaviour-changed — Немедленно возвращает 0 после полного чтения объявленного размера.
Модули
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.
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
TSynThreadEventTaskaddedTSynThreadTasks.Add(Sender, Worker, Count, Tag)addedTSynThreadTask.DoExecutesignature-changed — Видимость меняется с public на protected.
Модули
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.RunTaskaddedTSynTestCase.RunTasksaddedTSynTestCase.WaitTasksaddedTSynTests.Tasksadded
Модули
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.
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 не меняется.
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-поведение не меняются.
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-код приложений не меняется.
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 не меняется.
Модули
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.
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 не меняется.