mORMot2 DailyLecture quotidienne des commits upstream

Les verrous de tunnel et certificats se stabilisent au build 16672

Cette série corrige des interblocages et des courses dans les relais de tunnel, les chaînes de certificats, la recherche de fuseau horaire et l'arrêt du pool de threads POSIX. Elle remplace aussi le point d'extension public TWebSocketProtocol.SetSubprotocol : les sous-classes WebSocket personnalisées nécessitent donc une modification du code source. Les utilisateurs des tunnels et de Zstandard doivent prendre le build final plutôt qu'une révision intermédiaire.

En bref

  • Adoptez 2.4.16672 : la synchronisation des tunnels évolue jusqu'au dernier commit, après des correctifs BSD et Delphi.
  • Les sous-classes personnalisées de TWebSocketProtocol doivent remplacer SetSubprotocol par IsSubprotocol et, si une configuration est nécessaire, SetName.
  • TEccCertificateChain.ValidateItems ne se verrouille plus lui-même ; les appelants doivent le sérialiser, tandis que SaveToBinary prend désormais un verrou en écriture.
  • Sous POSIX, TSynThreadPool utilise maintenant une file circulaire O(1) et un arrêt qui rejette ou annule proprement les contextes.
  • Les appels concurrents à TAlgoZstd créent des contextes temporaires au lieu d'attendre un unique contexte partagé ; l'unité reste explicitement inachevée.

Conseil de mise à jour

Utilisez le build 2.4.16672 pour les tunnels, le pool de threads POSIX, les chaînes de certificats ECC ou Zstandard. Ne vous arrêtez pas au milieu de la série concernant les tunnels. Avant de reconstruire, recherchez SetSubprotocol dans les protocoles WebSocket personnalisés et les appels concurrents à ValidateItems dans les traitements de certificats.

Build2.4.16652 → 2.4.16672
Commits20
Lignes+1559 -296
Lecture7 min

20 sur 20 entrées · 20 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Les callbacks de tunnel sont libérés hors des verrous de relais et de session Dans mormot.net.tunnel, TTunnelList dérive désormais de TSynPersistent et possède un TRWLightLock dédié nommé fSessionSafe. La nouvelle méthode Extract retire un ITunnelTransmit tout en conservant une référence locale ; Delete et TTunnelRelay.ConsoleDelete libèrent cette référence après avoir quitté le verrou. ConsoleTunnelSend invoque également le callback distant hors de fConsoleSafe. Ruptures mormot.net.tunnel aef05e96+70-41

net: some Tunnel logic fixes

Impact

La fermeture des tunnels et la livraison des trames n'exécutent plus de finaliseur d'interface ni de code distant sous les verrous partagés du relais, ce qui réduit les risques d'interblocage et de réentrance. Le code qui dérive de TTunnelList ou utilise sa propriété Safe héritée ne compile plus, car la classe de base a changé.

À regarder

Adoptez le build 2.4.16672, puis recherchez les sous-classes de TTunnelList et les accès à .Safe avant de reconstruire les services de tunnel.

API publique

  • TTunnelListsignature-changed — Sa classe de base passe de TObjectRWLightLock à TSynPersistent ; l'interface Safe héritée disparaît.
  • TTunnelList.Extractadded — Retire une session et renvoie son ITunnelTransmit afin de le libérer hors du verrou.

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

2 Élevée La sélection WebSocket sépare la reconnaissance de l'initialisation de l'instance TWebSocketProtocol.SetSubprotocol est supprimé. La méthode virtuelle publique IsSubprotocol effectue désormais une reconnaissance sans mutation, tandis que la méthode virtuelle protégée SetName configure l'instance clonée ou sélectionnée via la propriété Name. Les protocoles binaire, relay, client et Engine.IO adoptent cette séparation afin de ne pas modifier le prototype partagé pendant la recherche. Ruptures mormot.net.relay+2 17f74f81+31-25

net: new TWebSocketProtocol.IsSubprotocol/SetName methods

Impact

La négociation du sous-protocole devient thread-safe, car la recherche ne modifie plus un objet de protocole partagé. Toute sous-classe personnalisée qui redéfinit ou appelle SetSubprotocol ne compile plus et doit séparer la reconnaissance de la configuration propre à l'instance.

Migration nécessaire

Remplacez les redéfinitions de SetSubprotocol par IsSubprotocol ; déplacez les changements d'état dans SetName lorsque le nom sélectionné configure le clone.

API publique

  • TWebSocketProtocol.SetSubprotocolremoved — Remplacé par IsSubprotocol pour la reconnaissance et SetName pour la configuration de l'instance.
  • TWebSocketProtocol.IsSubprotocoladded — Méthode virtuelle publique de reconnaissance sans mutation.
  • TWebSocketProtocol.Namebehaviour-changed — L'écriture de Name appelle désormais la méthode virtuelle SetName pour configurer l'instance.

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

