dissecting memory sessions

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Nov 9 09:26:47 UTC 2022


On 09/11/2022 00:20, Uwe Schindler wrote:
>
> Hi,
>
> sorry for the late reply (I was privately discussing with Maurizio 
> already). From the Lucene standpoint only using MemorySegment on top 
> of mmapped files, I see no problems, we just need to replace 
> MemorySession by Arena in our code (I plan to change our code to use 
> just pass Autocloseable around to allow us to unmap shared  mmaped files).
>
> But when looking at the API I found some minor problems:
>
>   * Naming: "MemorySession", "MemorySegment".... but now "Arena". I'd
>     rename it to "MemoryArena" to make it consistent. Personally I
>     have my problems with the term "Arena", to me it makes it hard to
>     understand.
>
Leaving naming issues for now, I agree that perhaps names landed in a 
suboptimal state (esp. MemorySession).
>
>   * In Lucene we work with MMap mainly - I did not look into other
>     parts on Panama, but for memory mapping I was wondering about the
>     signature of FileChannel#map(..., MemorySession). The last
>     parameter is currently a MemorySession and was not changed to
>     Arena. IMHO, this should be Arena, because to me it looks like an
>     *allocation* of a mapped file slice and goes in line with other
>     allocatior methods. You use an Arena as factory for
>     MemorySegments. FYI, in our current code in Lucene when we pass
>     Arena around, we need to get the Session from it first. For
>     newcomers this is hard to understand, because the MemorySession
>     has lost importance and is no longer a first class citizen to get.
>     Its hard to figure out how to get the session. Also the code that
>     maps the file should be under control to unmap it and for that the
>     arena is important. With the session alone you cannot unmap it. So
>     to me mmap a segment and releasing it should use same class (Arena).
>
The parameter cannot be Arena. You might want to create a mapped segment 
that is managed by a global or an implicit session. In which case you 
have no arena. Or maybe you have another segment at hand, and you want 
to map a segment that has the same lifetime as the first segment. Again, 
you don't have an Arena.

All the API points that accept a "lifetime" need to accept a 
MemorySession. An Arena is a client-facing abstraction - it's what 
allows you to create a "bounded" lifetime - that is a lifetime that can 
start (when the arena is created) and end (when the arena is closed).

Maurizio

>  *
>
> Uwe
>
> Am 02.11.2022 um 18:48 schrieb Maurizio Cimadamore:
>> Hi,
>> After the first preview of the FFM API in Java 19, we have identified 
>> a couple of areas where the API could use some improvements:
>>
>> * Clarify the relationship between MemorySegment and MemoryAddress 
>> (this was addressed in [1]); and
>> * Polish the MemorySession API, and make segments easier to (safely) 
>> share with external clients (what this email is about).
>>
>> While we have explored solutions to better encapsulate memory 
>> sessions in the past (e.g. by dropping session accessors, as 
>> described in [2]), nothing seemed to stick. So, for Java 19 we 
>> decided to leave session accessors on memory segments in place, but 
>> give the option to libraries to protect against "sneaky" close, by 
>> creating non-closeable memory session views.
>>
>> After staring at this problem long enough, it became increasingly 
>> clear that memory sessions, in their current shape and form, are 
>> trying to do too much - from allocation, to lifecycle management and 
>> more. The issue with "sneaky" close is mostly a manifestation of that 
>> more fundamental problem. In that spirit, we have put together a 
>> document which teases apart the various "traits" associated with 
>> memory sessions, and repackages the same traits into an API that 
>> provides better encapsulation and composition. The document can be 
>> found here:
>>
>> http://cr.openjdk.java.net/~mcimadamore/panama/session_arenas.html
>>
>> The main move described in the document is to make MemorySession a 
>> "pure" lifetime abstraction, thus dropping SegmentAllocator and 
>> AutoCloseable capabilities. Instead, these capabilities are provided 
>> by a *second* abstraction, called Arena. Crucially, an Arena _has_ a 
>> memory session, which can e.g. be used to allocate segments that have 
>> the same lifecycle as that of the arena. This subtle twist, gives us 
>> an API that is easier to reason about (and to build upon), and one 
>> where memory segments can be shared freely across clients - premature 
>> calls to MemorySession::close are no longer possible. At the same 
>> time, the API now makes a much clearer distinction between sessions 
>> that are closeable (i.e. sessions created through an Arena) and those 
>> that aren't (i.e. implicit and global sessions).
>>
>> Here's a list of the main API changes, and how they will impact 
>> clients of the FFM API:
>>
>> * MemorySession no longer has a close() method; try-with-resources 
>> against MemorySession will now need to use Arena instead;
>> * Support for non-closeable session views 
>> (MemorySession::asNonCloseable), and related methods 
>> (MemorySession::equals/hashCode) has been removed;
>> * MemorySession::addCloseAction has been removed; instead, clients 
>> can specify a cleanup action when creating an unsafe segment (i.e. 
>> using MemorySegment::ofAddress);
>> * Some of the predicates in MemorySession have been made more robust 
>> - e.g. instead of MemorySession::ownerThread(), there is now a 
>> predicate MemorySession::isOwnedBy(Thread).
>>
>> After careful consideration, we believe that the changes described in 
>> this document are worth pursuing for the upcoming Java 20 integration 
>> [3]: they make the API more principled (no more "sneaky" close), 
>> while retaining a similar expressive power.
>>
>> Any feedback is greatly appreciated.
>>
>> Cheers
>> Maurizio
>>
>> [1] - 
>> https://cr.openjdk.java.net/~mcimadamore/panama/segment_address.html
>> [2] - 
>> https://mail.openjdk.org/pipermail/panama-dev/2022-February/016152.html
>> [3] - 
>> https://mail.openjdk.org/pipermail/panama-dev/2022-February/016152.html
>>
>>
> -- 
> Uwe Schindler
> uschindler at apache.org  
> ASF Member, Member of PMC and Committer of Apache Lucene and Apache Solr
> Bremen, Germany
> https://lucene.apache.org/
> https://solr.apache.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20221109/0cc6a056/attachment-0001.htm>


More information about the panama-dev mailing list