112 min agoClean up unit tests main
Nick Vatamaniuc [Wed, 28 Sep 2022 18:18:42 +0000 (14:18 -0400)] 
Clean up unit tests

 * Centralize the definition of TDEF* macros

 * Don't include eunit bits in the fabric at the top, instead use TEST specific

 * Remove some unused include files, as reported by erlang_ls + emacs

10 hours agoEnable eunit coverage for all applications
Jay Doane [Tue, 27 Sep 2022 05:45:28 +0000 (22:45 -0700)] 
Enable eunit coverage for all applications

Enable eunit test coverage for all applications via top level
rebar.config.script, and remove redundant configuration at the
application level.

2 days agoExpose the batched open_doc_revs function variant.
Nick Vatamaniuc [Thu, 22 Sep 2022 03:57:14 +0000 (23:57 -0400)] 
Expose the batched open_doc_revs function variant.

This is the batched version of the existing `open_doc_revs/4` function. It
turns out the internal implementation of `open_doc_revs/4` already operated on
batches, just that the batch size had always been 1, so here we just expose the
batched variant.

One subtle difference from the single variant, is there are options which apply
to the whole request, and some apply to individual documents only. In the
previous `open_doc_revs/4` both were intermingled in the single Options
argument. In the batched version, the per-document options are passed in each
`{{Id, Rev}, DocOpts}` tuple. Here DocOpts will usually have `{atts_since,
...}` option, but it could have others, like `ejson_body`, for example.

The API is also exposed in `fabric_rpc. This function will be the used to
optimize `_bulk_get` as described in issue 4183. To allow incremental node
updates, let's have the backend implementation in a separate commit so it could
be included in separate rolling updates releases.

Add some tests both for the original `open_doc_revs/4` function and batched
variant. Since the internal implementation is exactly the same, the batched
variant mainly checks how multiple results are returned and that per document
options are applied correctly.


4 days agoFix the documentation download links
Nick Vatamaniuc [Sat, 24 Sep 2022 04:57:05 +0000 (00:57 -0400)] 
Fix the documentation download links

The download page was missing the version part of the template.

Use the RTD version environment variable


6 days agoBump Erlang versions in CI
Nick Vatamaniuc [Thu, 22 Sep 2022 06:25:55 +0000 (02:25 -0400)] 
Bump Erlang versions in CI

Both pr and full builds.

6 days agoFix variable already bound warnings
Jay Doane [Tue, 20 Sep 2022 16:10:39 +0000 (09:10 -0700)] 
Fix variable already bound warnings

These warnings occur when compiling with OTP 25:

src/mem3/test/eunit/mem3_reshard_api_test.erl:50:57: Warning: variable '_Persist' is already bound. If you mean to ignore this value, use '_' or a different underscore-prefixed name

6 days agoDocument _versions endpoint
Ronny Berndt [Fri, 9 Sep 2022 08:17:16 +0000 (10:17 +0200)] 
Document _versions endpoint

7 days agoExplicitly maintain a fully connected cluster
Nick Vatamaniuc [Mon, 19 Sep 2022 21:39:19 +0000 (17:39 -0400)] 
Explicitly maintain a fully connected cluster

Previously, it was possible for the nodes to disconnect, and for that state to
persist util the nodes restarted. Some fabric requests could reconnect the
nodes as a side-effect of sending remote messages, but most of the fabric
requests currently start a rexi monitor, which immediately delivers a
`rexi_DOWN` message to the coordinator for worker nodes not in the `[node() |
nodes()]` list. That happens before `erlang:send/2,3` gets called, so there is
nothing there to eventually reconnect the nodes.

To avoid relying on the random request reconnecting the cluster, use an
explicit monitor process. It does the initial connections, as well as
periodically maintains them.


11 days agoDon't double-encode changes sequence strings in the replicator
Nick Vatamaniuc [Fri, 16 Sep 2022 15:21:10 +0000 (11:21 -0400)] 
Don't double-encode changes sequence strings in the replicator

Previously we always encoded the sequence as json. In case of a strings, the
most common case, this ended up with something like `"\"1-gA..\""`. Then, the
endpoints would strip out and ignore the extra `"`. So, avoid sending the extra
bytes just so they can be striped out in the end anyway. This should make the
logs look a bit cleaner too.

Integers or any other sequences are still json-encoded. Integers will still
look like `?since=123` and, in the unlikely we case we replicate with a
BigCouch 0.4 era endpoint, the `[SeqNum, OpaqueString]` should be properly
encoded as before and replications should work.

This also fixes a minor annoyance when the `_scheduler/{jobs,docs}` results
returning the default start sequence as `0` (an integer) even though in the
majority of case they'd almost always turn into a string. After this we
consistently return a string as it would be passed in the `_changes?since=...`

12 days agoRemove the long deprecated bigcouch 0.4 change sequence support
Nick Vatamaniuc [Thu, 15 Sep 2022 20:34:22 +0000 (16:34 -0400)] 
Remove the long deprecated bigcouch 0.4 change sequence support

