Imaginons que vous construisiez un système de stockage de journalisation/d'écriture en avant-enregistrement. Pouvez-vous simplement l'implémenter par (pour chaque transaction) en ajoutant les données (avec write (2)), en ajoutant un marqueur de validation, puis en fsync-ing?Possibilité d'implémenter la journalisation avec un seul fsync par commit?
Le scénario à prendre en compte est de faire un grand nombre d'écritures dans ce journal, puis de le fsync, et il y a un échec pendant le fsync. Les pointeurs de blocs directs/indirects de l'inode ne sont-ils vidés qu'après le vidage de tous les blocs de données, ou n'y a-t-il aucune garantie que les blocs sont vidés dans l'ordre? Si ce dernier, puis lors de la récupération, si vous voyez un marqueur de validation à la fin du fichier, vous ne pouvez pas croire que les données entre lui et le marqueur de validation précédent est significatif. Ainsi, vous devez vous appuyer sur un autre mécanisme (impliquant au moins un autre fsync) pour déterminer quelle est l'étendue du fichier journal cohérente (par exemple, écrire/fsynchroniser les données, puis écrire/fsynchroniser le marqueur de validation).
Si cela fait une différence, s'interroger principalement sur ext3/ext4 comme contexte.
Merci pour la réponse Russell - cela vous dérangerait-il de clarifier ce que vous voulez dire par fsync et fdatasync étant incorrect? Et dans la technique de pré-allocation, comment accomplissez-vous la pré-allocation? – Yang
Question finale sur la relation entre 'hdparm -W' et' barrier = 1': à la lecture des docs, ma compréhension de 'hdparm -W' est qu'il bascule le cache interne du périphérique, alors que' barrier = 1' contrôle si nous rincer les blocs de la couche de bloc à l'appareil.Est-ce que 'barrier = 1' garantit également que les blocs rincés dépassent le cache interne de l'appareil? – Yang
Et il semble que 'barrier = 1' n'affecte que les blocs de journal - n'auriez-vous pas besoin de désactiver la mise en cache d'écriture de toute façon pour des fsyncs durables? – Yang