Agir maintenantpeut affecter un système en productionLes 14 commits non-merge ont été examinés et un merge exclu. Le total est de 569 ajouts et 493 suppressions hors mormot.commit.inc et mormot.commit-num.inc. La source finale en 913a072a26c0305bc468a79b658137de5f7d124b a été inspectée. Aucun commit ne contient superseded_by.
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.
14 sur 14 entrées · 15 commits upstream
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.
Mise à jour recommandée
Prenez la build 2.4.17367 ou ultérieure et retestez les lectures interrompues, poll à timeout zéro, attentes infinies et annulations de shutdown sous POSIX.
API publique
TNetSocketWrap.WaitForbehaviour-changed — Les erreurs poll transitoires consomment le timeout réel initial au lieu de le redémarrer.
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.
Mise à jour recommandée
Passez à la build 2.4.17369 et stressez Push concurrent, WaitFor, la terminaison du pool et les échecs d’enqueue sur chaque backend déployé.
Unités
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é.
Mise à jour recommandée
Passez à la tête 2.4.17369 et retestez les batches mixtes Update/Add ainsi que les valeurs finissant par une et deux quotes.
API publique
BoundArrayToJsonArraybehaviour-changed — Les quotes doublées sont consommées par paires sans confondre la quote SQL finale avec les données.
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.
Mise à jour recommandée
Passez à la build 2.4.17369 et ajoutez une lecture de régression dont la dernière écriture atteint exactement la taille déclarée.
API publique
TPipeStream.Readbehaviour-changed — Renvoie immédiatement 0 après consommation complète de la taille déclarée.
Unités
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.
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
TSynThreadEventTaskaddedTSynThreadTasks.Add(Sender, Worker, Count, Tag)addedTSynThreadTask.DoExecutesignature-changed — La visibilité passe de public à protected.
Unités
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.RunTaskaddedTSynTestCase.RunTasksaddedTSynTestCase.WaitTasksaddedTSynTests.Tasksadded
Unités
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.
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.
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.
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.
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.
Unités
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.
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.