apache / apache/couchdb

Changes feed with descending=true is incorrect

Open
#4,714 10 comments 0 reactions 0 assignees View on GitHub
bug needs-triage
Dominant language
Erlang
Stars
7k
Forks
1.1k
Avg merge
1d 16h
Merged PRs (30d)
9

Description

## Description

A CouchDB changes feed from a database where `q` is > 1, when queried with `?descending=true` provides a set of results with repeated `seq` values and a negative `pending` value.

```js
{
"results": [
{
"seq": "4-g1AAAAfjeJy91E9OhDAUBvDqmLh0bqBrE5DS8qcr5wZ6A32vLSETBowDa72B3kBvoDfQG-gN9AZ6AwZSE-isBhPYtAkJ75ePryUjhMzTmSKnCmVxqxcKOXVx5UjpVGtnXVRl6njclVlRKchLN9dl1ryzDwSP6rpepjMgq-bBIXIRSImDJtkwi3aBcd6seGzZkiMoHgwathV6N_uktc8sWwQRAAsGDduy-U6219rnlh0q5oOAQcP-UzYuWvvCsn3gKJN4_L4vW_vqz94zZ43GGITe-H1ft3Zh5Y5ChrE_Qd83rX1n5eYq9CjK0fvOD5qV3Ddbwz902YFHcUjD0Ts3_qPxn3p-wBOqx7_nxn82_kvv3AlGpfBG7974r8Z_6_JTRlWMdKL-343_0fmaAgjtT9T_p_G_uu8fg9JaRRP1_238n15-xUB4cqL-f43f-_coLlkC_qCByw34y4Gw",
"id": "6f92c987479f11d6a435ef6e54b79341",
"changes": [
{
"rev": "1-23202479633c2b380f79507a776743d5"
}
]
},
{
"seq": "4-g1AAAAfjeJy91E9OhDAUBvDqmLh0bqBrE5DS8qcr5wZ6A32vLSETBowDa72B3kBvoDfQG-gN9AZ6AwZSE-isBhPYtAkJ75ePryUjhMzTmSKnCmVxqxcKOXVx5UjpVGtnXVRl6njclVlRKchLN9dl1ryzDwSP6rpepjMgq-bBIXIRSImDJtkwi3aBcd6seGzZkiMoHgwathV6N_uktc8sWwQRAAsGDduy-U6219rnlh0q5oOAQcP-UzYuWvvCsn3gKJN4_L4vW_vqz94zZ43GGITe-H1ft3Zh5Y5ChrE_Qd83rX1n5eYq9CjK0fvOD5qV3Ddbwz902YFHcUjD0Ts3_qPxn3p-wBOqx7_nxn82_kvv3AlGpfBG7974r8Z_6_JTRlWMdKL-343_0fmaAgjtT9T_p_G_uu8fg9JaRRP1_238n15-xUB4cqL-f43f-_coLlkC_qCByw34y4Gw",
"id": "c712333ff3f3297b9df038cea77b9cb2",
"changes": [
{
"rev": "1-23202479633c2b380f79507a776743d5"
}
]
},
{
"seq": "4-g1AAAAfjeJy91E9OhDAUBvDqmLh0bqBrE5DS8qcr5wZ6A32vLSETBowDa72B3kBvoDfQG-gN9AZ6AwZSE-isBhPYtAkJ75ePryUjhMzTmSKnCmVxqxcKOXVx5UjpVGtnXVRl6njclVlRKchLN9dl1ryzDwSP6rpepjMgq-bBIXIRSImDJtkwi3aBcd6seGzZkiMoHgwathV6N_uktc8sWwQRAAsGDduy-U6219rnlh0q5oOAQcP-UzYuWvvCsn3gKJN4_L4vW_vqz94zZ43GGITe-H1ft3Zh5Y5ChrE_Qd83rX1n5eYq9CjK0fvOD5qV3Ddbwz902YFHcUjD0Ts3_qPxn3p-wBOqx7_nxn82_kvv3AlGpfBG7974r8Z_6_JTRlWMdKL-343_0fmaAgjtT9T_p_G_uu8fg9JaRRP1_238n15-xUB4cqL-f43f-_coLlkC_qCByw34y4Gw",
"id": "c9fb072787c20167ab71bd567f03c3d7",
"changes": [
{
"rev": "1-23202479633c2b380f79507a776743d5"
}
]
},
{
"seq": "4-g1AAAAfjeJy91E9OhDAUBvDqmLh0bqBrE5DS8qcr5wZ6A32vLSETBowDa72B3kBvoDfQG-gN9AZ6AwZSE-isBhPYtAkJ75ePryUjhMzTmSKnCmVxqxcKOXVx5UjpVGtnXVRl6njclVlRKchLN9dl1ryzDwSP6rpepjMgq-bBIXIRSImDJtkwi3aBcd6seGzZkiMoHgwathV6N_uktc8sWwQRAAsGDduy-U6219rnlh0q5oOAQcP-UzYuWvvCsn3gKJN4_L4vW_vqz94zZ43GGITe-H1ft3Zh5Y5ChrE_Qd83rX1n5eYq9CjK0fvOD5qV3Ddbwz902YFHcUjD0Ts3_qPxn3p-wBOqx7_nxn82_kvv3AlGpfBG7974r8Z_6_JTRlWMdKL-343_0fmaAgjtT9T_p_G_uu8fg9JaRRP1_238n15-xUB4cqL-f43f-_coLlkC_qCByw34y4Gw",
"id": "801f6800f561950b6a0dadc353512e7c",
"changes": [
{
"rev": "1-23202479633c2b380f79507a776743d5"
}
]
}
],
"last_seq": "4-g1AAAAfjeJy91E9OhDAUBvDqmLh0bqBrE5DS8qcr5wZ6A32vLSETBowDa72B3kBvoDfQG-gN9AZ6AwZSE-isBhPYtAkJ75ePryUjhMzTmSKnCmVxqxcKOXVx5UjpVGtnXVRl6njclVlRKchLN9dl1ryzDwSP6rpepjMgq-bBIXIRSImDJtkwi3aBcd6seGzZkiMoHgwathV6N_uktc8sWwQRAAsGDduy-U6219rnlh0q5oOAQcP-UzYuWvvCsn3gKJN4_L4vW_vqz94zZ43GGITe-H1ft3Zh5Y5ChrE_Qd83rX1n5eYq9CjK0fvOD5qV3Ddbwz902YFHcUjD0Ts3_qPxn3p-wBOqx7_nxn82_kvv3AlGpfBG7974r8Z_6_JTRlWMdKL-343_0fmaAgjtT9T_p_G_uu8fg9JaRRP1_238n15-xUB4cqL-f43f-_coLlkC_qCByw34y4Gw",
"pending": -4
}
```

