2011-07-31 2 views
4

Prendre un simple CouchDB à une théorie que le compactage CouchDB est totalement indifférent aux documents supprimés.CouchDB Compaction et Doc Deletion - Compaction indifférente?

Suppression d'un document de Couch via une méthode SUPPRIMER donne le résultat suivant en essayant de le récupérer:

localhost: 5984/enq/supprimé-doc-id { "erreur": "not_found", "raison" : "deleted"}

Attendu.

Maintenant, je compacter la base de données: localhost: 5984/enq/_compact { 'ok': true}

Et vérifier le compactage a terminé "compact_running": false

Maintenant, je me attends CouchDB pour revenir not_found, la raison "manquante" sur un simple GET localhost: 5984/enq/supprimé-doc-id { "erreur": "not_found", "raison": "supprimé"}

Et essayer avec? rev = deleted_rev me donne un doc complet, ouais pour worthl données de l'ess. J'ai donc raison de penser que le compactage couchdb ne montre aucun traitement spécial pour les docs supprimés et regarde simplement la limite de rev rev de compte quand on décide de ce qui fait partie du compactage. Existe-t-il un rev_limit spécial que nous pouvons définir pour les documents supprimés?

Sûrement la seule solution ne peut pas être une _purge? pour le moment nous devons avoir des milliers de docs supprimés orphelins, et bien que nous voulions conserver l'historique des versions pour les docs normaux, nous ne voulons pas réduire notre rev_limit à 1 pour aider dans ce scénario

Quels sont les problèmes de réplication que nous devrions résoudre? au courant de avec purge?

Répondre

4

L'ajout d'un document, sa suppression et son compactage ne remettent pas la base de données CouchDB dans un état vierge. Un document supprimé est conservé par compactage, bien que dans le cas habituel, le document résultant soit petit (juste _id, _rev et _deleted = true). La raison en est la réplication. Imaginez ce qui suit:

  • Créer un document.
  • Répliquer le DB vers la base de données distante.
  • Supprimer le document.
  • DB compact.
  • Répliquez à nouveau la base de données sur la base de données distante.

Si le document est totalement retiré après la suppression + compactage, puis la deuxième réplication ne saura pas dire la DB à distance que le document a été supprimé. Cela entraînerait que les deux DB soient incompatibles.

Un problème a été signalé qui peut entraîner la taille réduite du document dans le DB et non; Cependant, il ne concernait pas la méthode HTTP DELETE AFAIK (bien que je puisse me tromper). Le billet est ici:

https://issues.apache.org/jira/browse/COUCHDB-1141

L'idée de base est que l'information d'audit peut être inclus dans le SUPPRIMER qui sera conservé par le compactage.Assurez-vous que vous ne publiez pas le corps de document complet avec la méthode DELETE (cela pourrait expliquer pourquoi le document n'est pas supprimé).

7

Les documents supprimés sont conservés pour toujours (car il est essentiel de fournir une cohérence éventuelle entre les réplicas). Donc, le comportement que vous avez décrit est intentionnel.

Pour supprimer un document aussi efficacement que possible, utilisez le verbe DELETE, car il stocke uniquement _id, _rev et l'indicateur supprimé. Vous pouvez, bien sûr, réaliser la même chose plus manuellement via POST ou PUT. Enfin, _purge n'existe que pour les cas extrêmes où, par exemple, vous avez placé un mot de passe important dans un document couchdb et devez l'effacer du disque. Ce n'est pas une méthode recommandée pour élaguer une base de données, elle invalidera généralement toutes les vues que vous avez (forçant une reconstruction complète) et gâchera aussi la réplication.

1

Pour clarifier ... de notre expérience, vous devez kick d'un DELETE avec l'ID et un compact afin de supprimer complètement les données du document.

Comme indiqué ci-dessus, vous aurez toujours les "données d'en-tête" dans votre base de données par la suite.