If you don't care about this stuff, but still read the first line, do our community a favor and get involved :)

The API's are pretty much identical,

Remy: https://svn.apache.org/viewvc/tomcat/sandbox/comet/java/org/apache/catalina/CometEvent.java?view=markup Filip: https://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/CometEvent.java?view=markup

There are a few differences

isReadable()
- Remy - same functionality as ServletInputStream.available()
- Filip - ServletInputStream.available() || InternalNioInputBuffer.hasData || InternalNioInputBuffer.nonBlockRead().hasData ie, is readable in my API means that there is some data from the bottom layer of the API. Doesn't mean that it would actually result in data to a ServletInputStream.read(), but most cases it would. The benefit of this method is that it actually does check the socket for data in a non blocking way if the first two conditions have not been met. API has been implemented in trunk. so isAvailable() is different, and both methods can be used for different purposes

isWriteable()
This functions the same way in both APIs. After playing with the API this function is useless unless you have true non blocking writes. Why? Well, the function will always return true, unless there is another thread writing, but write is not thread safe, so another thread should never attempt to write. And in a blocking way, isWriteable()->true : write(blocking) : isWriteable()->true, always. However, in the blocking API, there is a true way to find out if we can write or not, and that is by calling CometEvent.register(OP_WRITE), this will actually check with the poller to see if the network buffer is ready to receive more data and dispatch a worker thread.

callback()
- Remy - one time callback from the container on a Tomcat worker thread
- Filip - same functionality implemented, CometEvent.register(OP_CALLBACK)
I definitely like the register/unregister for events more than I like the one time functionality of callback()/sleep().
OP_CALLBACK currently is implemented and working in trunk.
Why do I like register more? Cause we can add new operations in the future without changing the API. This leads to more flexibility. Currently OP_CALLBACK stays registered until it is "unregister"-ed. If we wanted to achieve callback() functionality, we can add a OP_CALLBACK_ONCE operation or simply change the behavior of existing callback, without changing the API. it is also possible to retrieve the state of a comet connection by calling getRegisteredOps, something not available in the sandbox API.

sleep()
- Remy - deregister from the READ events
- Filip - same functionality exists, CometEvent.unregister(OP_READ,OP_WRITE,OP_CALLBACK) or simply CometEvent.unregister(OP_READ) if nothing else is registered. Again, I think the trunk API is more flexible, and cleaner. sleep() is associated with Thread.sleep() in every programmers head. and doesn't really apply to an event based API.
This is implemented in trunk and working.


Conclusion, both APIs are almost identical. I believe the trunk API is more flexible and allows for additions of functionality in the future without changing the API. Remy's initial -1 to the trunk was based on the implementation, having to synchronize etc. All that has been simplified and removed.

So therefor, the API's are almost identical, I would vote
sandbox API -> -1 -> API is simple but not extensible, names are not intuitive as they are not event oriented. trunk API -> +1 -> API is equally simple, more geared towards event based API, more flexible, as I am sure new needs will need new operations and events

The only thing not working in trunk at this moment is non blocking, but after doing the research, this is a major surgery to try to do within the existing buffer/filter API I'd rather delay such an attempt until we can reach consensus on the API and the "simple stuff".

Looks like we are gonna have to have a pancake flipping contest :)

Filip


Remy Maucherat wrote:
Hi,

I've been working on additions to CometEvent to implement the additional Comet functionality that was agreed upon before creating the "trunk" branch. Although not functional at the moment, I consider it to be developed enough from an algorithmic standpoint to be proposed and reviewed (it is also important to not continue an API fork for too long, since otherwise it would be harder to merge, so some resolution is needed). I went through a few revisions of the API, as more tweaks appeared possible. The idea was to allow the extra functionality without adding complexity or incompatible changes, since this is most likely going to be an interim API.

The repository is at:
https://svn.apache.org/repos/asf/tomcat/sandbox/comet

It has the following changes over the 6.0.x branch:
- additions of four methods in CometEvent (sleep and callback, and the two flags isRead(Write)able) - sleep delays request processing until either callback is called, or a timeout occurs - callback allows waking up requests which are "asleep" or waiting for an IO event - non blocking IO exclusively in Comet mode, since it now seems to me it is algorithmically equivalent to blocking IO; for read, it has been demonstrated previously; for write, it seems there should always be write events after a properly handled congestion (where the servlet uses isWriteable), since if the servlet does not, it will be best to simply fail-fast the connection using an IOException (the servlet would effectively only handle clients which are "fast enough" if using the Comet API like in Tomcat 6.0, which avoids a lot of issues) - isRead(Write)able indicate if data may be read or written (since this is non blocking IO, reading or writing would read or write 0 bytes); if it is false and reading or writing is done, an IO exception will be thrown
- no additional data structures
- new ActionCode: ACTION_COMET_TIMEOUT (which is cleanup), ACTION_COMET_CALLBACK (called by the callback() method), ACTION_COMET_SLEEP (called by the sleep() method), ACTION_COMET_WRITE (called by the CometEvent.isWriteable method without the need for an explicit callback from the servlet - isWriteable knows the result of the last write, and the servlet is supposed to not attempt any further writing if isWriteable returns false) - no additional features, like verification of caller threads (which I consider useless)

I hope I did not forget anything.

Comments ? / Votes ?

Rémy


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to