We always ran a regex match for it, then failed, and tried the regular pattern.
Regexes are pretty fast (15-30 microseconds on my laptop), but it's still a
waste of resources. For comparison a `config:get/3` is about microsecond, so
it's like needlessly performing 10 extra config lookup per `_changes` feed

Improve unit tests by having more cases and one test per case.

Remove unreachable `"now"` clause in `validate_start_seq/2`. By that point
`get_start_seq/2` should have transformed `"now"` into a proper sequence so
it's confusing validating that case as passing. At that point it should be
considered a failure, which is what one of the new unit tests checks for.

12 days agoadd test coverage to prevent junk in eventsource
Zach Lankton [Fri, 16 Sep 2022 00:05:46 +0000 (00:05 +0000)] 
add test coverage to prevent junk in eventsource

eventsource events should only ever contain data, id, event
or empty lines

adding a test to ensure that new code/changes
will not break this rule

13 days agoFix eventsource change feed
Nick Vatamaniuc [Thu, 15 Sep 2022 04:26:10 +0000 (00:26 -0400)] 
Fix eventsource change feed

At some point when the `stop` callback arg got a 3rd `Pending`
element, we forgot to update the eventsource callback. As a result, we
ended up in a catch-all clause and we appended an unmatched ']' and a
json `"last_seq"` element.

While at it, clean up of the similar upgrade clauses in other callback

2 weeks agoStatistically skip _revs_diff in the replicator
Nick Vatamaniuc [Tue, 6 Sep 2022 06:46:56 +0000 (02:46 -0400)] 
Statistically skip _revs_diff in the replicator

When the revisions are consistently missing from the target, for
example when replicating to a new target database, it's wasteful to
keep calling _revs_diff.  Reuse the same algorithm used when skipping
calls to _bulk_get if there are too many attachments to statistically
start skipping calls to _revs_diff.

Also use the same record for keeping track of stats so rename
`bulk_get_stats` to `fetch_stats`.

The update and attempt functions are re-used as well, there are just
separate wrappers which pass in different values for the threshold and
other parameters.

2 weeks agoUpgrade to latest Sphinx 5.1.1 and fix the top Edit on Github link
Nick Vatamaniuc [Mon, 12 Sep 2022 22:37:51 +0000 (18:37 -0400)] 
Upgrade to latest Sphinx 5.1.1 and fix the top Edit on Github link

"Edit on Github" link wasn't working and pointing to a non-existent "index"
file. This was most likely because we override the index.html template, so the
source renderer doesn't know what to link it to. Instead opt to make the top
level "Edit on Github" point the docs readme page. Individual doc pages will
point to their respective source pages.

In addition, we were quite a bit behind on on the sphinx version 1.5 vs 5.1.1
this has caused quite a bit of headaches over the years as we had to pin
jinja2, docutils and other libraries versions to avoid breaking things.

The main issue after the upgrade was that the http domain became a bit more
strict. After vendoring it in, we had to make a few multipart http examples use
plaintext. On the positive side, it found broken references in the admin guide,
so those were fixed. Since we're using the latest 5.1.1 opt to just use a
python3 venv with a short script. That should make it easier for
contributors to build docs locally.

2 weeks agoGive the users the option to disable bulk_get attempts docs-fix-edit-link
Nick Vatamaniuc [Fri, 9 Sep 2022 20:28:29 +0000 (16:28 -0400)] 
Give the users the option to disable bulk_get attempts

Let users have the option to revert to the previous behavior. They may have
some odd load balancer setup, or a custom API implementation where repeated
_bulk_get attempts may cause unexpected issues.

2 weeks agoRemove commented out Jenksfile section
Nick Vatamaniuc [Fri, 9 Sep 2022 16:44:54 +0000 (12:44 -0400)] 
Remove commented out Jenksfile section

We're not using couchdbci-debian:arm64v8-buster-erlang containers any longer
and instead using multiarch images with buildx.

2 weeks agoFix docs build instructions
Nick Vatamaniuc [Fri, 9 Sep 2022 16:33:51 +0000 (12:33 -0400)] 
Fix docs build instructions

As per comment in

2 weeks agoReformat jenkinsfile groovy
Nick Vatamaniuc [Fri, 9 Sep 2022 16:32:55 +0000 (12:32 -0400)] 
Reformat jenkinsfile groovy

Go with the 2-indent mode. In emacs it would be:

'(groovy-indent-offset 2)

2 weeks agoReplace references to old docs repo
Nick Vatamaniuc [Fri, 9 Sep 2022 05:43:31 +0000 (01:43 -0400)] 
Replace references to old docs repo

2 weeks agoMerge pull request #4164 from apache/integrate-docs-2
Nick Vatamaniuc [Fri, 9 Sep 2022 04:26:42 +0000 (00:26 -0400)] 
Merge pull request #4164 from apache/integrate-docs-2

Integrate docs into the main repo

