Agir maintenantpeut affecter un système en production
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.
20 sur 20 entrées · 20 commits upstream
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.
Unités
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.
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.
Unités
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.
Mise à jour recommandée
Mettez à jour les services POSIX qui détruisent des pools actifs et testez l'arrêt sous charge.
Unités
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.
Unités
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.
Mise à jour recommandée
Ignorez les builds intermédiaires concernés et utilisez 2.4.16672 pour les déploiements Zstandard, peer-cache ou tunnel.
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.
Mise à jour recommandée
Mettez à jour les services qui effectuent des conversions TSynTimeZone concurrentes et rejouez les tests de dates entre fuseaux.
Unités
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.
Mise à jour recommandée
Ne vous arrêtez pas au build 16668 ; compilez les projets de tunnel Delphi avec le build 16672.
API publique
ITunnelTransmitsadded — Alias public pour array of ITunnelTransmit.TTunnelList.Getsignature-changed — Le paramètre de sortie ITunnelTransmit passe de var à out.
Unités
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.
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.
Mise à jour recommandée
Mettez à jour les backends qui exportent une même TEccCertificateChain depuis plusieurs threads.
API publique
TEccCertificateChain.SaveToBinarybehaviour-changed — Prend désormais le verrou en écriture de la chaîne pendant la sérialisation.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.
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.
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.