42 hours agoUpdate snappy dependency to CouchDB-1.0.2 master
Nick Vatamaniuc [Thu, 18 Oct 2018 17:33:44 +0000 (13:33 -0400)] 
Update snappy dependency to CouchDB-1.0.2

This fixes a memory bug:

43 hours agoMerge pull request #1655 from cloudant/fix-lru_opts
iilyak [Thu, 18 Oct 2018 19:13:16 +0000 (12:13 -0700)] 
Merge pull request #1655 from cloudant/fix-lru_opts

Fix ets_lru configuration in chttpd application

44 hours agoFix ets_lru configuration in chttpd application 1655/head
ILYA Khlopotov [Mon, 15 Oct 2018 21:19:41 +0000 (14:19 -0700)] 
Fix ets_lru configuration in chttpd application

The code was incorect in a sense that it was using is_integer guard,
while `config:get` cannot return integer.

45 hours agoAvoid crashing if a mango query is reduced
Nick Vatamaniuc [Thu, 18 Oct 2018 15:43:42 +0000 (11:43 -0400)] 
Avoid crashing if a mango query is reduced

Previously returning null from mango native proc lead to case clause error in
couch_query_servers. Instead return a proper shape but with null results for
each reduction.

2 days agoImprove restart resilience of couch_log application
Nick Vatamaniuc [Wed, 17 Oct 2018 21:43:56 +0000 (17:43 -0400)] 
Improve restart resilience of couch_log application

Previously it was too easy to crash the whole node when any of couch_log's
children restarted. To improve resiliency, let couch_log application restart
a few more times before taking down the whole node with it.

2 days agoDo not crash couch_log application when gen_* servers send extra args
Nick Vatamaniuc [Wed, 17 Oct 2018 20:24:28 +0000 (16:24 -0400)] 
Do not crash couch_log application when gen_* servers send extra args

gen_server, gen_fsm and gen_statem might send extra args when terminating. This
is a recent behavior and not handling these extra args could lead to couch_log
application crashing and taking down the whole VM with it.

There are two improvements to fix the issue:

 1) Handle the extra args. Format them and log as they might have useful
 information included.

 2) Wrap the whole `format` function in a `try ... catch` statement. This will
 avoid any other cases where the logger itself if crashing when attepting to
 format error events.

3 days agoMerge pull request #1660 from apache/fix-upgrade_v5_test
Peng Hui Jiang [Wed, 17 Oct 2018 13:29:40 +0000 (21:29 +0800)] 
Merge pull request #1660 from apache/fix-upgrade_v5_test

Fix test failure on upgrade_v5_test

3 days agoFix test failure on upgrade_v5_test 1660/head
jiangph [Wed, 17 Oct 2018 09:49:54 +0000 (17:49 +0800)] 
Fix test failure on upgrade_v5_test


3 days agoMerge pull request #1657 from apache/COUCHDB-3326-upgrade-users-db
Peng Hui Jiang [Tue, 16 Oct 2018 22:52:19 +0000 (06:52 +0800)] 
Merge pull request #1657 from apache/COUCHDB-3326-upgrade-users-db

Upgrade disk version to 7/latest for databases generated prior to clustered purge builds

4 days agoUpgrade disk version to 7 for databases COUCHDB-3326-upgrade-users-db 1657/head
jiangph [Mon, 15 Oct 2018 11:38:24 +0000 (19:38 +0800)] 
Upgrade disk version to 7 for databases

  - for databases generated before this code base, the disk
  version needs to be upgraded to 7 or higher so that it
  can match the db_header with purge_tree and purge_seq_tree


4 days agoMerge pull request #1654 from apache/fix_exceed_limit
Robert Newson [Mon, 15 Oct 2018 18:11:10 +0000 (19:11 +0100)] 
Merge pull request #1654 from apache/fix_exceed_limit

Test correct condition for exceed_limit error

4 days agoTest correct condition for exceed_limit error 1654/head
Robert Newson [Mon, 15 Oct 2018 16:13:05 +0000 (17:13 +0100)] 
Test correct condition for exceed_limit error

Previously we were testing if Pos + TotalBytes exceeded the pread
limit. This is the wrong logic entirely. We are trying to prevent an
attempted call to file:pread/3 where the third parameter, the number
of bytes to read, is a very large number (due to a corruption
elsewhere, say). Instead we throw exceed_limit as soon as a file gets
above a certain size.

I switched this to an if statement to make it clear that the "read
past EOF" and "try to read too many bytes" checks are quite distinct
from each other.

8 days agoMerge pull request #1649 from apache/COUCHDB-3326-metrics-docs-purges
Peng Hui Jiang [Fri, 12 Oct 2018 06:38:24 +0000 (14:38 +0800)] 
Merge pull request #1649 from apache/COUCHDB-3326-metrics-docs-purges

Add document_purges counter for stats

8 days agoAdd document_purges counter for stats COUCHDB-3326-metrics-docs-purges 1649/head
jiangph [Thu, 11 Oct 2018 06:25:15 +0000 (14:25 +0800)] 
Add document_purges counter for stats


