Race Drain and Graduation FR - Kheopsian/Hydranos GitHub Wiki

🇬🇧 English · 🇫🇷 Français

Drain race, graduation et obligations de seed

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.

Le drain peut-il supprimer mes fichiers ?

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 0 signifie « 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 = false dans [race_drain] (la config livrée écrit true, 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.

Le principe

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 graduate le 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 --> [*]
Loading

Obligations de seed

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-seed avec {"host":"tracker.example.org","hours":72} ; {"host":"tracker.example.org","clear":true} retire la déclaration. "hours":0 dé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.

Quand le drain tourne

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_dev sous 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"]
Loading

À 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_pct suffisamment en dessous de high_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.

Graduation

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 race et le torrent est sur le moteur race (un torrent sur un autre moteur de rôle race est au contraire mis en file pour graduer vers race). 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 :

  1. Il attend son tour dans l'onglet Jobs : un job à la fois, le plus ancien d'abord.
  2. 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.
  3. 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.
  4. 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 et allow_breaking_hardlinks n'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.

Zones de transit

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.

Refuser les ajouts quand l'espace manque

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.

Les cartes de volume de l'onglet Race

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.

TRIM après drain

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 FITRIM sur le point de montage. Sous Windows et macOS, c'est refusé avec TRIM 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.

Surveiller le drain

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.

Purge et réconciliation du store

Deux autres routes retirent des torrents race ; aucune ne fait partie du drain.

  • Purge race : POST /api/race/torrents/:info_hash/purge (outil MCP purge_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çoivent stopped, et une copie du même torrent dans un autre moteur n'est pas touchée. Elle répond {"status":"ok"}, 404 torrent not in race quand le store n'a pas de ligne race pour ce hash (une ligne dont le moteur ne tient plus le torrent répond ok, et la ligne est supprimée), ou 500 the race engine refused: …. Elle n'agit que sur le moteur nommé race, pas sur un moteur supplémentaire de rôle race : pour l'un de ceux-là, utilisez DELETE /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.db ou de l'état de reprise d'un moteur, un torrent qu'un autre moteur tient encore y garde sa ligne.

Configuration

[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.

Voir aussi

⚠️ **GitHub.com Fallback** ⚠️