Document Deletion Not Replicated with Low revs_limit (CouchDB → PouchDB)

Aperta
#9,085 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
javascript, react-native

Direzione di ricerca

Inizia con la funzione isDeleted e i metadati rev_tree forniti, quindi riproduci lo scenario CouchDB-to-PouchDB con un revs_limit basso e più aggiornamenti prima dell’eliminazione. Il lavoro è completato quando la causa è confermata e si garantisce che il documento eliminato venga rimosso da PouchDB quando l’eliminazione segue una cronologia delle revisioni troncata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

🔄 Document Deletion Not Replicated with Low revs_limit (CouchDB → PouchDB)

Hi,

I'm encountering a document deletion issue when replicating data from CouchDB to PouchDB with a low revs_limit.

🧠 Context

I'm using a one-way replication mechanism from CouchDB → PouchDB in a React Native application. Documents are updated daily in CouchDB and replicated to PouchDB. No changes are made in PouchDB — it's read-only.

Because documents were accumulating hundreds of revisions (sometimes 400+), we decided to limit the revision history by setting revs_limit = 1 on the CouchDB database, since we do not need any revision history.

This approach generally works well — documents update fine even with multiple revision gaps.

❌ Problem: Deletions Are Not Propagated

However, we're running into a problem with deleted documents not being removed from PouchDB.

🧪 Reproduction Scenario (with revs_limit = 3)
  1. A document is created in CouchDB.
  2. It is replicated to PouchDB.
  3. The document is modified 6 times in CouchDB.
  4. The document is then deleted in CouchDB.
  5. The replication is triggered.

➡️ At this point, the document is NOT deleted in PouchDB.

If I increase revs_limit to 10 with same process, the deletion propagates correctly.

🧩 Investigation

The deletion status is determined via this code (extracted from PouchDB):

// check if a specific revision of a doc has been deleted
//  - metadata: the metadata object from the doc store
//  - rev: (optional) the revision to check. defaults to winning revision
function isDeleted(metadata, rev) {
  if (!rev) {
    rev = winningRev(metadata);
  }
  var id = rev.substring(rev.indexOf('-') + 1);
  var toVisit = metadata.rev_tree.map(getTrees);

  var tree;
  while ((tree = toVisit.pop())) {
    if (tree[0] === id) {
      return !!tree[1].deleted;
    }
    toVisit = toVisit.concat(tree[2]);
  }
}

Here’s an example of the replicated document metadata:

{
  "id": "header:test7",
  "deleted": true,
  "revisions": {
    "start": 7,
    "ids": [
      "6f8c91dbbaeaddfc94972b3b912a8b43",
      "1e0a89380ff99cc556d5f8518afb39a7",
      "520f3eb9ca9c2f925f63b363c80774ae"
    ]
  },
  "rev_tree": [
    {
      "pos": 1,
      "ids": ["637b045152350553a2ad642d05975297", { "status": "available" }, []]
    },
    {
      "pos": 5,
      "ids": [
        "520f3eb9ca9c2f925f63b363c80774ae",
        { "status": "missing" },
        [
          [
            "1e0a89380ff99cc556d5f8518afb39a7",
            { "status": "missing" },
            [
              [
                "6f8c91dbbaeaddfc94972b3b912a8b43",
                { "status": "available", "deleted": true },
                []
              ]
            ]
          ]
        ]
      ]
    }
  ],
  "seq": 8840
}

In this case:

  • The rev at pos: 1 corresponds to the first revision (from the initial replication).
  • The rev at pos: 5 corresponds to the deleted revision.
  • However, the ID passed to the function is the one from pos: 1 (637b045152350553a2ad642d05975297), which doesn't match the deleted branch in the rev_tree.

Thus, the document never gets deleted in PouchDB.

❓ Question

Is this expected behavior when using a low revs_limit?
Is there a way to ensure that document deletions replicate correctly even when the deleted revision is from a "longer" branch that replaces a truncated one?

Lingua principale
JavaScript
Stelle
17.6k
Fork
1.5k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/pouchdb

Tutte le issue di apache/pouchdb

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.