diff options
author | Jan Lehnardt <jan@apache.org> | 2020-07-02 21:06:24 +0200 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2020-07-03 18:32:22 +0200 |
commit | ace7e68951eb0cd57740cbb6086054a1174141d5 (patch) | |
tree | 37aa41717d7463b5c2093c554137bf1153718fc2 | |
parent | c88fb288b29a8b00ca3ba0bed5d28b7654c70f12 (diff) | |
download | couchdb-ace7e68951eb0cd57740cbb6086054a1174141d5.tar.gz |
fix: set gen_server:call() timeout to infinity 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.erl | 2 |
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. |