8 days agoMerge pull request #1652 from cloudant/restrict-active_tasks-to-server-admin
Eric Avdey [Thu, 11 Oct 2018 20:37:43 +0000 (17:37 -0300)] 
Merge pull request #1652 from cloudant/restrict-active_tasks-to-server-admin

Restrict access to `_active_tasks` to server admin

8 days agoRestrict access to _active_tasks to server admin 1652/head
Eric Avdey [Thu, 11 Oct 2018 19:00:59 +0000 (16:00 -0300)] 
Restrict access to _active_tasks to server admin

8 days agoMerge pull request #1650 from apache/bulk_get_users_db
Robert Newson [Thu, 11 Oct 2018 18:42:12 +0000 (19:42 +0100)] 
Merge pull request #1650 from apache/bulk_get_users_db

Pass user_ctx in _bulk_get

8 days agoPass user_ctx in _bulk_get 1650/head
Robert Newson [Thu, 11 Oct 2018 16:13:46 +0000 (17:13 +0100)] 
Pass user_ctx in _bulk_get

This fixes _bulk_get for _users db and probably others I don't know

9 days agoMerge pull request #1647 from cloudant/validate-prefix-for-systemdbs
iilyak [Wed, 10 Oct 2018 17:53:41 +0000 (10:53 -0700)] 
Merge pull request #1647 from cloudant/validate-prefix-for-systemdbs

Validate database prefix against DBNAME_REGEX for system dbs

9 days agoValidate database prefix against DBNAME_REGEX for system dbs 1647/head
ILYA Khlopotov [Mon, 8 Oct 2018 11:11:52 +0000 (04:11 -0700)] 
Validate database prefix against DBNAME_REGEX for system dbs

Previously we only checked that the suffix of the database is
matching one of the predefined system databases. We really should
check the prefix against DBNAME_REGEXP to prevent creation of
illegally named databases.

This fixes #1644

2 weeks agoUpdate rebar.config.script and travis CI
Paul J. Davis [Thu, 21 Jun 2018 21:28:56 +0000 (16:28 -0500)] 
Update rebar.config.script and travis CI

Fixes #1396

2 weeks agoFix use of process_info(Pid, monitored_by)
Paul J. Davis [Thu, 21 Jun 2018 21:23:32 +0000 (16:23 -0500)] 
Fix use of process_info(Pid, monitored_by)

This can now return references that are from NIFs monitoring the
process. This is important for the new file IO NIFs that monitor the
controlling process. For now we'll just take the easy way out by
filtering the references from our returned monitor lists.

Fixes #1396

2 weeks agoFix couch_log eunit tests
Paul J. Davis [Thu, 21 Jun 2018 17:44:32 +0000 (12:44 -0500)] 
Fix couch_log eunit tests

Fixes #1396

2 weeks agoEnable parameterized module calls
Paul J. Davis [Thu, 21 Jun 2018 22:16:33 +0000 (17:16 -0500)] 
Enable parameterized module calls

This is a temporary bandaid to allow us to continue using parameterized
modules with Erlang 21. We'll have to go back and modify every one of
these files to avoid that as well as figuring out how to upgrade
mochiweb to something that doesn't use parameterized modules by the time
they are fully removed from Erlang.

Fixes #1396

2 weeks agoDo not crash replicator on VDU function failure
Nick Vatamaniuc [Fri, 28 Sep 2018 18:15:19 +0000 (14:15 -0400)] 
Do not crash replicator on VDU function failure

Previously a user could insert a VDU function into one of the _replicator
databases such that it prevents the replicator application from updating
documents in that db. Replicator application would then crash and prevent
replications from running on the whole cluster.

To avoid crashing the replicator when saving documents, log the error
and return `{ok, forbidden}`. The return might seem odd but we are
asserting that forbidden is an OK value in this context and explicitly
handling it. This shape of the return also conforms to the expected
`{ok, _Rev}` result, noticing that `_Rev` is never actually used.

2 weeks agoadd test for 1612
ermouth [Fri, 28 Sep 2018 00:10:29 +0000 (03:10 +0300)] 
add test for 1612

2 weeks agojs rewrite send body
ermouth [Fri, 21 Sep 2018 17:52:30 +0000 (20:52 +0300)] 
js rewrite send body

Fixes #1612

2 weeks agoMake sure to start per-node rexi servers right away
Nick Vatamaniuc [Wed, 26 Sep 2018 17:08:45 +0000 (13:08 -0400)] 
Make sure to start per-node rexi servers right away

This ensures they will be ready to process requests as soon as the application
starts up. This should make the service available sooner and should help tests
which setup and tear down the services repeatedly, where it would avoid an
annoying retry-until-ready loop.

Per-node servers/buffers are started in the init method of the monitors. There
is not chance of deadlock there because per-node supervisors are started before
the monitors.

Issue #1625

2 weeks agoSwitch rexi server_per_node to true by default
Nick Vatamaniuc [Wed, 26 Sep 2018 14:00:27 +0000 (10:00 -0400)] 
Switch rexi server_per_node to true by default

This has been solid for years and when not enabled can be a performance

Fixes #1625