2 weeks agoUpdate docs file with new repo and paths 4164/head
Nick Vatamaniuc [Fri, 9 Sep 2022 03:29:08 +0000 (23:29 -0400)] 
Update docs file with new repo and paths

2 weeks agoIntegrate docs into the main repo
Nick Vatamaniuc [Wed, 7 Sep 2022 03:50:28 +0000 (23:50 -0400)] 
Integrate docs into the main repo

2 weeks agoUpdate pull request jenkinsfile to shortcut building docs
Nick Vatamaniuc [Fri, 2 Sep 2022 05:01:45 +0000 (01:01 -0400)] 
Update pull request jenkinsfile to shortcut building docs

If docs are changed then docs "check" is run If only docs changed and
not other files, then only docs are built and other stages are

Also, remove docs from gitignore and from rebar.config.

3 weeks agoShow supported hash algorithms at node-local _versions endpoint (#4162)
Ronny [Sat, 3 Sep 2022 07:54:01 +0000 (09:54 +0200)] 
Show supported hash algorithms at node-local _versions endpoint (#4162)

3 weeks agoMaybe return bad_content_type on _session POST
Jay Doane [Thu, 1 Sep 2022 20:38:44 +0000 (13:38 -0700)] 
Maybe return bad_content_type on _session POST

Currently, when POSTing to `/_session` with a Content-Type header
other than either `application/x-www-form-urlencoded` or
`application/json`, the error response can be surprising.

This changes the response to 415 `bad_content_type` when it's not one
of the above.

3 weeks agoFix 'Bound variable in pattern' warnings
Jay Doane [Thu, 1 Sep 2022 18:52:48 +0000 (11:52 -0700)] 
Fix 'Bound variable in pattern' warnings

3 weeks agoMerge pull request #4160 from apache/bulk_get_input_validation
Robert Newson [Thu, 1 Sep 2022 15:59:27 +0000 (16:59 +0100)] 
Merge pull request #4160 from apache/bulk_get_input_validation

return a nice error if non-object passed to _bulk_get

3 weeks agoreturn a nice error if non-object passed to _bulk_get 4160/head
Robert Newson [Thu, 1 Sep 2022 14:54:04 +0000 (15:54 +0100)] 
return a nice error if non-object passed to _bulk_get

4 weeks agoImplement _bulk_get support for the replicator
Nick Vatamaniuc [Fri, 19 Aug 2022 01:00:13 +0000 (21:00 -0400)] 
Implement _bulk_get support for the replicator

By now most of the CouchDB implementations support `_bulk_get`, so
let's update the replicator to take advantage of that.

To be backwards compatible assume some endpoints will not support
`_bulk_get` and may return either a 500 or 400 error. In that case the
replicator will fall back to fetching individual document revisions
like it did previously. For additional backward compatibility, and to
keep things simple, support only the `application/json` `_bulk_get`
response format. (Ideally, we'd send multiple Accept headers with
various `q` preference parameters for `json` and `multipart/related`
content, then do the right thing based on the response, however, none
of the recent Apache CouchDB implementations support that scheme

Since fetching attachments with application/json response is not
optimal, attachments are fetched individually. This means there are
two main reasons for the replicator to fall back to fetching
individual revisions: 1) when _bulk_get endpoint is not supported and
2) when the document revisions contain attachments.

To avoid wasting resource repeatedly attempting to use `_bulk_get `and
then falling back to individual doc fetches, maintain some historical
stats about the rate of failure, and if it crosses a threshold, skip
calling `_bulk_get` altogether. This is implemented with a moving
exponential average, along with periodic probing to see if `_bulk_get`
usage becomes viable again.

To give the users some indication about how successful `_bulk_get`
usage is, introduce two replication statistics parameters:
  * `bulk_get_attempts`: _bulk_get document revisions attempts made.
  * `bulk_get_docs` : `_bulk_get` document revisions successfully retrieved.

These are persisted in the replication checkpoints along with the rest
of the job statistics and visible in `_scheduler/jobs` and
`_active_tasks` output.

Since we updated the replication job statistics, perform some minor
cleanups in that area:
  - Stop using the process dictionary for the reporting timestamp. Use
    a regular record state field instead.
  - Use casts instead of a calls when possible. We still rely on
    report_seq_done calls as a synchronization point to make sure we
    don't overrun the message queues for the replication worker and
    scheduler job process.
  - Add stats update API functions instead of relying on naked
    `gen_server` calls and casts. The functions make it clear which
    process is being updated: the replication worker or the main
    replication scheduler job process.

For testing, rely on the variety of existing replication tests running
and passing. The recently merged replication test overhaul from [pull
the tests form using the node-local (back-end API) to chttpd (the
cluster API), which actually implements `_bulk_get`. In this way, the
majority of replication tests should test the `_bulk_get` API usage
alongside whatever else they are testing. There there is new test
checking that `_bulk_get` fallback works and testing the
characteristics of the new statistics parameters.

4 weeks agoMerge pull request #4041 from apache/draft_allow_nested_json_claim_roles
Robert Newson [Tue, 30 Aug 2022 10:17:44 +0000 (11:17 +0100)] 
Merge pull request #4041 from apache/draft_allow_nested_json_claim_roles

Allow and evaluate nested json claim roles

4 weeks agoAllow and evaluate nested json claim roles in JWT token 4041/head
Ronny Berndt [Fri, 27 May 2022 09:29:54 +0000 (11:29 +0200)] 
Allow and evaluate nested json claim roles in JWT token

4 weeks agoFix variable already bound compiler warnings
Jay Doane [Wed, 24 Aug 2022 05:36:35 +0000 (22:36 -0700)] 
Fix variable already bound compiler warnings

OTP 25 generates warnings like the following:

src/chttpd/test/eunit/chttpd_util_test.erl:33:48: Warning: variable '_Persist' is already bound. If you mean to ignore this value, use '_' or a different underscore-prefixed name

Create an explicit `Persist` variable set `false` to suppress those warnings.

4 weeks agoRefactor hash algorithms test
Ronny [Thu, 25 Aug 2022 17:29:22 +0000 (19:29 +0200)] 
Refactor hash algorithms test

The test doesn't check if the hash algorithm is supported by the
erlang vm. The test for supported hash algorithms was only missing
in the test itself and not in CouchDB.
Refactor test and verify hash names during test runs.

5 weeks agoUpgrade hash algorithm for cookie auth (#4140)
Ronny [Wed, 24 Aug 2022 16:45:32 +0000 (18:45 +0200)] 
Upgrade hash algorithm for cookie auth (#4140)

Introduce a new config setting "hash_algorithms".

The values of the new config parameter is a list of comma-separated values of Erlang hash algorithms.

An example:

hash_algorithms = sha256, sha, md5

This line will use and generate new cookies with the sha256 hash algorithm and accept/verify cookies with the given hash algorithms sha256, sha and md5.

5 weeks agofix missing "=" for admin party in #4153
Ronny Berndt [Tue, 23 Aug 2022 21:23:48 +0000 (23:23 +0200)] 
fix missing "=" for admin party in #4153

5 weeks agoconfig section for require_valid_user is only [chttpd]
Ronny Berndt [Mon, 22 Aug 2022 14:43:07 +0000 (16:43 +0200)] 
config section for require_valid_user is only [chttpd]

5 weeks agoAddress race in cpse_incref_decref test
Jay Doane [Mon, 25 Jul 2022 22:05:45 +0000 (15:05 -0700)] 
Address race in cpse_incref_decref test

Occasionally, this test fails with the following stack trace:

      cpse_gather: make_test_fun (cpse_incref_decref)...*failed*
in function cpse_test_ref_counting:'-cpse_incref_decref/1-fun-0-'/2 (src/cpse_test_ref_counting.erl, line 44)
in call from cpse_test_ref_counting:cpse_incref_decref/1 (src/cpse_test_ref_counting.erl, line 44)
in call from eunit_test:run_testfun/1 (eunit_test.erl, line 71)
in call from eunit_proc:run_test/1 (eunit_proc.erl, line 522)
in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 347)
in call from eunit_proc:handle_test/2 (eunit_proc.erl, line 505)
in call from eunit_proc:tests_inorder/3 (eunit_proc.erl, line 447)
in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 337)
         {expression,"lists : member ( Pid , Pids1 )"},

Wrap the former assertion in a `test_util:wait` call to account for
the apparent race between client readiness and

5 weeks agomoved the name property to the correct spot.
Zach Lankton [Thu, 18 Aug 2022 12:26:49 +0000 (08:26 -0400)] 
moved the name property to the correct spot.

5 weeks agoupdate variable name and readme
Zach Lankton [Wed, 17 Aug 2022 15:33:13 +0000 (15:33 +0000)] 
update variable name and readme

5 weeks agoupdate devcontainer
Zach Lankton [Mon, 15 Aug 2022 17:17:25 +0000 (17:17 +0000)] 
update devcontainer

5 weeks agoUpdate couch_replicator_use_checkpoints_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:45:29 +0000 (21:45 -0400)] 
Update couch_replicator_use_checkpoints_tests

Use the clustered version of source and target endpoints.

Also, use common setup and teardown functions. The test was previously quite
clever in trying to save an extra few lines by parameterizing the "use
checkpoing" vs "don't use checkpoints" scenarios with a foreachx and a custom
notifier function. Instead, opt for more clarity and use the usual TDEF_FE
macro and just setup two separate test one which uses checkpoints and one which

Another major win is is using the utility db comparison function instead of a
duplicate copy of it.

5 weeks agoUpdate couch_replicator_small_max_request_size_target
Nick Vatamaniuc [Fri, 19 Aug 2022 01:41:14 +0000 (21:41 -0400)] 
Update couch_replicator_small_max_request_size_target

Use the clustered version of the source and target endoints and switch to using
common test setup and teardown function functions. Overall it added to quite a
few number of lines saved.

5 weeks agoUpdate couch_replicator_selector_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:39:17 +0000 (21:39 -0400)] 
Update couch_replicator_selector_tests

