Race Drain and Graduation FR - Kheopsian/Hydranos GitHub Wiki
S'applique à Hydranos 4.4.
Cette page est pour vous si vos torrents race arrivent sur un disque rapide et petit et que vous voulez qu'Hydranos l'empêche de se remplir. À la fin, vous saurez quand le drain race tourne, comment il choisit entre supprimer et déplacer un torrent, comment déclarer les obligations de seed de vos trackers, et comment lire et régler les cartes de volume de l'onglet Race (seuils, quota, TRIM). Les termes utilisés ici sont définis dans Concepts & glossaire.
Oui, mais seulement dans les cas exacts ci-dessous. En dehors des actions que vous lancez ou configurez vous-même (supprimer un torrent, une purge race, une action de workflow, une limite de partage), le drain race et le balayage de transit sont les seules parties d'Hydranos qui suppriment des données de torrent.
| Qui supprime | Les fichiers d'un torrent ne sont supprimés que si toutes ces conditions sont vraies |
|---|---|
| Drain race | 1. Le torrent est tenu par un moteur de rôle race (race, ou un moteur supplémentaire de rôle race). Cela a été décidé à son ajout (mode de la catégorie, ou engine explicite) ou par un déplacement de moteur ou une graduation ultérieurs, pas par son libellé de catégorie actuel : Changer de catégorie › (Change category ›) sans déplacer les fichiers ne le sort pas du drain. 2. Son volume a Auto drain activé et se trouve au niveau de son seuil démarrer (start) ou au-dessus, ou bien vous avez cliqué Vidanger maintenant (Drain now). 3. L'obligation de seed de son tracker est remplie : vous avez déclaré un Minimum seed pour ce tracker et le torrent a seedé aussi longtemps, ou vous avez déclaré 0, ou le torrent n'a aucun tracker. |
| Balayage de transit | Le torrent est dans une catégorie hoard cochée Transit area et nommée comme Passer vers (Graduate to) par au moins une catégorie, et l'obligation de son tracker est déclarée et remplie (ou il n'a pas de tracker). |
Comment être sûr que rien ne sera jamais supprimé :
- En cas de doute, classez vos catégories en Hoard. Les moteurs hoard ne sont jamais drainés, et le balayage de transit ne touche jamais une catégorie hoard que vous n'avez pas cochée Transit area. Les torrents importés depuis qBittorrent arrivent dans hoard. Voir Moteurs : race & hoard.
-
Ne déclarez pas un Minimum seed que vous ne voulez pas vraiment. Un tracker sans rien de déclaré est protégé : ses torrents sont déplacés ou laissés en place, jamais supprimés. Déclarer
0signifie « supprimer au besoin ». -
Désactivez le drain si vous utilisez race mais ne voulez aucune suppression : désactivez Auto drain sur chaque carte de volume, mettez
enabled = falsedans[race_drain](la config livrée écrittrue, et les nouveaux volumes la suivent), et ne cliquez pas sur Vidanger maintenant. - Les torrents sans tracker ne sont jamais protégés. Rien n'est dû pour eux, donc sur un volume race en cours de drain, ils sont supprimés quand ils sont choisis.
- Les fichiers ne sont conservés que si un autre torrent lit le même chemin. Supprimer la copie d'un torrent supprime ses propres fichiers, sauf si un autre torrent chargé (y compris la copie de ce torrent dans un autre moteur) lit exactement ce chemin. Un torrent race que l'*arr a aussi récupéré dans une catégorie hoard, avec sa propre charge utile, perd ses fichiers race.
Le drain ne sait pas si Sonarr ou Radarr a importé un torrent, et il n'épargne pas les torrents encore en téléchargement. Tout le reste de cette page détaille ces règles.
Les torrents race remplissent un volume rapide. Quand un volume dépasse son seuil de démarrage, le drain race parcourt ses torrents race, du plus ancien au plus récent, et libère de l'espace jusqu'à ce que l'espace alloué (espace utilisé plus ce que les téléchargements doivent encore écrire, compté sur les tailles déclarées des torrents) redescende au seuil bas. Le sort de chaque torrent dépend de son tracker, jamais du remplissage du disque :
- obligation de seed remplie → le torrent est supprimé avec ses données ;
-
pas encore remplie, ou non déclarée → le torrent gradue : un job
graduatele déplace, avec ses données, vers la catégorie hoard indiquée dans Passer vers (catégorie Hoard) (Graduate to (hoard category)) de sa catégorie race, où il continue de seeder ; - non remplie et nulle part où aller → le torrent est bloqué : il reste, et l'onglet Race affiche un badge rouge.
Une catégorie hoard marquée Transit area supprime ensuite ce qui y a gradué une fois l'obligation payée. Sans ce drapeau, une catégorie hoard est une bibliothèque et garde définitivement les torrents gradués.
Le drain ne tourne que sur les moteurs de rôle race (race, et tout moteur supplémentaire de rôle race). Les moteurs hoard ne sont jamais drainés. Voir Moteurs : race & hoard pour les rôles.
stateDiagram-v2
state "Refusé à l'ajout" as Refused
state "En téléchargement sur race" as Downloading
state "En seed sur race, la durée de seed compte" as SeedRace
state pick <<choice>>
state "Bloqué sur le volume race" as Stuck
state "job graduate en file" as Queued
state "job graduate en cours" as Moving
state "De retour sur race tel quel, job échoué" as Back
state "Dans aucun moteur, ROLLBACK FAILED" as Lost
state "En seed dans la catégorie hoard" as SeedHoard
state sweep <<choice>>
state "Supprimé avec ses données" as Deleted
[*] --> Refused: add_block_enabled et espace projeté insuffisant
[*] --> Downloading: ajouté à un moteur de rôle race
Downloading --> SeedRace: téléchargement terminé
Downloading --> pick: choisi par le drain
SeedRace --> pick: choisi par le drain
pick --> Deleted: obligation remplie
pick --> Queued: non remplie ou non déclarée, Passer vers utilisable
pick --> Stuck: non remplie ou non déclarée, pas de Passer vers utilisable
Stuck --> pick: passe de drain suivante
Queued --> Moving: pris par l'exécuteur de jobs
Moving --> SeedHoard: fichiers déplacés, adopté par le moteur hoard avec son enregistrement de reprise
Moving --> Back: échec ou annulation, fichiers remis en place, ré-adopté par race
Back --> pick: passe de drain suivante
Moving --> Lost: le moteur race refuse de le reprendre
SeedHoard --> sweep: balayage de transit toutes les 5 minutes
sweep --> Deleted: cible Transit area, obligation déclarée et remplie
sweep --> SeedHoard: sinon continue de seeder
Refused --> [*]
Deleted --> [*]
Une obligation de seed est le nombre d'heures pendant lesquelles un tracker exige qu'un torrent soit seedé avant que vous puissiez le retirer. Vous la déclarez par hôte de tracker dans l'onglet Trackers : cliquez Modifier (Edit) sur une ligne (ou + Hôte manuel (+ Manual host)), remplissez Minimum seed, puis Enregistrer (Save). La colonne Min seed l'affiche. Elle est stockée dans le fichier de configuration, dans [announce_min_seed_hours] (également modifiable sous forme de table dans Config › Paramètres avancés (default.toml) (Advanced settings (default.toml))), et le drain la relit à chaque passe : un changement s'applique donc à la passe suivante sans redémarrage. + Hôte manuel ouvre le formulaire avec Minimum seed vide : rien n'est déclaré tant que vous n'avez pas tapé de nombre.
[announce_min_seed_hours]
"tracker.example.org" = "72" # 72 hours; the value is a quoted string
"open.example.org" = "0" # asks for nothing: the drain may delete| Ce que vous déclarez | Colonne Min seed | Ce que fait le drain |
|---|---|---|
| rien (champ vide) | - |
protégé : jamais supprimé, gradué à la place (ou bloqué) |
0 |
0h |
obligation remplie d'emblée : supprimé quand il est choisi |
N heures |
Nh |
supprimé une fois que le torrent a seedé N heures, gradué avant cela |
| un torrent sans aucun tracker | — | rien n'est dû : supprimé quand il est choisi |
Comment l'obligation est rapprochée et comptée :
- L'hôte est pris dans la première URL de tracker du torrent (premier palier, première URL) :
https://tracker.example.org:8443/announce/0123456789abcdef→tracker.example.org. La clé doit correspondre à cet hôte exactement : pas de correspondance de sous-domaine, sensible à la casse. - La durée de seed ne compte que lorsque le torrent est complet, en seed et non arrêté. Elle est conservée dans l'état de reprise du moteur (voir Architecture) à travers les redémarrages, et une graduation la reporte.
- Par l'API :
POST /api/announce/min-seedavec{"host":"tracker.example.org","hours":72};{"host":"tracker.example.org","clear":true}retire la déclaration."hours":0déclare 0. Cela n'efface pas la valeur.
La même déclaration conditionne les limites de partage : un torrent qui atteint une limite de partage est retenu jusqu'à ce que l'obligation de son tracker soit déclarée et remplie (voir File d'attente, limites de partage et de débit).
Le rythme et le comportement des annonces sont dans Trackers & annonces.
Une tâche de drain tourne par moteur de rôle race. Elle attend 10 secondes après le démarrage, puis un check_interval_seconds complet (60 dans la config livrée ; 0 ou une clé absente signifie 300) avant sa première passe, puis tourne à chaque intervalle. Avec le 60 livré, la première passe arrive environ 70 secondes après le démarrage. À chaque passe, elle examine chaque volume qui contient des torrents de ce moteur :
- Un volume est un système de fichiers, déterminé à partir du chemin de sauvegarde de chaque torrent, ou de son plus proche dossier parent existant (
st_devsous Linux, numéro de série du volume sous Windows). Vous n'en configurez jamais. Un volume apparaît dès que le chemin de sauvegarde d'un torrent race s'y trouve, avant même qu'un octet soit écrit, et il est nommé d'après son point de montage tel qu'Hydranos le voit (dans le conteneur, sous Docker). - Un volume n'est drainé que si sa politique est activée (Auto drain) et que son espace alloué est au niveau de son seuil de démarrage (
high_watermark_pct) ou au-dessus. Alloué = espace utilisé plus ce que les téléchargements acceptés sur ce volume doivent encore écrire. Un disque à 60 % avec de gros téléchargements en cours peut déclencher le drain. - Avec un quota sur le volume (voir Les cartes de volume de l'onglet Race), les pourcentages portent sur le quota au lieu du disque : total = le quota, utilisé = ce que les torrents de ce moteur ont écrit sur ce volume, libre = le plus petit de (quota − ces données) et de l'espace réellement libre du disque. Le drain de chaque moteur de rôle race compte les données de ses propres torrents contre le quota entier ; la carte additionne les moteurs.
- Le drain libère ensuite jusqu'à ce que l'allocation redescende au seuil down to (
low_watermark_pct). Il compte les tailles déclarées des torrents, pas l'espace mesuré. Une suppression compte quand elle a lieu ; une graduation compte quand son job est mis en file, car la copie prend des minutes. Un torrent qui graduerait mais a déjà un déplacement ou une graduation en attente est sauté et n'est pas compté. Un torrent dont l'obligation est remplie est supprimé même si un déplacement ou une graduation est en attente pour lui. - Seuls les torrents de ce volume sont candidats, triés par date d'ajout, du plus ancien au plus récent. Un SSD plein ne draine jamais un torrent qui vit sur un autre disque.
flowchart TD
A["Tous les check_interval_seconds, par moteur de rôle race"] --> B["Chaque volume contenant des torrents de ce moteur"]
B --> C{"Auto drain activé pour ce volume ?"}
C -- non --> Z["Laisser le volume tranquille"]
C -- oui --> D{"Pourcentage alloué au niveau du seuil démarrer ou au-dessus ?"}
D -- non --> Z
D -- oui --> E["Torrent suivant sur ce volume, plus ancien ajout d'abord"]
N["Vidanger maintenant sur la carte de volume"] -->|"saute les deux vérifications"| E
E --> F{"Obligation de seed du tracker remplie ?"}
F -- "oui : heures servies, 0 déclaré, ou pas de tracker" --> G["Supprimer le torrent et ses données"]
F -- "non, ou tracker non déclaré" --> H{"La catégorie a un Passer vers,<br/>cette catégorie a un chemin de sauvegarde,<br/>et elle classe sous un autre moteur ?"}
H -- oui --> I["Mettre un job graduate en file<br/>(sauté, non compté, si un déplacement<br/>ou une graduation est déjà en attente)"]
H -- non --> J["Le compter comme bloqué et le laisser"]
G --> K{"Excédent au-dessus de down to pas encore couvert ?"}
I --> K
J --> K
K -- oui --> E
K -- "non, ou plus aucun torrent" --> L["Écrire une ligne Historique si quelque chose<br/>a été supprimé, gradué ou bloqué"]
L --> T{"TRIM après drain activé, quelque chose supprimé<br/>et le disque a rendu de l'espace ?"}
T -- oui --> TT["TRIM du volume sur son propre thread"]
T -- non --> TN["Terminé jusqu'à la passe suivante"]
À savoir avant de compter dessus :
- Supprimé veut dire supprimé. Le drain retire le torrent du moteur et du store, et supprime ses fichiers, sauf un fichier qu'un autre torrent chargé lit au même chemin. Si Sonarr ou Radarr a créé des hardlinks de ces fichiers dans une bibliothèque sur le même système de fichiers, la copie de la bibliothèque survit, mais le volume race ne récupère pas d'espace. La colonne Freed de l'Historique (History) montre ce que le disque a réellement rendu.
-
Le drain ne saute pas les torrents encore en téléchargement. Si le plus ancien torrent du volume est encore en téléchargement, il est traité comme les autres. Il n'y a pas de délai de grâce pour les jeunes torrents : gardez
low_watermark_pctsuffisamment en dessous dehigh_watermark_pct, déclarez des obligations réalistes, et voyez le refus d'ajout plus bas pour éviter que le volume se remplisse dès le départ. - TRIM après une passe. Quand TRIM après drain (TRIM after drain) est activé pour le volume, qu'une passe a supprimé au moins un torrent et que le disque a rendu de l'espace, le volume est trimmé sur un thread à lui (voir TRIM après drain plus bas). Une passe qui n'a fait que graduer ne trimme pas ; l'espace libéré par une graduation est trimmé par la passe suivante qui supprime.
La graduation déplace un torrent et ses données vers le moteur d'une autre catégorie, et le garde en seed. Le drain l'utilise pour les torrents qui doivent quitter le volume race mais doivent encore du temps de seed.
Pour que le drain fasse graduer, ouvrez Catégories (Categories), modifiez la catégorie race et choisissez une Passer vers (catégorie Hoard). La liste ne propose que des catégories hoard qui ont un chemin de sauvegarde. Exemple : la catégorie race tv-race (chemin de sauvegarde /data/race/tv) gradue vers la catégorie hoard tv (chemin de sauvegarde /data/library/tv).
Un torrent est bloqué (il ne peut être ni supprimé ni déplacé) quand il doit du temps de seed et que :
- sa catégorie race n'a pas de Passer vers, ou le torrent n'a pas de catégorie ;
- la catégorie Passer vers n'existe plus ou n'a pas de chemin de sauvegarde ;
- la catégorie Passer vers est en mode
raceet le torrent est sur le moteurrace(un torrent sur un autre moteur de rôle race est au contraire mis en file pour graduer versrace). Cela arrive via l'API, ou quand le mode de la catégorie cible est passé en Race après qu'elle a été choisie. Le journal nomme la catégorie, pas chaque torrent.
Les torrents bloqués restent où ils sont. Le drain les réessaie à chaque passe et continue de libérer avec les candidats suivants. Corrigez la catégorie, ou déclarez l'obligation du tracker, et la passe suivante s'en occupe.
Ce que fait un job graduate :
- Il attend son tour dans l'onglet Jobs : un job à la fois, le plus ancien d'abord.
- Il capture l'enregistrement de reprise du torrent (pièces, trackers modifiés, compteurs envoyé et reçu, durée de seed, état arrêté ou démarré), puis retire le torrent du moteur race, en gardant les données. Le torrent ne seede pas pendant que ses fichiers se déplacent.
- Il déplace chaque fichier vers le chemin de sauvegarde de la catégorie cible : un renommage sur le même système de fichiers, sinon une copie puis une suppression, avec une vérification de l'espace libre. Une annulation depuis l'onglet Jobs est prise en compte entre deux fichiers.
- Le moteur hoard adopte le torrent avec cet enregistrement de reprise (sans revérification), et le torrent est classé sous la catégorie cible. Les compteurs, les modifications de trackers, la durée de seed et un état arrêté sont reportés.
Si quelque chose échoue après l'étape 2 (un fichier qui ne peut pas être déplacé, le moteur hoard qui le refuse) ou si le job est annulé, le job remet en place les fichiers déplacés et le moteur race adopte de nouveau le torrent tel qu'il était. L'erreur du job dit quel cas s'est produit :
| L'erreur du job se termine par | État |
|---|---|
rolled back, the torrent is in race as before |
de retour sur race, fichiers remis en place |
back in race, but these files did not move back: … |
de retour sur race ; les fichiers listés sont encore à la destination |
ROLLBACK FAILED, re-add it by hand at <path>: … |
le moteur race a refusé de le reprendre : le torrent n'est dans aucun moteur, ses données sont sur le disque. Récupération : Jobs, actions groupées & déplacement |
(race désigne l'identifiant du moteur source.) Le drain ne casse jamais de hardlinks : un fichier lié ailleurs par hardlink (par exemple par un import *arr) qui doit être copié vers un autre système de fichiers fait échouer le job, qui revient alors en arrière. Le torrent reste sur race, et la passe suivante le choisit de nouveau.
Le drain vérifie la destination avant de mettre une graduation en file. Quand un fichier du même nom s'y trouve déjà (celui d'un autre torrent, typiquement), le torrent reste sur race et le drain journalise ces torrents par catégorie, en WARN not graduated: files of the same name already sit at the destination… ; le job lui-même vérifie de nouveau et refuse (… already exist …; nothing was moved). Un déplacement ou une graduation que vous lancez vous-même est refusé avec destination_taken dans ce cas (ci-dessous). Donnez au Passer vers de chaque catégorie race un chemin de sauvegarde qu'aucun autre torrent ne partage, sinon ces torrents ne passent jamais.
Vous pouvez aussi faire graduer à la main : Changer de catégorie + déplacer les fichiers › (Change category + move files ›) dans le menu contextuel (voir Jobs, actions groupées & déplacement), ou POST /api/torrents/:info_hash/graduate avec {"engine":"hoard","category":"tv"} (save_path est pris dans la catégorie quand vous l'omettez ; "allow_breaking_hardlinks": true accepte de copier des fichiers liés par hardlink). Cette route passe par les mêmes vérifications qu'un changement de catégorie qui déplace les fichiers, et répond 409 avec une reason et le plan quand :
-
unsafe_path: le torrent désigne un fichier hors de son dossier ; -
shared: un autre torrent lit les mêmes fichiers ; -
destination_taken:N file(s) already exist at the destination (…); moving onto them would overwrite them; -
hardlinks: le déplacement casserait des hardlinks etallow_breaking_hardlinksn'est pas positionné ; -
space: pas assez d'espace libre à la cible ; - ou, sans
reason,a move is already queued or running for this torrent(une graduation ou un déplacement).
En cas de succès, elle répond {"status":"queued","job":"…","plan":{…}}. 400 pour un engine manquant, le moteur où se trouve déjà le torrent, un moteur inconnu, ou l'absence de chemin de sauvegarde.
Transit area est une case à cocher des catégories hoard. Une zone de transit est une salle d'attente : un torrent y arrive en devant du temps de seed, le purge, puis est supprimé avec ses données.
Le balayage de transit :
- tourne sur tous les moteurs, 90 secondes après le démarrage puis toutes les 5 minutes, sans condition de pression disque ;
- ne regarde que les torrents dont la catégorie est cochée Transit area et nommée comme Passer vers par au moins une catégorie (une catégorie qui se nomme elle-même via l'API compte ; seul le sélecteur de l'interface la masque). Une catégorie cochée vers laquelle rien ne gradue est laissée tranquille, ce qui évite d'effacer une bibliothèque par erreur ;
- supprime un torrent avec ses données une fois l'obligation de son tracker déclarée et remplie. Un tracker non déclaré n'est jamais payé : ces torrents attendent que vous déclariez une valeur ;
- supprime un torrent sans tracker au balayage suivant (rien n'est dû) ;
- s'applique à tout torrent classé dans cette catégorie, y compris ceux que vous y avez ajoutés directement, pas seulement les torrents gradués.
Laissez Transit area désactivé sur une catégorie de bibliothèque. Le balayage n'écrit aucune ligne dans l'Historique. Il journalise transit: seeding time served, removed.
Avec add_block_enabled = true dans [race_drain] (par défaut false, absent de la config livrée), Hydranos refuse un nouveau torrent destiné à un moteur de rôle race quand
free space − what accepted downloads on that volume still have to write − reserve_free_gb < la taille du torrent.
Le volume est celui sur lequel se trouve le chemin de sauvegarde du torrent lui-même ; avec un quota dessus, l'espace libre est l'espace libre du quota (le plus petit de ce que laisse le quota et de ce qu'a le disque). reserve_free_gb est en Go (10^9 octets), par défaut 0. L'ajout échoue avec race disk full: … GB free of disk, … GB already promised to downloads in flight, … GB reserved; this torrent needs … GB (of 2.0 TB quota au lieu de of disk sous un quota). Si le volume ne peut pas être lu, l'ajout passe. Les moteurs hoard ne sont jamais refusés. Le changement s'applique à l'ajout suivant, sans redémarrage. La façon dont chaque route d'ajout signale le refus est décrite dans Ajouter des torrents & données existantes.
L'onglet Race affiche une carte par volume contenant des données race, au-dessus de la liste des torrents. Sans donnée race, il indique No race volume yet. One appears as soon as a race torrent has data on disk. Deux moteurs de rôle race sur un même disque partagent une carte ; sous un quota, leurs données s'y additionnent.
| Élément | Ce qu'il montre ou fait |
|---|---|
| Titre | point de montage et taille totale ; avec un quota, la taille du quota suivie de quota (les chiffres du disque lui-même dans l'infobulle : disk: … used of …) |
| Barre | espace utilisé (occupation) ; repères à down to et démarrer (start) ; N% used · X free · N torrents, ou N% of quota used · X free · N torrents sous un quota |
| over its mark | affiché quand l'espace utilisé est au niveau de démarrer ou au-dessus. Le drain lui-même se déclenche sur l'espace alloué, il peut donc tourner sans que ceci soit affiché |
| Auto drain | active ou désactive le drain pour ce volume |
| Quota … GB | sur la ligne Auto drain. L'espace qui vous est alloué sur un disque partagé (un slot de seedbox). Vide (texte indicatif disque entier (whole disk)) ou 0 : le disque entier. Infobulle : Sur un disque partagé (un slot de seedbox), l'espace qui vous est alloué plutôt que la taille du disque. Les pourcentages et la vidange comptent alors les données des torrents de cet engine par rapport à ce quota. Vide : le disque entier.
|
| TRIM après drain | interrupteur, désactivé par défaut. Voir TRIM après drain plus bas. À sa droite, dernier TRIM : N s, <il y a …> (last trim), ou le refus en rouge |
| démarrer % / down to % | les deux seuils ; la ligne that is …, back to … les convertit en tailles. down to doit être inférieur à démarrer ; démarrer de 1 à 100 |
| Historique | les dernières passes de drain sur ce volume : When, Before, After, Freed, Deleted, Graduated, Stuck |
| Vidanger maintenant | une passe sur ce volume tout de suite, puis un résumé comme 2 deleted, 1 graduated · 40 GB
|
Sous les cartes, un panneau Graduating liste toutes les graduations en file ou en cours (tous volumes confondus), avec les octets copiés / totaux.
Où est enregistré un changement sur une carte. Auto drain, démarrer et down to sont enregistrés immédiatement via POST /api/drain/policy dans le store (hydra.db, une entrée par point de montage), pas dans default.toml. Ils s'appliquent à la passe suivante. Dès que vous modifiez l'un des trois sur une carte, ce volume garde ses trois valeurs propres et cesse de suivre [race_drain]. L'interface n'a pas de commande « revenir au défaut ». Utilisez l'API avec "inherit": true, montrée plus bas.
Quota et TRIM après drain sont aussi enregistrés dans le store, sous leurs propres clés (volume_quota:<mount point> en octets, volume_trim:<mount point>), à part des trois réglages de drain : les régler ne fait pas cesser au volume de suivre [race_drain], et "inherit": true ne les efface pas. Ce ne sont pas des clés de [race_drain] et ils n'ont pas de champ dans Config › Paramètres avancés (default.toml).
Vidanger maintenant tourne même si Auto drain est désactivé et que le volume est sous démarrer. Il ne libère quand même que jusqu'à down to, et ne supprime toujours jamais un torrent dont l'obligation n'est pas remplie.
Le badge rouge de l'onglet Race compte les torrents bloqués : pour chaque volume, le nombre de bloqués de sa dernière ligne d'Historique des 24 dernières heures. Cliquez dessus pour ouvrir l'historique. Il se rafraîchit toutes les 30 secondes. Une passe n'écrit une ligne d'Historique que si elle a supprimé, fait graduer ou trouvé des torrents bloqués. Tant que des torrents restent bloqués, le drain écrit une ligne par passe.
Un SSD à qui l'on ne dit jamais quels blocs ont été libérés continue de traiter les races supprimées comme des données vivantes et peut ralentir fortement. Avec TRIM après drain activé, Hydranos trimme le volume à la fin d'une passe de drain qui a supprimé au moins un torrent et récupéré de l'espace disque. Le TRIM tourne sur son propre thread (nommé trim), ne bloque jamais le drain, et un seul tourne à la fois par volume. Infobulle : Indique au SSD les blocs que le drain vient de libérer. Un SSD jamais trimmé traite les races supprimées comme des données vivantes et peut tomber à une fraction de sa vitesse d'écriture. Demande CAP_SYS_ADMIN ; ZFS, partages réseau et disques durs le refusent.
-
Linux uniquement. Hydranos émet
FITRIMsur le point de montage. Sous Windows et macOS, c'est refusé avecTRIM is not available on this system(Windows trimme lui-même les fichiers supprimés). - Un succès journalise
volume trimmed after drain(processed_gb,secs). La carte affiche la durée et le moment, pas le nombre d'octets.
Un refus s'affiche en rouge sur la carte et est journalisé comme TRIM after drain refused, off for this volume until it is turned on again or the daemon restarts :
| Refus | Cause |
|---|---|
not allowed: TRIM needs CAP_SYS_ADMIN (Docker: cap_add SYS_ADMIN) |
le processus n'a pas la capability |
this filesystem or device does not support TRIM (ZFS: use autotrim) |
ZFS, un partage réseau, un disque dur, un périphérique qui rejette les discards |
TRIM is not available on this system |
pas Linux |
TRIM failed: … |
toute autre erreur |
Après un refus, ce volume n'est plus trimmé tant que vous n'avez pas désactivé puis réactivé TRIM après drain (ou envoyé "trim_after_drain": true), ou redémarré Hydranos.
Toutes les routes exigent la clé API. Voir API REST pour l'authentification.
| Route | Ce qu'elle renvoie ou fait |
|---|---|
GET /api/drain/status |
les valeurs par défaut de [race_drain] (default_enabled, default_high_watermark, default_low_watermark, check_interval, add_block_enabled, reserve_free_gb) et volumes[] : id, engines, total, used, free, used_pct, committed, alloc_pct, torrents, quota (octets ou null), basis (quota ou disk), disk_total, disk_used, disk_free, enabled, high_watermark, low_watermark, inherited, trim_after_drain, last_trim (at, secs, puis bytes ou error). total, used, free, used_pct et alloc_pct sont ceux du quota quand il y en a un |
GET /api/drain/history |
les 50 dernières passes, tous volumes, les plus récentes d'abord : timestamp, volume, before_pct, after_pct, deleted, graduated, stuck, freed (octets, mesurés) |
GET /api/drain/graduations |
jobs graduate en file ou en cours : info_hash, name, state, copied, total, pct
|
POST /api/drain/policy |
corps {"volume", "enabled", "high_watermark", "low_watermark"} (n'importe quel sous-ensemble), ou {"volume", "inherit": true}. Aussi quota_gb (Go = 10^9 octets, 0 retire le quota ; une valeur négative répond 400 quota_gb is a size in GB, 0 to remove it) et trim_after_drain (true/false), chacun indépendant des trois réglages de drain et de inherit
|
POST /api/drain/now?volume=<mount> |
une passe sur ce volume. Sans volume, chaque volume au niveau de son seuil de démarrage ou au-dessus, même avec Auto drain désactivé. Répond status (ok, no_drain_needed, no_volume), volumes (points de montage touchés), deleted, graduated, stuck, freed_bytes. Avec no_volume, seulement status et volumes
|
# State of every race volume
curl -s -H "X-Api-Key: YOUR_API_KEY" http://localhost:8199/api/drain/status
# Give /data/race its own marks: start at 90 %, free down to 75 %
curl -s -X POST -H "X-Api-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"volume":"/data/race","high_watermark":90,"low_watermark":75}' \
http://localhost:8199/api/drain/policy
# Make it follow [race_drain] again
curl -s -X POST -H "X-Api-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"volume":"/data/race","inherit":true}' \
http://localhost:8199/api/drain/policy
# Declare a 2 TB quota (a seedbox slot), and TRIM it after each drain
curl -s -X POST -H "X-Api-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"volume":"/data/race","quota_gb":2000,"trim_after_drain":true}' \
http://localhost:8199/api/drain/policy
# Drain it now
curl -s -X POST -H "X-Api-Key: YOUR_API_KEY" \
"http://localhost:8199/api/drain/now?volume=%2Fdata%2Frace"L'outil MCP drain (lecture seule) renvoie le même état plus les passes les plus récentes sous recent_runs (history, 10 par défaut ; il accepte jusqu'à 100, mais la route d'historique ne renvoie que les 50 passes les plus récentes, tous volumes confondus ; les lignes plus anciennes restent dans le store). Voir Serveur MCP. Le journal nomme chaque torrent drainé ou gradué (drained, graduating: still owes seeding time) et chaque torrent bloqué faute de Passer vers. Les torrents bloqués parce que Passer vers pointe vers leur propre moteur sont résumés par catégorie (graduate_to points back at this engine, so these torrents can never leave the volume). Une passe qui n'a pas pu libérer assez journalise race drain could not free enough. Les lignes race volume over its high watermark, draining et race drain could not free enough portent un champ basis (of disk, ou of 2.0 TB quota) qui dit sur quoi portent les pourcentages. Les journaux du TRIM sont décrits sous TRIM après drain plus haut.
Deux autres routes retirent des torrents race ; aucune ne fait partie du drain.
-
Purge race :
POST /api/race/torrents/:info_hash/purge(outil MCPpurge_race) retire la copie du torrent dans le moteur nommérace, avec ses fichiers, par le même chemin qu'une suppression : les fichiers qu'un autre torrent chargé lit au même chemin sont conservés, les trackers reçoiventstopped, et une copie du même torrent dans un autre moteur n'est pas touchée. Elle répond{"status":"ok"},404torrent not in racequand le store n'a pas de ligneracepour ce hash (une ligne dont le moteur ne tient plus le torrent répondok, et la ligne est supprimée), ou500the race engine refused: …. Elle n'agit que sur le moteur nommérace, pas sur un moteur supplémentaire de rôlerace: pour l'un de ceux-là, utilisezDELETE /api/torrents/:info_hash?engine=<id>&delete_files=true(voir API REST). -
Réconciliation du store (toutes les 5 minutes) retire les lignes du store des torrents qu'un moteur ne tient plus, et seulement les lignes de ce moteur : après une restauration de
hydra.dbou de l'état de reprise d'un moteur, un torrent qu'un autre moteur tient encore y garde sa ligne.
[race_drain] dans default.toml. Les valeurs indiquées sont la valeur par défaut du code quand la clé manque, et ce qu'écrit la config livrée.
| Clé | Clé absente | Config livrée | Lue ? | Effet |
|---|---|---|---|---|
enabled |
false |
true |
oui, à chaque passe | Auto drain par défaut pour les volumes sans politique propre |
check_interval_seconds |
0 → 300 s |
60 |
au démarrage seulement (redémarrage nécessaire) | temps entre deux passes |
high_watermark_pct |
0 |
95 |
oui, à chaque passe | seuil démarrer par défaut (% alloué) |
low_watermark_pct |
0 |
85 |
oui, à chaque passe | seuil down to par défaut |
add_block_enabled |
false |
absent | oui, à chaque ajout | refuser les ajouts race qui ne tiennent pas |
reserve_free_gb |
0 |
absent | oui, à chaque ajout | espace gardé libre par le refus d'ajout (10^9 octets) |
« À chaque passe » et « à chaque ajout » valent pour les changements faits via l'interface ou l'API (onglet Config, onglet Trackers), qui mettent à jour la config en cours d'exécution. Une modification à la main de default.toml est lue au démarrage suivant, ou dès qu'un changement de réglage via l'interface ou l'API réécrit le fichier de configuration, car cela recharge tout le fichier. check_interval_seconds exige quand même un redémarrage. Le Quota et le TRIM après drain par volume ne sont pas des clés : réglez-les sur la carte de volume ou avec POST /api/drain/policy (quota_gb, trim_after_drain).
min_age_minutes n'est plus dans la config livrée. Il n'a jamais rien fait (le drain protège un torrent par le Minimum seed de son tracker, pas par son âge) ; une valeur restée dans un ancien fichier est ignorée, et Hydranos journalise au démarrage config: race_drain.min_age_minutes is ignored: ….
Les obligations de seed vivent dans [announce_min_seed_hours], décrit plus haut. Référence complète des clés : Config : moteurs & drain race et Config : démon, auth & global.
- Catégories & routage : comment une catégorie choisit le moteur et le dossier.
- Jobs, actions groupées & déplacement : l'onglet Jobs, les déplacements et leurs cas d'échec.
- Limites connues de la 4.4.