Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

compact: build the successor in a private directory and publish it atomically

Ouverte
#59 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
javascript, node.js
Domaine
backend, databases

Piste de recherche

Start with okf/faces/lib/compact.js and read guardCompactPaths(), claimDir(), and the staging and cleanup flow. The issue also identifies Bundle.init and the sign callback as key points to trace. Add the three listed race tests, then verify that compaction refuses a changed destination and cleanup preserves replacement directories and files.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Summary

compact() in okf/faces/lib/compact.js (branch feat/okf-autobee-v2) checks its paths once, then writes into them in place. Another process that writes into the out-dir or the staging path while a compaction runs can lose its files. The review of the compaction hardening (T13 to T18) found two such races. The owner accepted both for the first release, as a fast follow after the branch lands.

The two races

  1. The out-dir check expires before the store opens. guardCompactPaths() refuses a non-empty out-dir before the face step. Compaction then materializes, stages and awaits the sign callback. If another process creates the out-dir and writes a file into it during that window, claimDir() accepts the directory, and Bundle.init (Corestore) clears it. The foreign file is gone, and compaction reports success.
  2. Cleanup equates a path name with ownership. On a failure, compaction removes the stage when ownStage is true, and claimDir().release() removes the out-dir or the entries that it did not see at claim time. If another process replaced the stage directory, or added a file to the out-dir after the claim, cleanup deletes that directory or file.

Both races need a concurrent writer on the same paths. A single user on one machine who runs one compaction at a time does not meet them.

The full fix

  • Build the successor in a private directory that compaction creates exclusively, for example mkdtemp(<out-dir>.compact-build-), beside the out-dir.
  • Stage, ingest and verify there. Close the successor vault.
  • Publish with an atomic rename onto the out-dir. On POSIX, rename(2) of a directory fails with ENOTEMPTY or EEXIST when the destination is not empty, so a changed destination is refused, never cleared.
  • Reopen the published vault at the out-dir and return it. compact() then returns a vault that it reopened, not the one that it built. That is an API change for callers that hold the build path.
  • Cleanup removes only the private build directory and the stage that this run created. Record the device and inode of each created directory, and refuse to remove a path whose identity changed.

Tests to add

  • A sign callback that creates the out-dir and writes a file into it: compaction refuses, and the file stays.
  • A stage replaced between staging and a failure: the replacement stays.
  • A file added to the out-dir after the claim, then an init failure: the file stays.
Langage dominant
JavaScript
Étoiles
0
Forks
0
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de indexzero/hyperdown

Toutes les issues de indexzero/hyperdown

Issues similaires

Plus d'issues JavaScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.