2 weeks agoAvoid restarting /_replicate jobs if parameters haven't changed
Nick Vatamaniuc [Tue, 2 Oct 2018 04:33:21 +0000 (00:33 -0400)] 
Avoid restarting /_replicate jobs if parameters haven't changed

This used to be the case before the scheduling replicator:

This is also how replications backed by a document in a _replicator db behave:

2 weeks agoImprove connection cleanup in replication connection pool
Nick Vatamaniuc [Tue, 2 Oct 2018 05:05:07 +0000 (01:05 -0400)] 
Improve connection cleanup in replication connection pool

Previously when an owner process crashed before it had a chance to release the
worker to the pool, the worker entry was simply deleted. In some cases that
was ok because ibrowse's inactivity timeout would kick in and connection would
stop itself. In other cases, as observed in practice with _changes feed
connection over TLS protocol, inactivity timeout would never fire, so these
deleted connections would slowly accumulate leaking memory and filling the
process table. TLS connection would keep an associated session
open as well making things even worse.

To prevent the connection leak, explicitly unlink and kill the worker.

3 weeks agoExplicit Python version in scripts
Adrien VergĂ© [Mon, 24 Sep 2018 14:19:09 +0000 (16:19 +0200)] 
Explicit Python version in scripts

Recent Linux distributions start defaulting to Python 3, and require
ambiguous scripts to be more explicit.
For example building for Fedora 30 (not released yet) fails with:

    ERROR: ambiguous python shebang in /opt/couchdb/bin/couchup:
    #!/usr/bin/env python. Change it to python3 (or python2) explicitly.

So this commit changes the four Python scripts to use `python2`.

Note: They seem to be Python-3-compatible, but I couldn't be sure. If
you know they are, please tell me, I'll change it to `python3`.

