Changes feed with descending=true is incorrect
- 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
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