mORMot2 DailyLecture quotidienne des commits upstream

Le binding des tableaux PostgreSQL et les attentes concurrentes sont réparés

Les batches PostgreSQL ne sérialisent plus la capacité inutilisée des tableaux et ne perdent plus les quotes finales, ce qui ferme un échec explicite et une altération silencieuse des valeurs. TPipeStream renvoie maintenant EOF à sa taille déclarée, tandis que le chemin POSIX poll final conserve les timeouts malgré les signaux et l’épuisement temporaire des ressources. Le comptage du thread pool devient atomique ; le reste du lot construit des helpers de task pool partagé et renforce les tests de concurrence.

En bref

  • Visez la build 2.4.17369 au commit 913a072a26c0305bc468a79b658137de5f7d124b.
  • Les tableaux liés PostgreSQL respectent maintenant ValuesCount et conservent les valeurs finissant par une ou plusieurs quotes.
  • TPipeStream.Read n’attend plus indéfiniment quand le dernier bloc finit exactement à la taille déclarée du stream.
  • Les retries POSIX poll conservent le timeout réel et traitent EINTR, EAGAIN et POLLNVAL de façon cohérente.
  • Le comptage des tâches pending de TSynThreadPool devient atomique, y compris après un échec IOCP et pour le wake-up des waiters.
  • De nouveaux helpers TSynThreadTasks et TSynTestCase simplifient les workers de test partagés et persistants.

Conseil de mise à jour

Prenez la tête complète en build 2.4.17369, merge 913a072a inclus. Mettez à jour rapidement si la production utilise les paramètres tableau PostgreSQL, TPipeStream, les sockets POSIX ou TSynThreadPool.WaitFor. Retestez les batches externes mixtes, les valeurs avec quotes, les lectures pipe de taille exacte, les attentes socket interrompues et la fin concurrente du pool. Aucun superseded_by n’est présent, donc aucune plage formelle n’est déclarée ; ne vous arrêtez pas à la build POSIX intermédiaire 2.4.17366.

Build2.4.17356 → 2.4.17369
Commits15
Lignes+615 -528
Lecture5 min

14 sur 14 entrées · 15 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Les retries POSIX poll respectent les vrais timeouts et erreurs transitoires PollNoEintr renvoie maintenant errno séparément, relance sur EINTR et EAGAIN, attend brièvement pour EAGAIN et recalcule les timeouts finis avec GetTickCount64. TNetSocketWrap.WaitFor, TPollSocketPoll.WaitForModified et WaitForSeveral utilisent ce helper. La boucle temporaire ajoutée à RecvWait au commit précédent est supprimée. Correctifs mormot.net.sock+1 e2ef363c+48-56

net: properly fixed poll() usage in POSIX

Impact

Les serveurs POSIX Delphi et FPC n’allongent plus indéfiniment les attentes après des signaux répétés, évitent la boucle active sur EAGAIN et reçoivent des résultats timeout ou erreur fatale cohérents pour un ou plusieurs sockets. Les chemins Windows ne changent pas.

API publique

  • TNetSocketWrap.WaitForbehaviour-changed — Les erreurs poll transitoires consomment le timeout réel initial au lieu de le redémarrer.

Arnaud Bouchez · 14:49 UTC · voir le commit sur GitHub →

2 Élevée Les compteurs de fin du thread pool ne courent plus avec le dispatch et les wake-ups TSynThreadPool incrémente fPendingTasks atomiquement avant d’exposer le travail à IOCP ou aux events des workers. Un échec IocpPostQueuedStatus annule les deux compteurs. Le nouveau TaskDone effectue l’unique décrément atomique, réveille les waiters WaitFor à zéro puis appelle TaskAllDone pour la fin normale et abortée. Correctifs mormot.core.threads 8b5a68ed+29-25

core: fixed some potential races in TSynThreadPool

Impact

Les workers concurrents ne perdent plus les mises à jour pending et WaitFor ne voit plus une fin prématurée due à la course entre enqueue et décrément. Un échec IOCP Windows ne laisse plus du travail compté indéfiniment. Le correctif Pascal partagé concerne aussi les pools non-IOCP Delphi et FPC.

Arnaud Bouchez · 09:18 UTC · voir le commit sur GitHub →

3 Élevée Les tableaux PostgreSQL n’émettent plus de littéraux invalides et gardent les quotes finales TSqlDBPostgresStatement.BindParams tronque sa copie locale de VArray à VInt64 avant la sérialisation par BoundArrayToJsonArray. BoundArrayToJsonArray ne traite deux quotes comme une paire échappée que s’il reste davantage que le délimiteur SQL, puis avance sur les deux caractères dans ses passes de taille et de copie. Correctifs mormot.db.sql+1 d91c3a57+20-9

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

Impact

Les batches PostgreSQL externes avec plusieurs groupes d’opérations n’envoient plus les slots inutilisés comme des suites de virgules invalides. Les textes finissant par une ou plusieurs quotes ne sont plus tronqués silencieusement. Les applications Delphi et FPC utilisant les paramètres tableau PostgreSQL partagent ce chemin corrigé.

