[ 
https://issues.apache.org/jira/browse/IGNITE-16229?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Valentin Kulichenko updated IGNITE-16229:
-----------------------------------------
    Fix Version/s: 3.0.0-alpha5
                       (was: 3.0.0-alpha4)

> Improve unmarshalling of immutable containers in the User Object 
> Serialization component
> ----------------------------------------------------------------------------------------
>
>                 Key: IGNITE-16229
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16229
>             Project: Ignite
>          Issue Type: Improvement
>          Components: networking
>            Reporter: Roman Puchkovskiy
>            Assignee: Roman Puchkovskiy
>            Priority: Major
>              Labels: ignite-3
>             Fix For: 3.0.0-alpha5
>
>
> At the moment, we support just one type of immutable containers 
> (singletonList), but we'll probably want to support other types like 
> List.of(), Set.of() and so on.
> Immutable built-in containers pose a challenge: on the one hand, they can 
> participate in cycles and hence need to be read in two phases (instantiate, 
> store reference, fill), but on the other hand, they cannot be modified after 
> instantiation.
> Right now, we implemented a hack: we still read immutable containers in two 
> phases, but for filling them we have a custom code that breaks their 
> 'immutability' invariant and pushes the values by force via reflection to 
> fill such containers. It seems to work, but it's ugly and potentially 
> dangerous (as we are violating the immutability invariant).
> There is another possibility.
>  # Handle all the values that are not built-in immutable containers in the 
> same way they are handled now
>  # For immutable containers, during instantiation phase, create mutable 
> placeholders instead of the immutable container instances themselves
>  # Such placeholders need to track the slots of other objects in the graph 
> that reference them
>  # They are filled normally on the 'fill' phase
>  # After the graph is read into memory, it consists of (mainly) normal 
> objects and placeholders; the placeholders need to be resolved and replaced 
> with proper immutable container values
>  # It is impossible to create a cycle of immutable containers (without using 
> hacks like Reflection), so we can find connectivity components of the graph 
> (each of such component will be a tree) and then instantiate immutable 
> containers from placeholders in the leaf-to-root order
>  # Placeholders need to be replaced with the instantiated immutable 
> containers in the graph; here, the knowledge about the set of slots which 
> reference a placeholder (mentioned in item 3) will be useful
>  # If we encounter a cycle comprised completely of immutable containers (such 
> cycle can only be creafted using some sort of a hack), we can either fail 
> with an exception or use a hack (reflection) to forge just one connection of 
> the cycle.
> This is a hybrid approach of
>  * always having 'real' objects in the graph - which is not realistic when we 
> have immutable containers
>  * and always constructing a graph of placeholders first and then turning 
> them into real objects (this is what Spring does with Bean Definitions and 
> then Beans) - which seems to incur too much overhead, especially having in 
> mind that most of the objects are not immutable containers and hence do not 
> need placeholders to represent them in the intermediate graph



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to