3 Élevée La validation de chaîne évite l'interblocage mais doit être sérialisée par l'appelant TEccCertificateChain.ValidateItems supprime son fSafe.ReadLock englobant, car chaque appel imbriqué à IsValid prend lui-même le verrou de la chaîne et pouvait provoquer un interblocage. Sa documentation publique indique désormais explicitement que ValidateItems n'est pas thread-safe et doit être exécuté après le chargement. Ruptures mormot.crypt.ecc fbb6f6dc+7-10

crypt: fixed potential deadlock in TEccCertificateChain.ValidateItems

Impact

La validation ne s'interbloque plus elle-même, mais une mutation concurrente ou un autre appel à ValidateItems peut entrer en course avec le parcours non protégé de fItems. Les backends qui rechargent et valident une chaîne en parallèle doivent sérialiser cette méthode extérieurement.

Migration nécessaire

Recherchez ValidateItems et assurez-vous qu'il ne chevauche pas le chargement de la chaîne, les mises à jour de révocation ou un autre appel de validation.

API publique

  • TEccCertificateChain.ValidateItemsbehaviour-changed — La méthode n'est désormais explicitement plus thread-safe et exige une sérialisation côté appelant.

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

4 Élevée L'arrêt du pool POSIX ferme la course avec l'ajout de tâches TSynThreadPool renomme son verrou de file POSIX en fPendingSafe et définit fTerminated tout en le maintenant. Enqueue vérifie l'arrêt sous le même verrou, les workers annulent le contexte capturé lors de l'arrêt et DoTaskAbort protège TaskAbort contre les exceptions. TSynParallelProcess initialise aussi explicitement TOSLightLock comme l'exige BSD. Correctifs mormot.core.threads 76f15a86+60-44

core: another pass on TSynThreadPool shuhtdown logic

Impact

Un producteur ne peut plus ajouter une tâche à un pool déjà en destruction, et les contextes en attente risquent moins de fuir ou de bloquer l'arrêt. Cela concerne les serveurs POSIX basés sur TSynThreadPool ; Windows IOCP conserve son chemin distinct.

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

5 Élevée Les listes de tunnels n'invoquent plus de code distant sous verrou de lecture TTunnelList ajoute Get afin de copier un ITunnelTransmit sous son verrou de lecture. TunnelSend, GetInfo et GetAllInfo appellent ensuite les méthodes d'interface après déverrouillage ; GetAllInfo prend un instantané des interfaces et des identifiants de session. DeleteFrom refuse l'auto-suppression, et les suivis ultérieurs affinent encore cette série. Correctifs mormot.net.tunnel 4be92b7a+44-39

net: fixed race/deadlock in TTunnelList

Impact

Un callback qui rentre de nouveau dans la liste ou libère une autre interface ne peut plus bloquer le verrou lecture-écriture de la liste. Cette zone évoluant jusqu'au build 16672, testez la création du relais, la livraison des trames et l'arrêt uniquement sur la révision finale.

À regarder

Utilisez ce correctif uniquement dans la série complète se terminant au build 16672 et exécutez des tests concurrents du cycle de vie des tunnels.

API publique

  • TTunnelList.Getadded — Renvoie une référence locale ITunnelTransmit sûre pour une session.

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

6 Élevée Un suivi ferme trois défauts d'initialisation et d'imbrication des verrous TAlgoZstd crée désormais paresseusement ses contextes partagés de compression et décompression sous leurs verrous. THttpPeerCrypt initialise et finalise explicitement son nouveau TOSLightLock pour BSD. TTunnelList.DeleteFrom copie les identifiants de session sous le verrou de lecture source puis effectue les suppressions après déverrouillage, évitant les verrous de listes imbriqués. Correctifs mormot.lib.zstd+2 0a0f36a4+23-13

all: fixes several locking issues

Impact

Ce commit corrige des régressions introduites plus tôt dans la même série : création prématurée des contextes Zstandard, verrou du client pair non initialisé sous BSD et cycle possible entre verrous de listes de tunnels. Les builds 16660 à 16667 ne sont pas de bons points d'arrêt pour ces composants.

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

7 Élevée La recherche de fuseau protège son cache partagé du dernier résultat TSynTimeZone ajoute fLastZoneSafe, un TLightLock dédié à fLastZone et fLastIndex. LockedSearch consulte et met à jour ce cache sous le nouveau verrou, tandis que la recherche hachée des fuseaux reste sous le verrou de lecture externe existant. Correctifs mormot.core.search 55fa224e+17-12

core: fixed TSynTimeZone.LockedSearch thread safety

Impact

