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:06:24 +0200
commitda20ca8150044ae990206ef4817b3f123a27f1e2 (patch)
tree961c5650b9e27ce8697c6471b0ea6565e47b407b
parenteaf6e744bf286cdca8b07ea63303dd3920bcff2a (diff)
downloadcouchdb-fix/gen-server-timeout-on-ioq-bypass.tar.gz
fix: set gen_server:call() timeout to infinity on ioq bypassfix/gen-server-timeout-on-ioq-bypass
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.