On Sun, Jan 29, 2012 at 2:19 AM, Mark Thomas <ma...@apache.org> wrote:

> On 29/01/2012 01:20, Costin Manolache wrote:
> > On Fri, Jan 27, 2012 at 3:09 PM, Mark Thomas <ma...@apache.org> wrote:
> >
> > Not complaining - it's great to add this feature, please commit it - but
> > I'm wondering
> > if a lighter interface wouldn't be better. From looking at the
> > implementation, it seems
> >  after the upgrade it keeps the InputBuffer/OutputBuffer ( and the whole
> >  Request / Processor / etc tree ).
>
> I agree there is certainly scope to do that. My initial focus has been
> on functionality and minimal changes to existing code - hence the
> current approach.
>
> I'm not overly keen on the additional overhead myself and can see
> several ways to reduce it. Output is easier than input since we know the
> output buffers are clear on upgrade. Input is a little trickier since
> there may be some data in the input buffer and that would need to be
> drained before switching to the lighter weight approach.
>

I don't think the upgrade protocol allows clients to send payload before
receiving the response
headers / handshaking, so I think it wouldn't be a problem.

In terms of actual code changes - I think the main problem is that
nio/apr/oio
input/output are implemented in Internal[Input/Output][Nio/Apr]Buffer which
are
quite heavy- it would be a huge change to modify that. However it may be
possible
to have some lighter buffers - just the socket and methods to read/write.
At least that's what I've been trying with spdy - which also involves some
protocol switching.
The change is also minimal in endpoint-specific code ( it's just adding few
hooks and some new code ).


I think this is something to look at once the implementation is more
> feature complete. Whatever we do, I'd like to keep the following aims in
> mind:
> - minimal endpoint specific code
> - minimal changes to what we have now
> - keep the generic upgrade and the protocol specific parts separate
>

I agree.


>
> > Would it be possible for example to release the Request, like it's done
> > after request,
> > in keep-alive, and use a lighter parser/callback on the socket ? I think
> > one of the use cases
> >  for websockets is to support a _lot_ of open connections.
>
> That is certainly one approach. It will be easier to explore options
> when we have a wider range of examples to work / test with.
>
> > Also the interface may be simpler without InputStreams.
>
> I thought long and hard about that. Looking around, some implementations
> are message based, some are stream based. There are good arguments for
> both. Unfortunately the WebSocket protocol is a messages based protocol
> with no maximum message length. A message is one or more frames and a
> frame is up to 2^63 bytes. While most usages will be small(ish) messages
> that can be buffered without undue overhead, any application that wants
> larger messages needs to use a stream based interface to be able to
> scale. That is why I went for both.
>

Well, the message is sent from javascript - I don't think 2^63 frames are
likely,
and even if they are, I don't think a blocking InputStream interface is
best choice.

Why not copy some of the javascript interface ( onopen / onmessage / etc )
?
Or onMessage(byte[] initialData) + onMessageData(byte[] moreBytes) ?
In other words - make it 'async' from start.  I wouldn't even worry about
the
string conversions for text frames in a low-level interface.

Costin


>
> Thanks for the feedback. Much appreciated.
>
> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to