API publique

  • BoundArrayToJsonArraybehaviour-changed — Les quotes doublées sont consommées par paires sans confondre la quote SQL finale avec les données.

Dimitris Kounalakis · 18:45 UTC · voir le commit sur GitHub →

4 Élevée Les lectures pipe de taille exacte renvoient EOF au lieu d’attendre encore TPipeStream.Read vérifie fPending, fSize et fPosition avant de réinitialiser fCanRead. Quand aucun octet ne reste et que la taille déclarée est atteinte, la boucle se termine avec result 0 sans armer une nouvelle attente. Correctifs mormot.core.threads 82960cd5+6-2

core: fixed TPipeStream.Read

Impact

Les consommateurs lisant un pipe dimensionné jusqu’à EOF ne bloquent plus lorsque le dernier bloc finit exactement sur fSize. Le correctif concerne Delphi et FPC car il se trouve dans l’implémentation Pascal partagée.

API publique

  • TPipeStream.Readbehaviour-changed — Renvoie immédiatement 0 après consommation complète de la taille déclarée.

Arnaud Bouchez · 17:58 UTC · voir le commit sur GitHub →

5 Moyenne Les attentes POSIX reconnaissent les descripteurs invalides et relancent les réveils précoces TNetSocketWrap.RecvWait boucle temporairement sur nrRetry en recalculant le timeout POSIX restant. La traduction des events POSIX mappe aussi POLLNVAL vers neError et pseError. Le commit suivant déplace les retries dans PollNoEintr et retire la boucle de RecvWait. Correctifs mormot.net.sock+1 f3ea20ed+35-19

net: fixed TNetSocketWrap.RecvWait on POSIX

Impact

La build 2.4.17366 améliorait les attentes POSIX mais constituait une implémentation intermédiaire immédiatement remplacée par le correctif poll global. La classification POLLNVAL reste dans le code final ; il faut prendre la tête ultérieure plutôt que ce commit seul.

API publique

  • TNetSocketWrap.RecvWaitbehaviour-changed — Cette boucle de retry intermédiaire est remplacée par le commit suivant.

Arnaud Bouchez · 13:50 UTC · voir le commit sur GitHub →

6 Moyenne Les thread-task pools peuvent exécuter directement des callbacks TNotifyEvent Le nouveau TSynThreadEventTask stocke Sender, Worker et Tag puis appelle Worker(Sender) dans DoExecute. TSynThreadTasks.Add gagne une surcharge qui alloue et met en file Count tâches et renvoie le nombre accepté. TSynThreadTask.DoExecute passe de la visibilité public à protected. Nouveautés mormot.core.threads 6fb9233f+50-4

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

Impact

Le code Delphi et FPC peut soumettre des callbacks de méthode objet sans définir de sous-classe de tâche. Les sous-classes continuent d’override DoExecute, mais un appel externe direct ne compile plus car la méthode est protected.

À regarder

Si le code appelle TSynThreadTask.DoExecute directement, supprimez cet appel et soumettez la tâche via TSynThreadTasks.Add. Les nouveaux callbacks peuvent utiliser la surcharge Sender/Worker.

API publique

  • TSynThreadEventTaskadded
  • TSynThreadTasks.Add(Sender, Worker, Count, Tag)added
  • TSynThreadTask.DoExecutesignature-changed — La visibilité passe de public à protected.

Arnaud Bouchez · 12:11 UTC · voir le commit sur GitHub →

7 Faible Les cas de test gagnent des helpers partagés de soumission et de fin TSynTestCase publie RunTask, RunTasks et WaitTasks autour d’un pool TSynTests.Tasks créé à la demande. TSynTests.Destroy libère ce pool après la destruction héritée et le runner attend les tâches en file avant CleanUp de chaque cas. Des traces supplémentaires enregistrent les Run synchrones, attentes et progressions. Nouveautés mormot.core.test a7ca5495+81-18

core: new TSynTestCase.RunTask/RunTasks/WaitTasks methods

Impact

Les suites personnalisées mormot.core.test peuvent planifier plusieurs workers TNotifyEvent sans maintenir leur propre pool. Les backends applicatifs existants ne sont pas affectés sauf s’ils construisent une infrastructure de test sur ces classes.

À regarder

Pour les tests concurrents personnalisés, envisagez de remplacer les pools par cas par RunTask, RunTasks et WaitTasks, puis vérifiez que CleanUp ne libère pas l’état avant la fin des tâches partagées.

API publique

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

Arnaud Bouchez · 12:48 UTC · voir le commit sur GitHub →

8 Faible Les tâches de test partagées gagnent un timeout par défaut et un nombre de workers adapté TSynTestCase.WaitTasks gagne une valeur par défaut de 5 000 ms, les logs de tâches deviennent plus explicites et TSynTests.Tasks passe son compte initial de 16 à ThreadCountAdjust avant de construire TSynThreadTasks. La documentation de TSynThreadPool.WaitFor précise le support des waiters concurrents. Sous le capot mormot.core.test+1 ba3f2135+16-9