> Note the changes feed with `descending=false` (the default) is fine. This only affects `?descending=true` requests.

## Steps to Reproduce

Create a database and populate:

```sh
curl -X PUT '/mydb?q=16'
curl -X POST -H'Content-type:application/json' -d'{}' "$COUCH_URL/mydb"
curl -X POST -H'Content-type:application/json' -d'{}' "$COUCH_URL/mydb"
curl -X POST -H'Content-type:application/json' -d'{}' "$COUCH_URL/mydb"
curl -X POST -H'Content-type:application/json' -d'{}' "$COUCH_URL/mydb"
```

Fetch the changes feed with `?descending=true`

```sh
curl "$COUCH_URL/mydb/_changes?descending=true"
```

> Note: if I use `q=1` on database creation, then I correctly get four different `seq` values back in descending order, but still with a negative `pending` value.

## Expected Behaviour

It is expected that fetching a CouchDB's changes feed with `descending=true` would provide an array of `results` in _descending_ `seq` order, a `last_seq` and a positive `pending` number indicating how many more changes are available to fetch.

## Your Environment

* 3.3.1
* curl
* MacOS Ventura - M1

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the issue through the database _changes endpoint using the supplied curl commands, comparing q=16 and q=1 with descending=true. Trace the changes-feed handling for descending requests and verify that results have descending sequence order, distinct sequences where expected, and a non-negative pending value.

Written by the indexing model from the issue text.

Assessment

Tech stack
erlang
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.