1. Sometime the feeder will stop making progress.
In onWritePossible and flush. If in between writeUntilFullOrDone and if (!c.canWrite())/if (!isReady()) the OutputSink becomes writable or InputStream becomes ready, the code will just fall through.
2. The callback thread for onWritePossible is from selector pool. Reschedule it to the worker pool because notifyReadyToFeed could block the selector thread otherwise.
3. canFeed, isDone, isReady and notifyReadyToFeed throws IOException.