Des conversions concurrentes utilisant des identifiants de fuseau différents ne peuvent plus mettre en course le texte et l'index du dernier fuseau, ce qui pouvait renvoyer un index de cache incohérent. Les backends REST multithreads utilisant TSynTimeZone.Default doivent prendre ce correctif.

Arnaud Bouchez · 08:57 UTC · voir le commit sur GitHub →

8 Élevée Les builds Delphi suivent l'évolution des types de tunnel mormot.net.tunnel introduit l'alias public de tableau dynamique ITunnelTransmits, l'utilise pour le stockage de TTunnelList et les copies locales, passe le paramètre d'interface de Get à out et remplace dans FrameSession une référence TRAIL_SIZE non inlineable par SizeOf(TTunnelSession). Compilateur & plateforme mormot.net.tunnel 804bc970+6-5

net: fixed Delphi compilation

Impact

La révision précédente des tunnels ne compilait pas avec Delphi. Ce commit rétablit la compatibilité Delphi, mais la logique du tunnel change encore dans le build 16672 ; les utilisateurs doivent donc prendre la tête de l'édition.

API publique

  • ITunnelTransmitsadded — Alias public pour array of ITunnelTransmit.
  • TTunnelList.Getsignature-changed — Le paramètre de sortie ITunnelTransmit passe de var à out.

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

9 Élevée Les threads de tunnel BSD initialisent désormais leur verrou OS TTunnelLocalThread.Create appelle fSafe.Init et son destructeur appelle fSafe.Done. Sous BSD, TOSLightLock correspond à TRtlCriticalSection et ne peut pas s'appuyer uniquement sur la mémoire de classe initialisée à zéro. Le diff ORM précise seulement la même exigence déjà respectée pour TOrmPropertiesAbstract.fSafe. Compilateur & plateforme mormot.net.tunnel+1 428ee221+6-4

net: fixed TTunnelLocalThread.Create on BSD

Impact

Sous BSD, la création d'un tunnel pouvait sinon utiliser une section critique non initialisée. Les commits suivants modifient encore le code de tunnel ; ce correctif doit donc être pris via le build 16672.

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

10 Moyenne L'export binaire des certificats exclut désormais les écritures concurrentes TEccCertificateChain.SaveToBinary remplace fSafe.ReadLock par fSafe.WriteLock, car la sérialisation modifie temporairement le drapeau TEccCertificate.fStoreOnlyPublicKey de chaque certificat avant et après SaveToStream. Correctifs mormot.crypt.ecc 6c82cf93+4-4

crypt: fixed TEccCertificateChain.SaveToBinary thread safety

Impact

Des appels parallèles à SaveToBinary ne peuvent plus entrer en course sur le drapeau temporaire et produire une sérialisation privée/publique incohérente. Le verrou plus fort peut sérialiser de rares exports concurrents sans modifier le format binaire.

API publique

  • TEccCertificateChain.SaveToBinarybehaviour-changed — Prend désormais le verrou en écriture de la chaîne pendant la sérialisation.

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

11 Moyenne Les appels Zstandard ne se sérialisent plus derrière un contexte unique TAlgoZstd préalloue des contextes partagés de compression et décompression et tente TryLock pour chaque opération. Un thread en contention crée puis libère un ZSTD_CCtx ou ZSTD_DCtx temporaire au lieu d'attendre la disponibilité du contexte partagé. Performance mormot.lib.zstd 83c4df20+44-36

lib: fixed TAlgoZstd context usage

Impact

Les opérations Zstandard parallèles peuvent s'exécuter simultanément au lieu de former une file derrière un verrou unique. L'unité reste marquée inachevée et réservée à FPC, et le build 16668 rend la création du contexte partagé paresseuse ; ce commit n'est donc pas une cible autonome sûre.

À regarder

Si mormot.lib.zstd est activé, mesurez-le et testez-le sous charge uniquement à partir du build 16668 ; préférez la tête de l'édition.

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

12 Moyenne La sortie de file des tâches POSIX devient constante Le tableau d'attente POSIX de TSynThreadPool devient une FIFO circulaire fixe suivie par fPendingFirst et fPendingLast. PopPendingContext avance un index au lieu de déplacer tous les pointeurs restants, et la file est allouée une seule fois depuis QueueLength. Performance mormot.core.threads 6f064610+43-30

core: ensure TSynThreadPool POSIX queue is O(1)

Impact

Le retrait d'une tâche ne dépend plus de la taille de la file, ce qui réduit la durée du verrou interne lors des pics. Le changement concerne seulement POSIX et ne modifie pas l'API publique de TSynThreadPool.

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

13 Moyenne L'attente d'acceptation des tunnels réduit l'usage CPU sous contention TTunnelLocalThread.fSafe passe de TLightLock à TOSLightLock. OnReceived peut ainsi attendre via le chemin futex de Linux ou de Windows récent pendant que le thread d'arrière-plan est bloqué dans accept. Performance mormot.net.tunnel 75bf7660+4-4