Use the clustered versions of endpoints for the test.

Also, use the common setup and teardown helpers and remove the foreachx

5 weeks agoUpdate couch_replicator_retain_stats_between_job_runs
Nick Vatamaniuc [Fri, 19 Aug 2022 01:37:32 +0000 (21:37 -0400)] 
Update couch_replicator_retain_stats_between_job_runs

Switch the test to use the clustered endpoints.

Use the common test setup and teardown functions as well as the TDEF_FE macros.

5 weeks agoUpdate couch_replicator_rate_limiter_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:35:50 +0000 (21:35 -0400)] 
Update couch_replicator_rate_limiter_tests

Use the TDEF_FE macro and cleanup ?_test(begin...end) instances.

5 weeks agoUpdate couch_replicator_proxy_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:34:26 +0000 (21:34 -0400)] 
Update couch_replicator_proxy_tests

Use the TDEF_FE macro and remove the ugly ?_test(begin...end) construct.

5 weeks agoUpdate couch_replicator_missing_stubs_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:31:46 +0000 (21:31 -0400)] 
Update couch_replicator_missing_stubs_tests

Use common setup and teardown helpers, TDEF_FE macros and remove all the
foreachx nonsense.

5 weeks agoUpdate couch_replicator_many_leaves_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:28:13 +0000 (21:28 -0400)] 
Update couch_replicator_many_leaves_tests

