ignite-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Griggs (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (IGNITE-1903) Cache configuration is serialized to nodes whether they require it or not
Date Thu, 01 Mar 2018 12:09:00 GMT

    [ https://issues.apache.org/jira/browse/IGNITE-1903?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16381899#comment-16381899
] 

Michael Griggs commented on IGNITE-1903:
----------------------------------------

 I have built a simple reproducer for this

 

https://gitlab.com/michael.griggs/cachestorerepro

> Cache configuration is serialized to nodes whether they require it or not
> -------------------------------------------------------------------------
>
>                 Key: IGNITE-1903
>                 URL: https://issues.apache.org/jira/browse/IGNITE-1903
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 1.5.0.final
>            Reporter: Michael Griggs
>            Assignee: Vladimir Ozerov
>            Priority: Major
>              Labels: community, usability
>             Fix For: 2.5
>
>
> See User discussion thread:  http://apache-ignite-users.70518.x6.nabble.com/CacheStore-being-serialized-to-client-td1931.html
> Brief summary:  When a grid client joins the grid (clientMode=true) it receives a message
from the server node(s) on the grid that contains the serialized CacheStore implementation
object.  If the client does not have this class on its CLASSPATH (and there is no reason it
should, as it is a client) then the de-serialization of this message will fail, causing this
exception:
> {code}SEVERE: Failed to unmarshal discovery data for component: 1 
> class org.apache.ignite.IgniteCheckedException: Failed to find class with given class
loader for unmarshalling (make sure same versions of all classes are available on all nodes
or enable peer-class-loading): sun.misc.Launcher$AppClassLoader@14dad5dc 
>         at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal(JdkMarshaller.java:104)

>         at org.apache.ignite.marshaller.AbstractMarshaller.unmarshal(AbstractMarshaller.java:67)

>         at org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.onExchange(TcpDiscoverySpi.java:1529)

>         at org.apache.ignite.spi.discovery.tcp.ClientImpl$MessageWorker.processNodeAddFinishedMessage(ClientImpl.java:1317)

>         at org.apache.ignite.spi.discovery.tcp.ClientImpl$MessageWorker.processDiscoveryMessage(ClientImpl.java:1229)

>         at org.apache.ignite.spi.discovery.tcp.ClientImpl$MessageWorker.body(ClientImpl.java:1199)

>         at org.apache.ignite.spi.IgniteSpiThread.run(IgniteSpiThread.java:62) 
> Caused by: java.lang.ClassNotFoundException: c.g.r.cachewrapper.ignite.CacheMissHandlerIgnite
> {code}
> where {{c.g.r.cachewrapper.ignite.CacheMissHandlerIgnite}} is the CacheStore implementation.
> The ostensible reason for the CacheStore serialization is so that clients of a TRANSACTIONAL
cache can begin the transaction on the underlying store.  
> The only current solution to this is to add the grid node's CacheStore implementation
class definition to the CLASSPATH of the client.  This creates an *undesirable coupling* between
server and client.
> ---
> *UPDATE (copy-paste from comment below)*
> This is actually more generic issue. When a new node joins (client or server), all existing
cache configurations (which include cache stores) are sent to this node. It then deserializes
it during startup which can cause exceptions on clients or servers where cache is not supposed
to be deployed as defined by node filter.
> As a solution we can do the following:
> * During discovery, send node filter and cache store factory in binary format along with
the cache configuration, not as its parts.
> * On server, check node filter first and deserialize cache configuration and cache store
only if it returns true. In case of error, STOP join process (now we just print exception
in log and go on, which is very error-prone).
> * On client, do not deserialize cache configuration and cache store until user's code
tries to actually use the cache (calls Ignite.cache. If cache is ATOMIC, never deserialize
the cache store.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message