You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2020/07/02 19:14:14 UTC

[couchdb] branch fix/gen-server-timeout-on-ioq-bypass created (now da20ca8)

This is an automated email from the ASF dual-hosted git repository.

jan pushed a change to branch fix/gen-server-timeout-on-ioq-bypass
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


      at da20ca8  fix: set gen_server:call() timeout to infinity on ioq bypass

This branch includes the following new commits:

     new da20ca8  fix: set gen_server:call() timeout to infinity on ioq bypass

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[couchdb] 01/01: fix: set gen_server:call() timeout to infinity on ioq bypass

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jan pushed a commit to branch fix/gen-server-timeout-on-ioq-bypass
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit da20ca8150044ae990206ef4817b3f123a27f1e2
Author: Jan Lehnardt <ja...@apache.org>
AuthorDate: Thu Jul 2 21:06:24 2020 +0200

    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.
---
 src/ioq/src/ioq.erl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ioq/src/ioq.erl b/src/ioq/src/ioq.erl
index 81d94a3..99b3ce3 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.