Use comon setup and teardown function and the TDEF_FE macros.

Also, remove quite a bit of foreachx and remote boilerplate which is not needed
any longer.

Most of the changes however consisted in update all the db operations to use
fabric instead of couch. Luckily, most of those have fabric equivalents, and
fabric calls are even shorter as they don't need open, re-open and close

5 weeks agoUpdate couch_replicator_large_atts_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:25:37 +0000 (21:25 -0400)] 
Update couch_replicator_large_atts_tests

Use commong setup functions and TDEF_FE macro.

Removing the foreachx and the remote vs local junk really trimmed down the
size. The test content was tiny compared to the clunky EUnit setup logic.

5 weeks agoUpdate couch_replicator_id_too_long_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:23:47 +0000 (21:23 -0400)] 
Update couch_replicator_id_too_long_tests

Use common setup and teardown helpers along with some local replicate/2 and db_url/2 functions.

Remove foreachx goop and use TDEF_FE for consistency with other tests.

5 weeks agoUpdate couch_replicator_httpc_pool_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:22:30 +0000 (21:22 -0400)] 
Update couch_replicator_httpc_pool_tests

Use the TDEF_FE macro and remove the ?_test(begin...end) construct.

5 weeks agoUpdate couch_replicator_filtered_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:20:15 +0000 (21:20 -0400)] 
Update couch_replicator_filtered_tests

Take advantage of the helper setup and teardown functions.

Switching to a simpler TDEF_FE macro instead of foreachx and inorder setup
cruft also saves some lines of code.

5 weeks agoUpdate couch_replicator_error_reporting_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:17:37 +0000 (21:17 -0400)] 
Update couch_replicator_error_reporting_tests

Use the TDEF_FE macro and clean up ?_test(begin...end) cruft.

5 weeks agoUpdate couch_replicator_create_target_with_options_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:15:02 +0000 (21:15 -0400)] 
Update couch_replicator_create_target_with_options_tests

Start using the common setup and tear down functions from the test helper.

Also using the test definitions to use the TDEF_FE macro.

Since the setup function already creates a target endpoint database and the
test is also in charge of creating test database, we just remove the target db
before the replication jobs start.

5 weeks agoUpdate couch_replicator_connection_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:13:44 +0000 (21:13 -0400)] 
Update couch_replicator_connection_tests

The main changes are just using the TDEF_FE macros and removng the
_test(begin...end) silliness.

5 weeks agoUpdate couch_replicator_compact_tests
Nick Vatamaniuc [Fri, 19 Aug 2022 01:10:15 +0000 (21:10 -0400)] 
Update couch_replicator_compact_tests

Compactor tests are the only tests which continue using the local ports since
they deals with triggering and managing low level compaction processes.

However, it was still possible to improve the tests somewhat by using the
TDEF_FE macros and removing some left-over foreachx cruft.

5 weeks agoUpdate couch_replicator_attachments_too_large to use fabric
Nick Vatamaniuc [Fri, 19 Aug 2022 01:08:17 +0000 (21:08 -0400)] 
Update couch_replicator_attachments_too_large to use fabric

Switch test module to use the clustered enpdpoints and TDEF_FE test

5 weeks agoAdd some utility functions to couch_replicator_test_helper
Nick Vatamaniuc [Fri, 19 Aug 2022 01:03:22 +0000 (21:03 -0400)] 
Add some utility functions to couch_replicator_test_helper

In preparation to start using chttpd (fabric) endpoints add some common utility
functions to the replication test helper module.

Since `couch_db:fold_docs/4` doesn't exit for fabric, use the changes feed to
get all the revision leafs. That is used when comparing database endpoints.

