On Tue, Jun 21, 2022 at 8:47 PM Mark Thomas <ma...@apache.org> wrote:
>
> On 21/06/2022 13:25, Rémy Maucherat wrote:
> > kOn Tue, Jun 21, 2022 at 12:41 PM Mark Thomas <ma...@apache.org> wrote:
> >>
> >> On 21/06/2022 08:53, Rémy Maucherat wrote:
> >>> On Tue, Jun 21, 2022 at 9:13 AM Mark Thomas <ma...@apache.org> wrote:
> >>>>
> >>>> Hi all,
> >>>>
> >>>> See [1] for further background.
> >>>>
> >>>> The current sendfile implementation for async HTTP/2 uses a
> >>>> MappedByteBuffer as the source.
> >>>>
> >>>> Unfortunately, MappedByteBuffer has some problematic side effects on
> >>>> Windows. The underlying file is locked until the MappedByteBuffer is
> >>>> GC'd. This causes problems with some usage patterns such as:
> >>>>
> >>>> - GET file to review it
> >>>> - file delivered by sendfile
> >>>> - DELETE file as it is unwanted
> >>>> - delete fails because file is locked
> >>>>
> >>>> We have multiple options to address this. These include:
> >>>>
> >>>> 1. Switch to using FileChannel like NioEndpoint
> >>>>
> >>>> 2. Switch to using FileChannel like NioEndpoint when running on Windows
> >>>>
> >>>> 3. Disable HTTP/2 sendfile when running on Windows
> >>>>
> >>>> 4. On Windows with Java 12 onwards, use jdk.internal.misc.Unsafe to
> >>>> clear the references held by the MappedByteBuffer once the file has been
> >>>> sent.
> >>>>
> >>>> 5. Disable HTTP/2 sendfile when running on Windows unless Java 12
> >>>> onwards is used in which case use jdk.internal.misc.Unsafe
> >>>>
> >>>> 6. Document the issue when running on Windows so users can disable
> >>>> sendfile if their usage pattern is going to be problematic.
> >>>
> >>> I would choose this one, also since it's only until GC occurs.
> >>> Memory mapping seems more efficient than other techniques (less
> >>> copying, also it's a direct buffer).
> >>
> >> You don't think it is worth trying to fix this if running on Java 12 or
> >> later?
> >
> > Not really. I don't understand what's the process for selecting
> > Windows when you're designing a R/W webapp. Sure it might work.
> > Sometimes.
>
> :)
>
> ACK.
>
> >> My expectation is that it should be relatively low risk since we know
> >> when the completion handler has finished and we could clear the
> >> references then.
> >
> > You say you're going to use Unsafe, in which case it could cause
> > problems eventually. Cleaning up native stuff in completion handlers
> > or cleaners works well, indeed.
>
> Fair enough. I'll put the warning in place for now. If this becomes a
> larger issue over time, we can always look again at using Unsafe.

+1, that's a good compromise.

Rémy

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to