Very well, then its safe to argue that a failed flush means game over: I'll 
submit a patch that forces buffered transports to clear their write buffers 
regardless of the flush()'s success.

Erik

On Tuesday 14 October 2008 18:42:26 Mark Slee wrote:
> I think any retry behaviors should be encoded into the semantics of the
> transport. If you want retries, then you should configure the transport
> as such, and a single call to flush() should retry on failure if
> desired. This keeps the error-handling state-management confined to the
> transport internals, and doesn't leak the retry abstraction out into
> application code.
>
> Making repeated calls seems like a slipperly slope. My 2c.
>
> Cheers,
> mcslee
>
> -----Original Message-----
> From: Erik Frey [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, October 14, 2008 9:07 AM
> To: [email protected]
> Cc: Bryan Duxbury
> Subject: Re: invalid state in TFramed/BufferedTransport
>
> Okay -- my only concern is whether the ability to retry is inferred in a
> method like flush(), if a flush() fails, should the transport preserve
> its state so that I can try flushing again?
>
> If so, this fix would break that property.
>
> Erik
>
> On Tuesday 14 October 2008 15:56:20 Bryan Duxbury wrote:
> > I think it makes the most sense for a failed flush() to clear the
> > write buffer. That way, you get the most immediate adjustment towards
> > consistency, and since you're closing, the data is clearly
> > unrecoverable anyway.
> >
> > Another approach would be to initialize the buffer in open().
> >
> > -Bryan
> >
> > On Oct 14, 2008, at 5:56 AM, Erik Frey wrote:
> > > Before I submit a patch to TBuffered/FramedTransport I'd like some
> > > input as to which is the better fix:
> > >
> > > Right now, when TFramedTransport's underlying transport fails during
> > >
> > > a flush(), TFramedTransport enters an irrecoverable state with
> > > unflushed data in its write buffer.
> > >
> > > This can cause disastrous results in a naive client implementation:
> > >
> > > try
> > > {
> > >    results = client.doSomething(first_param); } catch
> > > (TTransportException &) { socket.close(); socket.open(host, port); }
> > >
> > > results = client.doSomething(second_param);
> > >
> > > The second time the client is used, it will send the old buffered
> > > request and interpret the wrong response!  We've seen this problem
> > > in both the c
> > > ++ and
> > > php libs.
> > >
> > > There are two ways to fix this:
> > >
> > > The first is for TFramedTransport to clear its write buffer for a
> > > flush regardless of whether the underlying transport succeeds in its
> > >
> > > write/flush.
> > >
> > > The second is for TFramedTransport's close() method to clear its
> > > buffer regardless of whether the underlying flush() succeeds.  In
> > > this case, the implementer will have to close/open the framed
> > > transport as well as the socket, but at least this is clear and
> > > documentable behaviour.
> > >
> > > Thoughts?
> > >
> > > Erik


Reply via email to