core: refined tests thread pool

Impact

Les suites de tests personnalisées peuvent omettre le timeout si cinq secondes conviennent, et leur pool partagé respecte les configurations Windows contraintes comme PRISM. Le comportement des serveurs de production ne change pas.

API publique

  • TSynTestCase.WaitTaskssignature-changed — TimeOutMS vaut maintenant 5000 par défaut.

Arnaud Bouchez · 13:14 UTC · voir le commit sur GitHub →

9 Faible Les stress tests de queue réutilisent le task pool de la suite TTestCoreThreads.TSynQueueSlow2 supprime son instance TSynThreadTasks privée. Les tâches push et waiter passent par Owner.Tasks, la fin utilise TSynTestCase.WaitTasks et les scénarios de queue sont séparés dans des blocs try/finally distincts. Tests f8583177+179-191

tests: refined TTestCoreThreads.TSynQueueSlow2

Impact

Les tests exercent les opérations wake, finalize et reset de queue sur la même infrastructure persistante que les autres cas cross-thread. Aucun comportement du backend de production ne change.

Arnaud Bouchez · 13:16 UTC · voir le commit sur GitHub →

10 Faible Les tests cross-thread passent sur un task pool persistant TTestCoreThreads crée un TSynThreadTasks unique dans Setup, le libère avant les events dans CleanUp et remplace TLoggedWorker par Add et WaitFor. Les tests de locks, read-write locks, TSynQueue et TSynEvent soumettent leur travail à ce pool, avec ThreadCountAdjust sur WorkerCount. Tests feb9bf67+52-58

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

Impact

La suite valide la réutilisation de queue et la fin des tâches avec des workers stables au lieu de recréer des threads. Le code backend de production et le comportement runtime public ne changent pas.

Arnaud Bouchez · 12:13 UTC · voir le commit sur GitHub →

11 Faible Les tests de wake-up utilisent la fin du pool plutôt que des compteurs manuels TTestCoreThreads.TSynQueueSlow2 supprime les pointeurs Done, compteurs atomiques done et la boucle de polling WaitForTasks. TSynQueuePushTask et TSynQueueWaitTask n’exécutent plus que leurs opérations de queue ; TSynThreadTasks.WaitFor fournit la fin et des traces exposent la planification. Tests e474d85c+42-68

test: rewritten TTestCoreThreads.TSynQueueSlow2

Impact

Le test de régression exerce désormais le comptage pending propre au thread pool tout en vérifiant wake, finalize et reset de TSynQueue. Le code applicatif de production ne change pas.

Arnaud Bouchez · 09:36 UTC · voir le commit sur GitHub →

12 Faible Les tests concurrents de queue s’adaptent aux workers disponibles sous PRISM TTestCoreThreads.TSynQueueSlow2 déduit waiters de Owner.Tasks.WorkThreadCount et limite à huit les tableaux de résultats fixes. Toutes les boucles et masks utilisent ce nombre runtime. TSynTests.Tasks journalise aussi la classe du pool et le nombre réel de workers. Tests mormot.core.test 1fc7cd6e+26-24

test: fixed threads adaptation on PRISM

Impact

La suite de tests thread ne suppose plus huit workers sous Windows ARM PRISM, où le pool peut n’en exposer que quatre. Le code applicatif Delphi et FPC de production ne change pas.

Arnaud Bouchez · 13:25 UTC · voir le commit sur GitHub →

13 Faible Les tests thread passent d’un pool privé au pool de test partagé TTestCoreThreads supprime son champ fTasks, son allocation dans Setup, sa libération dans CleanUp et ses wrappers locaux RunTask, RunTasks et WaitTasks. Les appels existants utilisent désormais les helpers hérités de TSynTestCase et donc TSynTests.Tasks. Tests ac230852+2-28

test: let TTestCoreThreads use new sharead thread pool

Impact

Les tests concurrents réutilisent un pool persistant pour toute la suite et évitent de recréer les workers. Cette migration de test ne modifie aucune API applicative de production Delphi ou FPC.

Arnaud Bouchez · 12:49 UTC · voir le commit sur GitHub →

14 Faible Les tests peer-cache attendent que leur listener HTTP soit lié TNetworkProtocols.RunPeerCacheDirect appelle localserver.WaitStarted après l’affectation de OnRequest et avant les requêtes direct-resource. Les autres changements corrigent seulement l’indentation du test huge-content et un commentaire dans mormot.net.sock.posix. Tests mormot.net.sock.posix aa663674+9-8

test: fixed TNetworkProtocols.RunPeerCacheDirect HTTP server startup

Impact

Le test n’entre plus en course avec le démarrage du port 8889 sur les machines lentes. Aucun changement runtime ne concerne le code applicatif Delphi ou FPC.

Arnaud Bouchez · 15:00 UTC · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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