4 weeks agoMango match doc on co-ordinating node (#1609)
garren smith [Fri, 21 Sep 2018 11:53:40 +0000 (13:53 +0200)] 
Mango match doc on co-ordinating node (#1609)

* Mango match doc on co-ordinating node

This fixes an issue when doing a rolling upgrade of a CouchDB cluster
and adding commit a6bc72e the nodes that were not upgraded yet would
send through all the docs in the index and those would be passed through
to the user because the co-oridnator would assume it was matched at the
node level. This adds in a check to see if it has been matched at the
node level or not. And then performs a match if required.

4 weeks agoIgnore local nodes in read repair filtering
Nick Vatamaniuc [Wed, 19 Sep 2018 19:56:55 +0000 (15:56 -0400)] 
Ignore local nodes in read repair filtering

Previosly local node revisions were causing `badmatch` failures in read repair
filter. Node sequences already filtered out local nodes while NodeRevs didn't, so
during matching `{Node, NodeSeq} = lists:keyfind(Node, 1, NodeSeqs)` Node would
not be found in the list and crash.

Example of crash:

fabric_rpc:update_docs/3 error:{badmatch,false}

5 weeks agoMerge pull request #1601 from cloudant/log_file_path_on_crash
iilyak [Wed, 12 Sep 2018 20:41:27 +0000 (13:41 -0700)] 
Merge pull request #1601 from cloudant/log_file_path_on_crash

Implement couch_file:format_status to log filepath

5 weeks agoImplement couch_file:format_status to log filepath 1601/head
ILYA Khlopotov [Wed, 12 Sep 2018 20:01:54 +0000 (13:01 -0700)] 
Implement couch_file:format_status to log filepath

5 weeks agoMerge pull request #1593 from apache/couch-server-improvements
Russell Branca [Wed, 12 Sep 2018 18:12:14 +0000 (11:12 -0700)] 
Merge pull request #1593 from apache/couch-server-improvements

Couch server improvements

5 weeks agoDon't send update_lru messages when disabled couch-server-improvements 1593/head
Russell Branca [Tue, 4 Sep 2018 18:53:56 +0000 (18:53 +0000)] 
Don't send update_lru messages when disabled

The couchdb.update_lru_on_read setting controls whether couch_server
uses read requests as LRU update triggers. Unfortunately, the messages
for update_lru on reads are sent regardless of whether this is enabled
or disabled. While in principle this is harmless, and overloaded
couch_server pid can accumulate a considerable volume of these messages,
even when disabled. This patch prevents the caller from sending an
update_lru message when the setting is disabled.

5 weeks agoAdd read_concurrency options to couch_server ETS
Russell Branca [Tue, 4 Sep 2018 18:44:34 +0000 (18:44 +0000)] 
Add read_concurrency options to couch_server ETS

This adds the read_concurrency option to couch_server's ETS table for
couch_dbs which contains the references to open database handles. This
is an obvious improvement as all callers opening database pids interact
with this ETS table concurrently. Conversely, the couch_server pid is
the only writer, so no need for write_concurrency.

6 weeks agoAllow disabling off-heap messages
Nick Vatamaniuc [Thu, 6 Sep 2018 21:31:34 +0000 (17:31 -0400)] 
Allow disabling off-heap messages

Off-heap messages is an Erlang 19 feature:

It is adviseable to use that setting for processes which expect to receive a
lot of messages. CouchDB sets it for couch_server, couch_log_server and bunch
of others as well.

In some cases the off-heap behavior could alter the timing of message receives
and expose subtle bugs that have been lurking in the code for years. Or could
slightly reduce performance, so a safety measure allow disabling it.

6 weeks agoFix couch_server concurrency error
Paul J. Davis [Thu, 6 Sep 2018 16:01:07 +0000 (11:01 -0500)] 
Fix couch_server concurrency error

Its possible that a busy couch_server and a specific ordering and timing
of events can end up with an open_async message in the mailbox while a
new and unrelated open_async process is spawned. This change just ensure
that if we encounter any old messages in the mailbox that we ignore

The underlying issue here is that a delete request clears out the state
in our couch_dbs ets table while not clearing out state in the message
queue. In some fairly specific circumstances this leads to the message
on in the mailbox satisfying an ets entry for a newer open_async
process. This change just includes a match on the opener process.
Anything unmatched came before the current open_async request which
means it should be ignored.

6 weeks agoReproduce race condition in couch_server
Paul J. Davis [Wed, 5 Sep 2018 21:25:41 +0000 (16:25 -0500)] 
Reproduce race condition in couch_server

A rather uncommon bug found in production. Will write more as this is
just for show and tell.

For now this test case just demonstrates the issue that was discovered.
A fix is still being pondered.

6 weeks agoFix couch_server:terminate/2
Paul J. Davis [Wed, 5 Sep 2018 21:24:17 +0000 (16:24 -0500)] 
Fix couch_server:terminate/2

If couch_server terminates while there is an active open_async process
it will throw a function_clause exception because `couch_db:get_pid/1`
will fail due to the `#entry.db` member being undefined. Simple fix is
to just filter those out.

6 weeks agoMerge pull request #1568 from cloudant/log-changes-rewind-reasons
Peng Hui Jiang [Wed, 5 Sep 2018 03:39:18 +0000 (11:39 +0800)] 
Merge pull request #1568 from cloudant/log-changes-rewind-reasons

Log error when changes forced to rewind to beginning

6 weeks agoLog warning when changes seq rewinds to 0 1568/head
Jay Doane [Wed, 5 Sep 2018 02:10:15 +0000 (19:10 -0700)] 
Log warning when changes seq rewinds to 0

7 weeks agoMerge pull request #1591 from apache/create-shards-if-missing
Robert Newson [Thu, 30 Aug 2018 18:37:32 +0000 (19:37 +0100)] 
Merge pull request #1591 from apache/create-shards-if-missing

Create shard files if missing

7 weeks agoCreate shard files if missing 1591/head
Robert Newson [Thu, 30 Aug 2018 17:25:47 +0000 (18:25 +0100)] 
Create shard files if missing

If, when a database is created, it was not possible to create any of
the shard files, the database cannot be used. All requests return a
"No DB shards could be opened." error.

This commit changes fabric_util:get_db/2 to create the shard file if
missing. This is correct as that function has already called
mem3:shards(DbName) which only returns shards if the database exists.

7 weeks agoCheck if db exists in /db/_ensure_full_commit call (#1588)
Eric Avdey [Thu, 30 Aug 2018 12:40:00 +0000 (09:40 -0300)] 
Check if db exists in /db/_ensure_full_commit call (#1588)

We removed a security call in `do_db_req` to avoid
a duplicate authorization check and as a result
there are now no db validation in noop call
`/db/_ensure_full_commit`. This makes it always
return a success code, even for missing databases.

This fix places the security check back, directly
in _ensure_full_commit call and adds eunit tests
for a good measure.

7 weeks agoMerge pull request #1590 from cloudant/add-mem3-ping
iilyak [Thu, 30 Aug 2018 12:10:43 +0000 (05:10 -0700)] 
Merge pull request #1590 from cloudant/add-mem3-ping

Implement convinience `mem3:ping/2` function

7 weeks agoImplement convinience `mem3:ping/2` function 1590/head
ILYA Khlopotov [Wed, 29 Aug 2018 20:47:43 +0000 (13:47 -0700)] 
Implement convinience `mem3:ping/2` function

Sometimes in operations it is helpful to re-establish connection between
erlang nodes. Usually it is achieved by calling `net_adm:ping/1`. However
the `ping` function provided by OTP uses `infinity` timeout. Which causes
indefinite hang in some cases. This PR adds convinience function to be
used instead of `net_adm:ping/1`.

7 weeks agoMerge pull request #1586 from cloudant/improve-cleanup_index_files
iilyak [Thu, 30 Aug 2018 11:05:24 +0000 (04:05 -0700)] 
Merge pull request #1586 from cloudant/improve-cleanup_index_files

Improve cleanup_index_files

7 weeks agoImprove cleanup_index_files 1586/head
ILYA Khlopotov [Wed, 29 Aug 2018 13:07:20 +0000 (06:07 -0700)] 
Improve cleanup_index_files

The previous implementation was based on a search using


This wildcard includes all shards for all indexes of all databases.
This PR changes the search to look at index_directory of a database.

7 weeks agoMerge pull request #1581 from apache/1580-shard-record-violation
Peng Hui Jiang [Tue, 28 Aug 2018 01:31:21 +0000 (09:31 +0800)] 
Merge pull request #1581 from apache/1580-shard-record-violation

Fix dialyzer warning of shard record construction

7 weeks agoFix dialyzer warning of shard record construction 1581/head
jiangph [Mon, 27 Aug 2018 13:24:47 +0000 (21:24 +0800)] 
Fix dialyzer warning of shard record construction

   - Fix dialyzer warning that record construction #shard violates
     the declared type in fabric_doc_open_revs.erl,
     cpse_test_purge_replication.erl and other files

Fixes #1580

7 weeks agoMerge pull request #1582 from apache/improve-dbcreate-validation
Robert Newson [Mon, 27 Aug 2018 17:16:56 +0000 (18:16 +0100)] 
Merge pull request #1582 from apache/improve-dbcreate-validation

Improve validation of database creation parameters

7 weeks agoImprove validation of database creation parameters 1582/head
Robert Newson [Mon, 27 Aug 2018 15:11:43 +0000 (16:11 +0100)] 
Improve validation of database creation parameters

8 weeks agoMerge pull request #1576 from apache/1573-export-all-for-pse-test
Peng Hui Jiang [Fri, 24 Aug 2018 03:03:29 +0000 (11:03 +0800)] 
Merge pull request #1576 from apache/1573-export-all-for-pse-test

Fix make warning from cpse_test_purge_seqs.erl

8 weeks agoFix make warning from cpse_test_purge_seqs.erl 1576/head
jiangph [Thu, 23 Aug 2018 05:52:34 +0000 (13:52 +0800)] 
Fix make warning from cpse_test_purge_seqs.erl

Fixes #1572

8 weeks agoFix builtin _sum reduce function
Paul J. Davis [Wed, 22 Aug 2018 19:54:31 +0000 (14:54 -0500)] 
Fix builtin _sum reduce function

The builting _sum reduce function has no protection against overflowing
reduce values. Users can emit objects with enough unique keys to cause
the builtin _sum to create objects that are exceedingly large in the
inner nodes of the view B+Tree.

This change adds the same logic that applies to JavaScript reduce
functions to check if a reduce function is properly reducing its input.

8 weeks agoSwitch rexi_sup restart strategy to rest_for_one
Nick Vatamaniuc [Tue, 21 Aug 2018 22:35:28 +0000 (18:35 -0400)] 
Switch rexi_sup restart strategy to rest_for_one

Previously, as described in issue #1571, `rexi_server_sup` supervisor could die
and restart. After it restarts `rexi_server_mon` would not respan rexi servers
as it wouldn't notice `rexi_server_sup` went away and come back. That would
leave the cluster in a disabled state.

To fix the issue, switch restart strategy to `rest_for_one`. In this case, if a
child at the top dies it will restart all the children below it in the list.
For example, if `rexi_server` dies, it will restart all the children. If
`rexi_server_sup` dies, it will restart `rexi_server_mon`. And then on restart
`rexi_server_mon` will properly spawn all the rexi servers.

Same for the buffers, if `rexi_buffer_sup` dies, it will restart `rexi_buffer_mon`
and on restart it will spawn buffers as expected.

Fixes: #1571

8 weeks agoMerge pull request #1370 from apache/COUCHDB-3326-clustered-purge-pr5-implementation
Peng Hui Jiang [Tue, 21 Aug 2018 17:31:35 +0000 (01:31 +0800)] 
Merge pull request #1370 from apache/COUCHDB-3326-clustered-purge-pr5-implementation

[5/5] Clustered Purge Implementation

8 weeks ago[10/10] Clustered Purge: Clustered HTTP API COUCHDB-3326-clustered-purge-pr5-implementation 1370/head
Paul J. Davis [Tue, 24 Apr 2018 17:27:58 +0000 (12:27 -0500)] 
[10/10] Clustered Purge: Clustered HTTP API

The HTTP API for clustered purge is fairly straightforward. It is
designed to match the general shape of the single node API. The only
major caveat here is that the purge sequence is now hardcoded as null
since the purge sequence would now otherwise be an opaque blob similar
to the update_seq blobs.

Its important to note that there is as yet no API invented for
traversing the history of purge requests in any shape or form as that
would mostly invalidate the entire purpose of using purge to remove any
trace of a document from a database at the HTTP level. Although there
will still be traces in individual shard files until all database
components have processed the purge and compaction has run (while
allowing for up to purge_infos_limit requests to remain available in


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[09/10] Clustered Purge: Fabric API
Paul J. Davis [Tue, 24 Apr 2018 17:27:43 +0000 (12:27 -0500)] 
[09/10] Clustered Purge: Fabric API

This commit implements the clustered API for performing purge requests.
This change should be a fairly straightforward change for anyone already
familiar with the general implementation of a fabric coordinator given
that the purge API is fairly simple.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[08/10] Clustered Purge: Update read-repair
Paul J. Davis [Wed, 30 May 2018 22:26:02 +0000 (17:26 -0500)] 
[08/10] Clustered Purge: Update read-repair

Read-repair needs to know which nodes have requested an update to a
local doc so that it can determine if the update is applied. The basic
idea here is that we may have gotten an update from a remote node that
has yet to apply a purge request. If the local node were to apply this
update it would effectively undo a succesful purge request.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[07/10] Clustered Purge: Internal replication
Paul J. Davis [Tue, 24 Apr 2018 17:27:14 +0000 (12:27 -0500)] 
[07/10] Clustered Purge: Internal replication

This commit implements the internal replication of purge requests. This
part of the anit-entropy process is important for ensuring that shard
copies continue to be eventually consistent even if updates happen to
shards independently due to a network split or other event that prevents
the successful purge request to a given copy.

The main addition to internal replication is that we both pull and push
purge requests between the source and target shards. The push direction
is obvious given that internal replication is in the push direction
already. Pull isn't quite as obvious but is required so that we don't
push an update that was already purged on the target.

Of note is that internal replication also has to maintain _local doc
checkpoints to prevent compaction removing old purge requests or else
shard copies could end up missing purge requests which would prevent the
shard copies from ever reaching a consistent state.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[06/10] Clustered Purge: Update mrview indexes
Paul J. Davis [Tue, 24 Apr 2018 17:26:42 +0000 (12:26 -0500)] 
[06/10] Clustered Purge: Update mrview indexes

This commit updates the mrview secondary index to properly process the
new history of purge requests as well as to store the _local purge
checkpoint doc.

The importance of the _local checkpoint doc is to ensure that compaction
of a database does not remove any purge requests that have not yet been
processed by this secondary index.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[05/10] Clustered Purge: Add upgrade tests
jiangph [Tue, 10 Jul 2018 06:58:49 +0000 (14:58 +0800)] 
[05/10] Clustered Purge: Add upgrade tests

These test that we can successfully upgrade old databases that have
various configurations of purge requests in the legacy format.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[04/10] Clustered Purge: Update couch_pse_tests
Paul J. Davis [Wed, 30 May 2018 21:13:08 +0000 (16:13 -0500)] 
[04/10] Clustered Purge: Update couch_pse_tests

This updates the couch_pse_tests to account for the new purge APIs as
well as introduces a bunch of new tests for covering the new APIs.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[03/10] Clustered Purge: Update couch_bt_engine
Paul J. Davis [Tue, 24 Apr 2018 17:25:43 +0000 (12:25 -0500)] 
[03/10] Clustered Purge: Update couch_bt_engine

This commit updates the couch_bt_engine storage engine implementation to
satisfy the newly defined single-node purge APIs. This is accomplished
by storing two new database btrees.

The purge_seq_tree orders purge requests by their purge_seq. This tree
is used to satisfy the fold_purge_infos API for database components to
enumerate the list of purge requests in a defined order.

The second index is the purge_tree which orders purge requests by their
UUID to make for an efficient lookup when filtering replicated purge


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[02/10] Clustered Purge: Update single node APIs
Paul J. Davis [Tue, 24 Apr 2018 17:24:10 +0000 (12:24 -0500)] 
[02/10] Clustered Purge: Update single node APIs

This patch updates the single node API implementations for use with the
new clustered purge API. At the single node level the major change is to
store a history of purge requests that can then be consumed by various
other parts of the database system.

The simpler of the major areas to use this new functionality will be any
secondary indices. Rather than checking that only a single purge request
has occurred each secondary index will store a _local document
referencing its oldest processed purge request. During index updates
each secondary index implementation will process any new purge requests
and update its local doc checkpoint. In this way secondary indexes will
no longer be sensitive to reset when multiple purge requests are issued
against the database.

The two other major areas that will make use of the newly stored purge
request history are both of the anit-entropy mechanisms: read-repair and
internal replication.

Read-repair will use the purge request history to know when a node
should discard updates that have come from a node that has not yet
processed a purge request during internal replication. Otherwise
read-repair would effectively undo any purge replication that happened

Internal replication will use the purge request history to be able to
mend any differences between shards. For instance, if a shard is down
when a purge request is issue against a cluster this process will pull
the purge request and apply it during internal replication. And
similarly any local purge requests will be applied on the target before
normal internal replication.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks ago[01/10] Clustered Purge: Define new purge API
Paul J. Davis [Tue, 24 Apr 2018 17:23:16 +0000 (12:23 -0500)] 
[01/10] Clustered Purge: Define new purge API

This is the first of a series of commits to implement the new clustered
purge API. Currently purge is a single-node only API that allows for
removing document revisions (and by extension entire documents)
completely from a database. However, given our anti-entropy measures
this API is extremely difficult to use in a cluster and requires
significant operator intervention.

Along with the operator intervention, this API is inherently unsafe with
regards to accidentally triggering the rebuild of secondary indices. As
such this patch set is aimed at creating a cluster aware API that is
both easier to use and less likely to cause application downtime while
secondary indices are rebuilt.

There are four major areas that will be covered by this patch set:

  1. Single node APIs and behavior changes
  2. Cluster aware APIs
  3. Anti-entropy updates
  4. Cluster HTTP implementation

This patch set is split up into a series of commits to aid in the review
by other commiters that will hopefully allow for a logical and intuitive
progression of implementation rather than landing as a single opaque
commit covering a huge swath of the code base.


Co-authored-by: Mayya Sharipova <>
Co-authored-by: jiangphcn <>
8 weeks agoMerge pull request #1369 from apache/COUCHDB-3326-clustered-purge-pr4-on-compact...
Peng Hui Jiang [Tue, 21 Aug 2018 16:53:20 +0000 (00:53 +0800)] 
Merge pull request #1369 from apache/COUCHDB-3326-clustered-purge-pr4-on-compact-plugin

[4/5] Clustered Purge: Add on_compact EPI hook

8 weeks agoCreate new on_compact trigger COUCHDB-3326-clustered-purge-pr4-on-compact-plugin 1369/head
Paul J. Davis [Wed, 30 May 2018 19:34:44 +0000 (14:34 -0500)] 
Create new on_compact trigger

This trigger allows any storage engine that makes use of compaction to
notify that compaction is starting. This is preparatory work for
clustered indexes so that existing indexes are allowed to ensure they
have a clustered purge local doc before compaction runs.


Co-Authored-By: jiangphcn <>
8 weeks agoMerge pull request #1368 from apache/COUCHDB-3326-clustered-purge-pr3-refactor-pse...
Peng Hui Jiang [Tue, 21 Aug 2018 16:04:43 +0000 (00:04 +0800)] 
Merge pull request #1368 from apache/COUCHDB-3326-clustered-purge-pr3-refactor-pse-tests

[3/5] Clustered Purge - Rewrite pluggable storage engine tests

8 weeks agoEnhance PSE tests with setup/teardown functions COUCHDB-3326-clustered-purge-pr3-refactor-pse-tests 1368/head
Paul J. Davis [Wed, 23 May 2018 20:31:08 +0000 (15:31 -0500)] 
Enhance PSE tests with setup/teardown functions

8 weeks agoUpdate to use new couch_pse_tests app
Paul J. Davis [Wed, 23 May 2018 19:31:26 +0000 (14:31 -0500)] 
Update to use new couch_pse_tests app

8 weeks agoUpdate PSE test definitions for new util module
Paul J. Davis [Wed, 23 May 2018 19:28:32 +0000 (14:28 -0500)] 
Update PSE test definitions for new util module

8 weeks agoRename PSE test modules
Paul J. Davis [Wed, 23 May 2018 19:23:07 +0000 (14:23 -0500)] 
Rename PSE test modules

8 weeks agoMove PSE tests to their own app
Paul J. Davis [Fri, 4 May 2018 13:55:33 +0000 (08:55 -0500)] 
Move PSE tests to their own app

8 weeks agoRewrite the PSE test suite to use couch_server
Paul J. Davis [Thu, 26 Apr 2018 16:41:01 +0000 (11:41 -0500)] 
Rewrite the PSE test suite to use couch_server

It turns out that if any storage engine has to open itself during
a callback it would end up violating the guarantee of a single writer.
This change in the test suite changes things to use couch_server so that
storage engines are now free to do as they want reopening themselves.

8 weeks agoMerge pull request #1570 from apache/COUCHDB-3326-clustered-purge-pr2-simplify-mem3-rep
Peng Hui Jiang [Tue, 21 Aug 2018 15:28:15 +0000 (23:28 +0800)] 
Merge pull request #1570 from apache/COUCHDB-3326-clustered-purge-pr2-simplify-mem3-rep

Simplify logic in mem3_rep

8 weeks agoSimplify logic in mem3_rep COUCHDB-3326-clustered-purge-pr2-simplify-mem3-rep 1570/head
Paul J. Davis [Wed, 21 Mar 2018 17:23:47 +0000 (12:23 -0500)] 
Simplify logic in mem3_rep

Previously there were two separate database references and it was not
clear which was used where. This simplifies things by reducing it to a
single instance so that the logic is simpler.

8 weeks agoMerge pull request #1366 from apache/COUCHDB-3326-clustered-purge-pr1-misc-cleanup
Peng Hui Jiang [Tue, 21 Aug 2018 14:16:50 +0000 (22:16 +0800)] 
Merge pull request #1366 from apache/COUCHDB-3326-clustered-purge-pr1-misc-cleanup

[1/5] Clustered Purge - Misc Cleanup

8 weeks agoUpdate fabric_doc_open eunit tests 1366/head
Paul J. Davis [Wed, 23 May 2018 17:32:48 +0000 (12:32 -0500)] 
Update fabric_doc_open eunit tests

Modernize and fix the eunit tests in fabric_doc_open.erl

8 weeks agoFix race on couch_db:reopen/1
Paul J. Davis [Thu, 26 Apr 2018 16:39:58 +0000 (11:39 -0500)] 
Fix race on couch_db:reopen/1

This fixes a minor race by opening the database before closing it. This
was never found to be an issue in production and was just caught while
contemplating the PSE test suite.

8 weeks agoFix default security object handling
Paul J. Davis [Thu, 26 Apr 2018 16:38:24 +0000 (11:38 -0500)] 
Fix default security object handling

There's a race where if a database is opened with a default_security set
and it crashes before first compact, and is then reopened after the
default_security option has changed that it will pick the second
security option. This change fixes the relatively obscure bug
that was only found during testing.

8 weeks agoFix bug during purge
Paul J. Davis [Thu, 26 Apr 2018 16:36:49 +0000 (11:36 -0500)] 
Fix bug during purge

8 weeks agoFix typos in couch_db_engine.erl
Paul J. Davis [Fri, 5 Feb 2016 17:49:34 +0000 (11:49 -0600)] 
Fix typos in couch_db_engine.erl

2 months agoMerge pull request #1543 from cloudant/implement-node-restart
iilyak [Thu, 16 Aug 2018 16:56:18 +0000 (09:56 -0700)] 
Merge pull request #1543 from cloudant/implement-node-restart

Add `POST /_node/$node/_restart` endpoint

2 months agoRemove no longer needed handle_restart_req handler 1543/head
ILYA Khlopotov [Wed, 15 Aug 2018 14:33:22 +0000 (07:33 -0700)] 
Remove no longer needed handle_restart_req handler

2 months agoRemove _restart endpoint from non-clustered interface
ILYA Khlopotov [Wed, 15 Aug 2018 13:49:25 +0000 (06:49 -0700)] 
Remove _restart endpoint from non-clustered interface

2 months agoRemove special handling of 'restart' from 'test/javascript/run'
ILYA Khlopotov [Wed, 15 Aug 2018 11:10:31 +0000 (04:10 -0700)] 
Remove special handling of 'restart' from 'test/javascript/run'

2 months agoUse "/_node/<node>/_restart" from JavaScript tests
ILYA Khlopotov [Wed, 15 Aug 2018 10:56:42 +0000 (03:56 -0700)] 
Use "/_node/<node>/_restart" from JavaScript tests

2 months agoCalculate uptime since application start instead of a beam start
ILYA Khlopotov [Wed, 15 Aug 2018 10:55:06 +0000 (03:55 -0700)] 
Calculate uptime since application start instead of a beam start

2 months agoAdd `POST /_node/$node/_restart` endpoint
ILYA Khlopotov [Tue, 7 Aug 2018 19:01:31 +0000 (12:01 -0700)] 
Add `POST /_node/$node/_restart` endpoint

We need to be able to restart CouchDB from integration test suite.
We used to have this feature, but it was removed.
This PR brings this functionality back under `/_node/$node/_restart`.

2 months agoReduce size of #leaf.atts keys
Nick Vatamaniuc [Wed, 15 Aug 2018 19:23:52 +0000 (15:23 -0400)] 
Reduce size of #leaf.atts keys

`#leaf.atts` data structure is a `[{Position, AttachmentLength}, ...]` proplist
which keeps track of attachment lengths and it is used when calculating
external data size of documents. `Position` is supposed to uniquely identify an
attachment in a file stream. Initially it was just an integer file offset. Then,
after some refactoring work it became a list of `{Position, Size}` tuples.

During the PSE work streams were abstracted such that each engine can supply
its own stream implementation. The position in the stream then became a tuple
that looks like `{couch_bt_engine_stream,{<0.1922.0>,[{4267,21}]}}`. This was
written to the file the `#leaf.atts` data structure. While still correct, it is
unnecessarily verbose wasting around 100 bytes per attachment, per leaf.

To fix it use the disk serialized version of the stream position as returned
from `couch_stream:to_disk_term`. In case of the default CouchDB engine
implementation, this should avoid writing the module name and the pid value for
each attachment entry.

2 months agoMerge pull request #1486 from cloudant/fix-doc-update-case-clause
iilyak [Wed, 15 Aug 2018 19:23:58 +0000 (12:23 -0700)] 
Merge pull request #1486 from cloudant/fix-doc-update-case-clause

Expose document update errors to client

2 months agoExpose document update errors to client 1486/head
Jay Doane [Sat, 4 Aug 2018 00:01:32 +0000 (17:01 -0700)] 
Expose document update errors to client

Currently, errors resulting from race conditions during document updates
don't get handled correctly, result in a case error, and sending a 500
to the client.

This change instead allows errors, which occur in the race to sync
a doc update across the cluster, to be exposed to the client.

2 months agoFix session based replicator auth when endpoints have require_valid_user set
Nick Vatamaniuc [Thu, 9 Aug 2018 20:05:04 +0000 (16:05 -0400)] 
Fix session based replicator auth when endpoints have require_valid_user set

If _session response is 401 and WWW-Authentication header is set assume
endpoint has require_valid_user set. Remember that in the state and
retry to reinitialize again. If it succeeds, keep sending basic auth
creds with every subsequent _session request.

Since session uses the replicator worker pool, it needs to handle worker
cleanup properly just like couch_replicator_httpc module does. If response
headers indicate the connection will be closed, don't recycle it back to the
pool, otherwise during an immediate retry there will be a connection_closing
error, instead follow what the server indicated and stop the worker then
release it to the pool. The pool already knows how to handle dead worker
processes. This is needed with this commit, because we now have a pattern of an
immediate retry after an auth failure.

Fixes #1550

2 months agoMerge pull request #1553 from apache/ref-match-1544
Robert Newson [Fri, 10 Aug 2018 16:05:40 +0000 (17:05 +0100)] 
Merge pull request #1553 from apache/ref-match-1544

Ensure we only receive the correct DOWN message