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

Vadim Pakhnushev updated IGNITE-23825:
--------------------------------------
    Description: 
When ComputeJob started from the client on remote node returns a Tuple returned 
from Table API directly, client handler node fails to unmarshal it:
{noformat}
Caused by: 
org.apache.ignite.internal.network.serialization.marshal.UnmarshalException: 
Cannot instantiate org.apache.ignite.internal.table.TableRow$ValueRowChunk
        at 
org.apache.ignite.internal.network.serialization.marshal.StructuredObjectMarshaller.preInstantiateStructuredObject(StructuredObjectMarshaller.java:209)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.preInstantiate(DefaultUserObjectMarshaller.java:421)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readIdentifiableInTwoStages(DefaultUserObjectMarshaller.java:398)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readObject(DefaultUserObjectMarshaller.java:363)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalFromInput(DefaultUserObjectMarshaller.java:319)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:295)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:290)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshal(DefaultUserObjectMarshaller.java:279)
 ~[main/:?]
        at 
org.apache.ignite.internal.compute.message.JobResultResponseImpl.unmarshal(JobResultResponseImpl.java:128)
 ~[main/:?]
{noformat}

The reason is we use user objects serialization to pass job result between 
nodes and there are two problems there:
* {{ClassDescriptorFactory}} doesn't search for the {{writeReplace}} method in 
superclasses.
* {{TupleImpl}} doesn't declare {{writeObject}} so the 
{{StructuredObjectMarshaller.fillStructuredObjectLayerFrom}} method doesn't 
call {{readObject}} to properly deserialize it.

  was:
When ComputeJob started from the client on remote node returns a Tuple returned 
from Table API directly, client handler node fails to unmarshal it:
{noformat}
Caused by: 
org.apache.ignite.internal.network.serialization.marshal.UnmarshalException: 
Cannot instantiate org.apache.ignite.internal.table.TableRow$ValueRowChunk
        at 
org.apache.ignite.internal.network.serialization.marshal.StructuredObjectMarshaller.preInstantiateStructuredObject(StructuredObjectMarshaller.java:209)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.preInstantiate(DefaultUserObjectMarshaller.java:421)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readIdentifiableInTwoStages(DefaultUserObjectMarshaller.java:398)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readObject(DefaultUserObjectMarshaller.java:363)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalFromInput(DefaultUserObjectMarshaller.java:319)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:295)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:290)
 ~[main/:?]
        at 
org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshal(DefaultUserObjectMarshaller.java:279)
 ~[main/:?]
        at 
org.apache.ignite.internal.compute.message.JobResultResponseImpl.unmarshal(JobResultResponseImpl.java:128)
 ~[main/:?]
{noformat}

The reason is we use Java serialization to pass job result between nodes and 
TableRow$ValueRowChunk is not serializable.


> Returning Tuple from table fails
> --------------------------------
>
>                 Key: IGNITE-23825
>                 URL: https://issues.apache.org/jira/browse/IGNITE-23825
>             Project: Ignite
>          Issue Type: Bug
>          Components: compute, networking
>            Reporter: Vadim Pakhnushev
>            Assignee: Vadim Pakhnushev
>            Priority: Major
>              Labels: ignite-3, important
>             Fix For: 3.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> When ComputeJob started from the client on remote node returns a Tuple 
> returned from Table API directly, client handler node fails to unmarshal it:
> {noformat}
> Caused by: 
> org.apache.ignite.internal.network.serialization.marshal.UnmarshalException: 
> Cannot instantiate org.apache.ignite.internal.table.TableRow$ValueRowChunk
>       at 
> org.apache.ignite.internal.network.serialization.marshal.StructuredObjectMarshaller.preInstantiateStructuredObject(StructuredObjectMarshaller.java:209)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.preInstantiate(DefaultUserObjectMarshaller.java:421)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readIdentifiableInTwoStages(DefaultUserObjectMarshaller.java:398)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.readObject(DefaultUserObjectMarshaller.java:363)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalFromInput(DefaultUserObjectMarshaller.java:319)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:295)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshalShared(DefaultUserObjectMarshaller.java:290)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.network.serialization.marshal.DefaultUserObjectMarshaller.unmarshal(DefaultUserObjectMarshaller.java:279)
>  ~[main/:?]
>       at 
> org.apache.ignite.internal.compute.message.JobResultResponseImpl.unmarshal(JobResultResponseImpl.java:128)
>  ~[main/:?]
> {noformat}
> The reason is we use user objects serialization to pass job result between 
> nodes and there are two problems there:
> * {{ClassDescriptorFactory}} doesn't search for the {{writeReplace}} method 
> in superclasses.
> * {{TupleImpl}} doesn't declare {{writeObject}} so the 
> {{StructuredObjectMarshaller.fillStructuredObjectLayerFrom}} method doesn't 
> call {{readObject}} to properly deserialize it.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to