summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lehnardt <jan@apache.org>2020-07-02 21:06:24 +0200
committerJan Lehnardt <jan@apache.org>2020-07-02 21:13:36 +0200
commitebb06f10d66a2951095854f33b745b6b76079aad (patch)
tree37aa41717d7463b5c2093c554137bf1153718fc2
parentc88fb288b29a8b00ca3ba0bed5d28b7654c70f12 (diff)
downloadcouchdb-fix/gen-server-timeout-on-ioq-bypass-3.x.tar.gz
fix: set gen_server:call() timeout to infinity on ioq bypassfix/gen-server-timeout-on-ioq-bypass-3.x
Before the bypass existed, ioq would call `gen_server:call()` on hehalf of it calling module with the queueing logic in between. Commit e641a740 introduced a way to bypass any queues, but the delegated `gen_server:call()` there was added without a timeout parameter, leading to a default timeout of 5000ms. A problem manifests here when operations that are sent through ioq that take longer than that 5000ms timeout. In practice, these operations should be very rare and this timeout should be a help on overloaded systems. However, one sure-fire way to cause an issue on an otherwise idle machine is raise the max_document_size and store unreasonably large documents, think 50MB+ of raw JSON). Not that we recommend this, but folks have run this fine on 2.x before the ioq changes and it isn’t too hard to support here. By adding an `infinity` timeout delegated `gen_server:call()` in the queue bypasse case, this no longer applies. Thanks to Joan @woahli Touzet, Bob @rnewson Newson and Paul @davisp Davis for helping to track this down.
-rw-r--r--src/ioq/src/ioq.erl2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/ioq/src/ioq.erl b/src/ioq/src/ioq.erl
index 81d94a36f..99b3ce385 100644
--- a/src/ioq/src/ioq.erl
+++ b/src/ioq/src/ioq.erl
@@ -45,7 +45,7 @@ call(Fd, Msg, Metadata) ->
Priority = io_class(Msg, Metadata),
case bypass(Priority) of
true ->
- gen_server:call(Fd, Msg);
+ gen_server:call(Fd, Msg, infinity);
false ->
queued_call(Fd, Msg, Priority)
end.