net: optimized TTunnelLocalThread accept() step

Impact

Les premières trames du tunnel ne tournent plus activement sur le CPU en attendant l'acceptation du socket local. Ce changement nécessitait le correctif d'initialisation BSD du build suivant.

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

14 Moyenne La contention du client peer-cache passe à un verrou assisté par l'OS THttpPeerCrypt.fClientSafe passe de TLightLock à TOSLightLock, permettant aux attentes sous contention d'utiliser l'implémentation de type futex de la plateforme au lieu d'une attente active pure. Performance mormot.net.server a5e68484+3-3

net: refined THttpPeerCrypt HTTP client lock

Impact

Les téléchargements directs en arrière-plan devraient consommer moins de CPU lorsque plusieurs threads se disputent le client HTTP partagé. Cette révision ne contient pas les appels Init et Done explicites pour BSD ajoutés dans le build 16668.

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

15 Faible La coordination du pool POSIX revient à un verrou spin court Le champ POSIX interne TSynThreadPool.fSafe passe de TOSLightLock au TLightLock de quatre octets, supprimant les appels Init et Done associés. Les sections critiques protégées ne font qu'assigner des pointeurs et des métadonnées de file. Performance mormot.core.threads 844e8029+5-8

core: refined TSynThreadPool internal POSIX lock

Impact

Les opérations très courtes du pool POSIX évitent le coût d'un verrou assisté par l'OS. La file et l'arrêt sont de nouveau remaniés dans les builds 16670 et 16671 ; ce build n'est donc pas un point d'arrêt autonome.

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

16 Faible Le verrouillage des transactions du proxy SQL adopte le primitive OS léger TSqlDBProxyConnectionProtocol.fSafe passe de TOSLock à TOSLightLock, qui correspond au mutex plus léger basé sur futex sous Linux et Windows 8 ou ultérieur. Aucun algorithme de transaction ni aucune méthode publique ne change. Performance mormot.db.proxy 907c92f5+3-3

db: refined TSqlDBProxyConnectionProtocol lock

Impact

Les transactions du proxy SQL distant peuvent réduire le coût du verrou sous faible contention. Il n'y a aucune migration de source ni modification de comportement pour le code applicatif.

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

17 Faible Le nettoyage des verrous conserve le comportement d'exécution Les commentaires et les portées de verrous sont clarifiés dans mormot.core.os, mormot.net.async, mormot.rest.http.server et mormot.soa.server. Le chemin TLS asynchrone répète la vérification Enabled sous fGC1.Safe et la recherche de session SOA libère son verrou de lecture avant de retourner. Sous le capot mormot.core.os+3 ccde07c6+8-7

core: some code refactoring with no functional change

Impact

Il n'y a aucune modification d'API publique ni de comportement applicatif prévu. La double vérification empêche une configuration TLS en double si plusieurs connexions entrent ensemble dans l'initialisation.

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

18 Faible Un banc multithread teste chaque famille de verrous légers La nouvelle unité test.core.threads ajoute 1 166 lignes de tests sous charge pour TLightLock, TOSLightLock, TOSRWLightLock, TRWLightLock et les comportements associés sur plusieurs threads workers. Tests 719cd877+1168-2

tests: extended T*Lock coverage

Impact

Le code applicatif ne change pas. La suite renforce la confiance dans les réécritures récentes des verrous, sans prouver à elle seule que chaque séquence de tunnel ou d'arrêt de plus haut niveau est exempte de course.

Arnaud Bouchez · 07:41 UTC · voir le commit sur GitHub →

19 Faible Les tests LDAP couvrent les attributs de membres personnalisés TNetworkProtocols ajoute des assertions pour l'analyse personnalisée des membres de groupes LDAP, notamment les noms distinctifs normalisés et le chemin d'attribut member configuré. Seul test/test.net.proto.pas est modifié. Tests 4e783875+8-4

tests: cover LDAP custom members parsing

Impact

Il n'y a aucune modification du code applicatif ni de l'exécution du framework. Les tests protègent le comportement des membres LDAP personnalisés introduit dans l'édition précédente.

Arnaud Bouchez · 07:40 UTC · voir le commit sur GitHub →

20 Faible Le lanceur principal exécute désormais la nouvelle suite de verrous test/mormot2tests.dpr ajoute test.core.threads à sa liste uses, intégrant les nouveaux tests de verrous à l'exécutable mormot2tests habituel. Tests 62bd0e82+5-2

tests: include test.core.threads in mormot2tests project

Impact

Il n'y a aucun impact sur l'exécution ni sur le code applicatif. Les tests continus exécutent désormais le banc de test des verrous ajouté dans le commit précédent.

Arnaud Bouchez · 07:43 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