On Wednesday, 14 September 2016 00:18:26 UTC+3, Evan Digby wrote:
>
> Hi Egon,
>
> My requirements are more simple than a graceful http shutdown. I simply 
> require that everything that enters the RLock completes to RUnlock. 
> Accepted requests, or even calls to servehttp can die without issue as long 
> as they haven't entered the processing in the RLock.
>

In that case https://play.golang.org/p/RiFEbQvytP. *Ps. Still tired, may 
contain bugs.*


> If the server crashes we have ways to deal with that, but it's a more 
> DevOps-y process. Recovering from logging, etc.,and should be an edge case 
> that I'm not worried about handling in code. 
>
> If the handler gets stuck in a loop, we will see that in our logging. I 
> don't want the server to die in that case. I want it to keep retrying (we 
> have exponential backoff) and informing us via structured logging of what's 
> going on. If it's an unanticipated loop/block, then there will be a manual 
> investigation into the server's state before we manually kill the process. 
> At that point it becomes similar to the last point, except easier because 
> we already know the state the message was in.
>
> In our use case we will always exit shortly after a close. It's safe to 
> assume the process will die after close returns.
>
> Thanks again,
>
> Evan
>
> On Tue, 13 Sep 2016 at 14:08 Egon <egon...@gmail.com <javascript:>> wrote:
>
>> On Tuesday, 13 September 2016 23:31:55 UTC+3, Evan Digby wrote:
>>>
>>> Hi John/Egon/Augusto,
>>>
>>> I should point out is that all we need to guarantee (barring abnormal 
>>> termination of course) is that once a task starts processing, it finishes. 
>>> Partially processed messages are bad, but http requests that don't result 
>>> in a message being processed at all are okay.
>>>
>>> We don't need to guarantee that the result of every Accept in the HTTP 
>>> server results in a processed message. We handle this on the OPS side by 
>>> ensuring we stop sending requests to that instance before terminating the 
>>> process. We just want to make sure, at that point, that the messages which 
>>> did make it to the handler are flushed.
>>>
>>> So the case where:
>>>
>>> h.Handle(...)  <-- gets past the closed channel check, calls go ..., butthe 
>>> goroutine doesn't execute yet.
>>> h.Close() <-- closes the close channel, Locks and Unlocks,returns.
>>> ...now the goroutine executes and acquires the read lock.
>>>
>>> We actually don't care if "Handle" completes in this example. We only 
>>> care if that our task handler starts processing a message that it completes 
>>> the processing.
>>>
>>
>> How do you actually ensure that it completes processing without hooking 
>> into Server? I.e. that buffers and sockets get properly flushed?
>>
>> Let's take a step back and what are the properties that you need -- 
>>
>> I assume it's just graceful shutdown where all the pending ServeHTTP 
>> requests have been processed?
>>
>> What should happen when the server crashes -- is it vital for those 
>> requests to be processed, once they have been accepted?
>>
>> What should happen when one handler gets stuck in an infinite wait/loop?
>>
>> Does the "Close" returning mean you exit main or does hpw does the 
>> process termination depend on it? Or is it just another goroutine that is 
>> terminating not the whole process?
>>
>> + Egon
>>
>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/golang-nuts/jh-nvt9ukBg/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> golang-nuts...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to