It turns our the majority replication tests can use the exact same setup,
teardown and db_url functions so make sure those are also available in the
helper module.

6 weeks agoUpdate couchdb-mochiweb to v3.1.0
Ronny Berndt [Tue, 16 Aug 2022 07:29:16 +0000 (09:29 +0200)] 
Update couchdb-mochiweb to v3.1.0

6 weeks agoUpdate couchdb-config to 2.2.0
Ronny Berndt [Tue, 16 Aug 2022 07:25:44 +0000 (09:25 +0200)] 
Update couchdb-config to 2.2.0

7 weeks agoFix purge request timeouts
Nick Vatamaniuc [Tue, 9 Aug 2022 22:00:42 +0000 (18:00 -0400)] 
Fix purge request timeouts

Don't rely on the default gen_server 5 second timeout.

Use `infinity` as that's also effectively used for doc updates.


7 weeks agoFix proxyauth_test and remove it from skipping tests (#4129)
Ronny [Mon, 8 Aug 2022 14:56:26 +0000 (16:56 +0200)] 
Fix proxyauth_test and remove it from skipping tests (#4129)

After reverting #4094, bringing this back as a seperate fix.

2 months agoMerge pull request #4133 from noahshaw11/add-editors-magic-lines
iilyak [Fri, 29 Jul 2022 10:42:22 +0000 (03:42 -0700)] 
Merge pull request #4133 from noahshaw11/add-editors-magic-lines

Add editors magic lines

2 months agoAdd editors magic lines 4133/head
Noah Shaw [Mon, 25 Jul 2022 23:23:11 +0000 (18:23 -0500)] 
Add editors magic lines

2 months agoFix elixir :logger warnings
Ronny [Thu, 28 Jul 2022 07:23:34 +0000 (09:23 +0200)] 
Fix elixir :logger warnings

Migrate deprecated config option variable to new config option for :logger application.
Fixed `warning: :compile_time_purge_level option for the :logger application is deprecated,
use :compile_time_purge_matching instead`.

2 months agoMerge pull request #4135 from apache/dedicated-ioq-search-function
Russell Branca [Wed, 27 Jul 2022 22:02:51 +0000 (15:02 -0700)] 
Merge pull request #4135 from apache/dedicated-ioq-search-function

Add ioq:call_search

2 months agoAdd ioq:call_search dedicated-ioq-search-function 4135/head
Russell Branca [Tue, 26 Jul 2022 18:22:32 +0000 (11:22 -0700)] 
Add ioq:call_search

2 months agoMerge pull request #4106 from apache/4101-add-io-priority
Russell Branca [Mon, 25 Jul 2022 23:27:02 +0000 (16:27 -0700)] 
Merge pull request #4106 from apache/4101-add-io-priority

4101 add io priority

2 months agoAdd ioq io_priority functions and system class 4101-add-io-priority 4106/head
Russell Branca [Wed, 13 Jul 2022 22:20:54 +0000 (15:20 -0700)] 
Add ioq io_priority functions and system class

2 months agoAdd io_priority classes
Sean Hudgston [Wed, 13 Jul 2022 21:03:59 +0000 (17:03 -0400)] 
Add io_priority classes

- chhtpd_auth_cache
- couch_index

2 months agoMerge pull request #4033 from noahshaw11/implement-view_report-function
iilyak [Mon, 25 Jul 2022 19:35:09 +0000 (12:35 -0700)] 
Merge pull request #4033 from noahshaw11/implement-view_report-function

Implement index report functions

2 months agoImplement view_report function 4033/head
ncshaw [Fri, 20 May 2022 21:21:44 +0000 (16:21 -0500)] 
Implement view_report function

2 months agoMerge pull request #4128 from apache/revert-4094-for-now
Robert Newson [Fri, 22 Jul 2022 17:01:23 +0000 (18:01 +0100)] 
Merge pull request #4128 from apache/revert-4094-for-now

Revert "Replace SHA-1 with SHA-256 for cookie authentication (#4094)"

2 months agoRevert "Replace SHA-1 with SHA-256 for cookie authentication (#4094)" 4128/head
Robert Newson [Fri, 22 Jul 2022 16:04:17 +0000 (17:04 +0100)] 
Revert "Replace SHA-1 with SHA-256 for cookie authentication (#4094)"

This reverts commit daff65d8c8772c637eb60365d6e672543163a740.

2 months agoMerge pull request #4125 from jiahuili430/couch-tests
iilyak [Thu, 21 Jul 2022 12:40:45 +0000 (05:40 -0700)] 
Merge pull request #4125 from jiahuili430/couch-tests

Remove `couch_tests` from reltool

2 months agoRemove `couch_tests` 4125/head
jiahuili [Wed, 20 Jul 2022 21:06:06 +0000 (16:06 -0500)] 
Remove `couch_tests`

`couch_tests` should exist in the tarball but not in the release.

2 months agoReturn a 400 response for a single new_edits=false doc update without revisions
Nick Vatamaniuc [Wed, 20 Jul 2022 22:02:12 +0000 (18:02 -0400)] 
Return a 400 response for a single new_edits=false doc update without revisions

We are already doing that for _bulk_docs [1] but forgot to do it for individual
doc updates.



2 months agoTurn document update mode atoms into defines
Nick Vatamaniuc [Wed, 20 Jul 2022 20:22:16 +0000 (16:22 -0400)] 
Turn document update mode atoms into defines

We have made some mistakes there in the past mis-typing those. For example in, so as a preliminary PR to fix, where we'd have to again special
case logic based on the update type, let's switch them to be defines so the
compiler double-check the values for us.

2 months agoMerge pull request #4123 from apache/dev-run-fix-haproxy-cfg
Robert Newson [Wed, 20 Jul 2022 19:21:35 +0000 (20:21 +0100)] 
Merge pull request #4123 from apache/dev-run-fix-haproxy-cfg

make haproxy config valid again

2 months agomake haproxy config valid again 4123/head
Robert Newson [Wed, 20 Jul 2022 17:59:11 +0000 (18:59 +0100)] 
make haproxy config valid again

recent versions of haproxy attempt to discover truncated configs
by insisting on a final blank line.

2 months agoFix stats endpoint
ncshaw [Mon, 10 Jan 2022 21:21:05 +0000 (15:21 -0600)] 
Fix stats endpoint

2 months agoFix the flaky tests for `create_doc()`
jiahuili [Mon, 18 Jul 2022 20:49:10 +0000 (15:49 -0500)] 
Fix the flaky tests for `create_doc()`

Add `retry_until()` to `create_doc()` to remove unstable tests.

2 months agoUpdate application description and dependencies
jiahuili [Mon, 18 Jul 2022 16:06:05 +0000 (11:06 -0500)] 
Update application description and dependencies

1. Update application description and dependencies
2. `couch_uuids_tests.erl` needs to start `config` and `couch_log`
3. Reformat changed files

2 months agoUpdate elixir to 1.13
jiahuili [Mon, 18 Jul 2022 16:47:33 +0000 (11:47 -0500)] 
Update elixir to 1.13

1. Update elixir to 1.13
2. Add path() function
3. Removed `hqueue` dependency
4. Removed mix.lock

2 months agoTrim X-Auth-CouchDB-Roles header after reading
Ronny [Mon, 18 Jul 2022 18:07:11 +0000 (20:07 +0200)] 
Trim X-Auth-CouchDB-Roles header after reading

2 months agoReplace SHA-1 with SHA-256 for cookie authentication (#4094)
Ronny [Mon, 18 Jul 2022 17:01:30 +0000 (19:01 +0200)] 
Replace SHA-1 with SHA-256 for cookie authentication (#4094)

* Replace Sha-1 with Sha-256 for cookie authentication

* Fix proxyauth_test and remove it from skipping tests

2 months agoAdd toggle for smoosh queue persistence
Noah Shaw [Tue, 12 Jul 2022 22:11:38 +0000 (17:11 -0500)] 
Add toggle for smoosh queue persistence

2 months agoFix not_found error smoosh
Noah Shaw [Tue, 12 Jul 2022 21:21:21 +0000 (16:21 -0500)] 
Fix not_found error smoosh

2 months agoFix not calling is_compacting test
Noah Shaw [Thu, 14 Jul 2022 22:27:15 +0000 (17:27 -0500)] 
Fix not calling is_compacting test

2 months agoRemove view compaction jobs recovery
Noah Shaw [Tue, 12 Jul 2022 21:08:17 +0000 (16:08 -0500)] 
Remove view compaction jobs recovery

2 months agoClean up unused code and invalid spec from replicator
Nick Vatamaniuc [Thu, 14 Jul 2022 15:23:16 +0000 (11:23 -0400)] 
Clean up unused code and invalid spec from replicator

Invalid specs confused dialyzer.

For bulk_docs response handling it detected another left-over clause
from local endpoint support.

It also found un-nessessarily broad case matches in

2 months agoRemove some left-over local endpoint clauses in replicator
Nick Vatamaniuc [Wed, 13 Jul 2022 15:05:10 +0000 (11:05 -0400)] 
Remove some left-over local endpoint clauses in replicator

We removed local endpoints a while back and these were left over.

Also remove some unused headers as discovered by erlang_ls and emacs.

2 months agoAdd filepath to is_compacting
Noah Shaw [Mon, 11 Jul 2022 20:18:52 +0000 (15:18 -0500)] 
Add filepath to is_compacting

2 months agoMerge pull request #4093 from noahshaw11/fix-error-handling-smoosh
Robert Newson [Mon, 11 Jul 2022 15:56:07 +0000 (16:56 +0100)] 
Merge pull request #4093 from noahshaw11/fix-error-handling-smoosh

Improve error handling in smoosh_utils:write_to_file/3

2 months agoImprove error handling in smoosh_utils:write_to_file/3 4093/head
Noah Shaw [Thu, 7 Jul 2022 20:33:40 +0000 (15:33 -0500)] 
Improve error handling in smoosh_utils:write_to_file/3

2 months agoSkip nightly package uploads since nothing seems to be using them
Nick Vatamaniuc [Sat, 9 Jul 2022 19:07:19 +0000 (15:07 -0400)] 
Skip nightly package uploads since nothing seems to be using them

Since we're not uploading logs skip setting up and fetching creds and
IO log environment variable setup.

2 months agoSkip uploading build logs for now
Nick Vatamaniuc [Sat, 9 Jul 2022 19:12:25 +0000 (15:12 -0400)] 
Skip uploading build logs for now

It broke at some point so no need to keep trying to upload them

2 months agoFix flaky "validate doc update" elixir test
Nick Vatamaniuc [Fri, 8 Jul 2022 18:15:08 +0000 (14:15 -0400)] 
Fix flaky "validate doc update" elixir test

We saw it fail quite a few times already so adding a retry around it.

Unfortunately it could now fail with a timeout instead of an assert but since
we're updating a document there is no idempotent way to testing it (retry
until, then do the actual assert again below).

2 months agoImplement winning_revs_only option for the replicator
Nick Vatamaniuc [Fri, 8 Jul 2022 06:06:59 +0000 (02:06 -0400)] 
Implement winning_revs_only option for the replicator

`winning_revs_only` option replicates only the winning revisions from the
source to the target, effectively discarding conflicts.

This option may be used as an alternative to the custom VDU strategy, or manual
_all_docs read and POST to target scripts, often used by users to discard
conflicted document revisions.

Behind the scenes the implementation simply switches the _changes feed style to
`main_only` from the replication default of `all_docs`.

Additionally, when enabled, the `winning_revs_only` option, will generate a
different replication ID and use a different set of checkpoints than the
default case. This should allows first replicating with `winning_revs_only:
true`, and then later replicate normally between the same endpoints, in
order to "backfill" the rest of the revisions.


2 months agoOptimize couch_util:to_hex/1
Nick Vatamaniuc [Wed, 6 Jul 2022 06:49:15 +0000 (02:49 -0400)] 
Optimize couch_util:to_hex/1

When profiling [1] a cluster acting as a replication source, noticed a lot of
time spent in `couch_util:to_hex/1`. That function is used to emit revision ids
amongst other things. When processing a million documents with a 1000 revisions
each, it ends up in the hotpath, so to speak.

Remembering that in Erlang/OTP 24 there is a new `binary:encode_hex/1` [2]
function, decided to benchmark ours vs the OTP implementation. It turns ours is
slower [3] so let's try to use the OTP one.

One difference from the OTP's version is ours emits lower case hex letters,
while the OTP one emits upper case ones. That's why the lookup table had all
the "A"s replaced with "a"s, "B"s with "b"s, etc.

As a bonus, replaced a few calls to `couch_util:to_hex/1` wrapped in `?l2b/1`
or `list_to_binary/1` with just a single call to `couch_util:to_hex_bin/1`.

Existing `couch_util:to_hex/1` version, returning a list ,was left as is and
just calls `to_hex_bin/1` internally and converts the result to a list.

This altered the peak memory usage for the key tree stemming test so had to
alter the magic constants there a bit to avoid flakiness.

> ... eprof:analyze(total,[{sort, time}, {filter, [{time, 1000}, {calls, 100}]}]).

FUNCTION                                                            CALLS        %      TIME  [uS / CALLS]
--------                                                            -----  -------      ----  [----------]
couch_doc:revid_to_str/1                                          1165641     1.71    402860  [      0.35]
couch_key_tree:get_key_leafs_simple/4                             1304102     1.85    435700  [      0.33]
erlang:list_to_integer/2                                           873172     2.00    471140  [      0.54]
gen_server:loop/7                                                   62209     2.11    496932  [      7.99]
couch_key_tree:map_simple/3                                       1829235     2.36    554429  [      0.30]
couch_util:nibble_to_hex/1                                       37334650    16.67   3917127  [      0.10]
couch_util:to_hex/1                                              19834192    34.37   8077050  [      0.41]
---------------------------------------------------------------  --------  -------  --------  [----------]
Total:                                                           91072005  100.00%  23503072  [      0.26]



% ~/src/erlperf/erlperf 'hex:to_hex1(<<210,90,95,232,68,185,66,248,160,33,184,103,181,221,158,96>>).' 'hex:to_hex3(<<210,90,95,232,68,185,66,248,160,33,184,103,181,221,158,96>>).'
Code                                                                                ||        QPS       Time     Rel
hex:to_hex3(<<210,90,95,232,68,185,66,248,160,33,184,103,181,221,158,96>>).          1    2746 Ki     364 ns    100%
hex:to_hex1(<<210,90,95,232,68,185,66,248,160,33,184,103,181,221,158,96>>).          1    1593 Ki     627 ns     58%

(`to_hex1/1` is the existing version and `to_hex3/1` is the OTP version).