My memory is fuzzy, but those items sound a lot like what happens with rex, 
that motivated us (i.e, Adam) to build rexi, which deliberately does less than 
the stock approach.

-- 
  Robert Samuel Newson
  rnew...@apache.org

On Mon, 22 Apr 2019, at 18:33, Nick Vatamaniuc wrote:
> Hi everyone,
> 
> We partially implement the first part (cleaning rexi workers) for all 
> the
> fabric streaming requests. Which should be all_docs, changes, view map,
> view reduce:
> https://github.com/apache/couchdb/commit/632f303a47bd89a97c831fd0532cb7541b80355d
> 
> The pattern there is the following:
> 
>  - With every request spawn a monitoring process that is in charge of
> keeping track of all the workers as they are spawned.
>  - If regular cleanup takes place, then this monitoring process is killed,
> to avoid sending double the number of kill messages to workers.
>  - If the coordinating process doesn't run cleanup and just dies, the
> monitoring process will performs cleanup on its behalf.
> 
> Cheers,
> -Nick
> 
> 
> 
> On Thu, Apr 18, 2019 at 5:16 PM Robert Samuel Newson <rnew...@apache.org>
> wrote:
> 
> > My view is a) the server was unavailable for this request due to all the
> > other requests it’s currently dealing with b) the connection was not idle,
> > the client is not at fault.
> >
> > B.
> >
> > > On 18 Apr 2019, at 22:03, Done Collectively <sans...@inator.biz> wrote:
> > >
> > > Any reason 408 would be undesirable?
> > >
> > > https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408
> > >
> > >
> > > On Thu, Apr 18, 2019 at 10:37 AM Robert Newson <rnew...@apache.org>
> > wrote:
> > >
> > >> 503 imo.
> > >>
> > >> --
> > >>  Robert Samuel Newson
> > >>  rnew...@apache.org
> > >>
> > >> On Thu, 18 Apr 2019, at 18:24, Adam Kocoloski wrote:
> > >>> Yes, we should. Currently it’s a 500, maybe there’s something more
> > >> appropriate:
> > >>>
> > >>>
> > >>
> > https://github.com/apache/couchdb/blob/8ef42f7241f8788afc1b6e7255ce78ce5d5ea5c3/src/chttpd/src/chttpd.erl#L947-L949
> > >>>
> > >>> Adam
> > >>>
> > >>>> On Apr 18, 2019, at 12:50 PM, Joan Touzet <woh...@apache.org> wrote:
> > >>>>
> > >>>> What happens when it turns out the client *hasn't* timed out and we
> > >>>> just...hang up on them? Should we consider at least trying to send
> > back
> > >>>> some sort of HTTP status code?
> > >>>>
> > >>>> -Joan
> > >>>>
> > >>>> On 2019-04-18 10:58, Garren Smith wrote:
> > >>>>> I'm +1 on this. With partition queries, we added a few more timeouts
> > >> that
> > >>>>> can be enabled which Cloudant enable. So having the ability to shed
> > >> old
> > >>>>> requests when these timeouts get hit would be great.
> > >>>>>
> > >>>>> Cheers
> > >>>>> Garren
> > >>>>>
> > >>>>> On Tue, Apr 16, 2019 at 2:41 AM Adam Kocoloski <kocol...@apache.org>
> > >> wrote:
> > >>>>>
> > >>>>>> Hi all,
> > >>>>>>
> > >>>>>> For once, I’m coming to you with a topic that is not strictly about
> > >>>>>> FoundationDB :)
> > >>>>>>
> > >>>>>> CouchDB offers a few config settings (some of them undocumented) to
> > >> put a
> > >>>>>> limit on how long the server is allowed to take to generate a
> > >> response. The
> > >>>>>> trouble with many of these timeouts is that, when they fire, they do
> > >> not
> > >>>>>> actually clean up all of the work that they initiated. A couple of
> > >> examples:
> > >>>>>>
> > >>>>>> - Each HTTP response coordinated by the “fabric” application spawns
> > >>>>>> several ephemeral processes via “rexi" on different nodes in the
> > >> cluster to
> > >>>>>> retrieve data and send it back to the process coordinating the
> > >> response. If
> > >>>>>> the request timeout fires, the coordinating process will be killed
> > >> off, but
> > >>>>>> the ephemeral workers might not be. In a healthy cluster they’ll
> > >> exit on
> > >>>>>> their own when they finish their jobs, but there are conditions
> > >> under which
> > >>>>>> they can sit around for extended periods of time waiting for an
> > >> overloaded
> > >>>>>> gen_server (e.g. couch_server) to respond.
> > >>>>>>
> > >>>>>> - Those named gen_servers (like couch_server) responsible for
> > >> serializing
> > >>>>>> access to important data structures will dutifully process messages
> > >>>>>> received from old requests without any regard for (of even knowledge
> > >> of)
> > >>>>>> the fact that the client that sent the message timed out long ago.
> > >> This can
> > >>>>>> lead to a sort of death spiral in which the gen_server is ultimately
> > >>>>>> spending ~all of its time serving dead clients and every client is
> > >> timing
> > >>>>>> out.
> > >>>>>>
> > >>>>>> I’d like to see us introduce a documented maximum request duration
> > >> for all
> > >>>>>> requests except the _changes feed, and then use that information to
> > >> aid in
> > >>>>>> load shedding throughout the stack. We can audit the codebase for
> > >>>>>> gen_server calls with long timeouts (I know of a few on the critical
> > >> path
> > >>>>>> that set their timeouts to `infinity`) and we can design servers
> > that
> > >>>>>> efficiently drop old requests, knowing that the client who made the
> > >> request
> > >>>>>> must have timed out. A couple of topics for discussion:
> > >>>>>>
> > >>>>>> - the “gen_server that sheds old requests” is a very generic
> > >> pattern, one
> > >>>>>> that seems like it could be well-suited to its own behaviour. A
> > >> cursory
> > >>>>>> search of the internet didn’t turn up any prior art here, which
> > >> surprises
> > >>>>>> me a bit. I’m wondering if this is worth bringing up with the
> > broader
> > >>>>>> Erlang community.
> > >>>>>>
> > >>>>>> - setting and enforcing timeouts is a healthy pattern for read-only
> > >>>>>> requests as it gives a lot more feedback to clients about the health
> > >> of the
> > >>>>>> server. When it comes to updates things are a little bit more muddy,
> > >> just
> > >>>>>> because there remains a chance that an update can be committed, but
> > >> the
> > >>>>>> caller times out before learning of the successful commit. We should
> > >> try to
> > >>>>>> minimize the likelihood of that occurring.
> > >>>>>>
> > >>>>>> Cheers, Adam
> > >>>>>>
> > >>>>>> P.S. I did say that this wasn’t _strictly_ about FoundationDB, but
> > of
> > >>>>>> course FDB has a hard 5 second limit on all transactions, so it is a
> > >> bit of
> > >>>>>> a forcing function :).Even putting FoundationDB aside, I would still
> > >> argue
> > >>>>>> to pursue this path based on our Ops experience with the current
> > >> codebase.
> > >>>>>
> > >>>>
> > >>>
> > >>>
> > >>
> >
> >
>

Reply via email to