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

Nikolay Izhikov commented on IGNITE-13553:
------------------------------------------

Reproducer:
{noformat}
public class WrongQueryEntityDataTypeTest extends GridCommonAbstractTest {
    /** */
    private volatile boolean systemThreadFails;

    /** {@inheritDoc} */
    @Override protected FailureHandler getFailureHandler(String 
igniteInstanceName) {
        return new FailureHandler() {
            @Override public boolean onFailure(Ignite ignite, FailureContext 
failureCtx) {
                systemThreadFails = true;

                return false;
            }
        };
    }

    /** */
    @Test
    public void testWrongQueryEntityDataType() throws Exception {
        ClassLoader ldr = getExternalClassLoader();

        Class<?> orgCls = 
ldr.loadClass("org.apache.ignite.tests.p2p.cache.Organization");
        Class<?> personCls = 
ldr.loadClass("org.apache.ignite.tests.p2p.cache.Person");
        Class<?> adrCls = 
ldr.loadClass("org.apache.ignite.tests.p2p.cache.Address");

        startGrids(2);

        try (IgniteClient client = Ignition.startClient(new 
ClientConfiguration().setAddresses("127.0.0.1:10800"))) {
            LinkedHashMap<String, String> fields = new LinkedHashMap<>();

            String indexedField = "head";

            fields.put("name", String.class.getName());
            fields.put(indexedField, String.class.getName()); //Actual type of 
the field head is Person.

            ClientCache<Integer, Object> cache = client
                .createCache(new ClientCacheConfiguration()
                    .setName("TEST")
                    .setAtomicityMode(TRANSACTIONAL)
                    .setBackups(1)
                    .setQueryEntities(new QueryEntity()
                        .setKeyType(Integer.class.getName())
                        .setValueType(orgCls.getName())
                        .setFields(fields)
                        .setIndexes(Collections.singleton(new 
QueryIndex(indexedField)))
                    )
                );

            Object person = personCls.getConstructor().newInstance();
            Object ent = orgCls.getConstructor(String.class, personCls, 
adrCls).newInstance("test", person, null);

            GridTestUtils.assertThrowsWithCause(() -> cache.put(1, ent), 
ClientException.class);
        }

        assertFalse(systemThreadFails);
    }
}
{noformat}

> Node failure with ClassNotFoundException when indexed field of QueryEntity 
> differs from type used in put operation
> ------------------------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-13553
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13553
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql, thin client
>    Affects Versions: 2.9, 2.8.1, 2.10
>            Reporter: Ilya Shishkov
>            Priority: Critical
>
> Failures occur under these conditions:
>  # Data classes are not present in server classpaths, peer-classloading is 
> not used because thin client is used.
>  # Manual construction of QueryEntity via #setFields, #setIndexes etc. is 
> used instead of constructor of QueryEntity in conjunction with @QuerySqlField 
> for data clases.
>  # One of the indexed fields of QueryEntity has type different from type of 
> corresponding field of data object instance, eg:
> {code:java|title=QueryEntity}
> fields.put("name", "java.lang.String");
> fields.put("wrongTypeEmbeddable", "java.lang.String"); /* This is wrong type 
> */
> QueryEntity qryEntity = new QueryEntity()
>       .setKeyType("java.lang.Integer")
>       .setValueType("org.apache.ignite.wrongtype.WrongTypeEntity") /* FQDN 
> should be used */
>       .setFields(fields)
>       .setIndexes(Collections.singleton(
>               new QueryIndex("wrongTypeEmbeddable") /* Wrong type field is 
> indexed */));
> {code}
> {code:java|title=Embedded field type in put operation is different}
> cache.put(0, new WrongTypeEntity("name",
>       new WrongTypeEmbeddable(256, "testField") /* wrongTypeEmbeddable field 
> */));
> {code}
> How to reproduce:
>  # Start server nodes with default config via ignite.sh
>  # Run reproducer:
> For Apache Ignite 2.8.1 failures are identical for atomic and transactional 
> caches:
> {code:java}
> [17:45:23,108][SEVERE][sys-stripe-0-#1][] JVM will be halted immediately due 
> to the failure: [failureCtx=FailureContext [type=CRITICAL_ERROR, err=class 
> o.a.i.binary.BinaryInvalidTypeException: o.a.i.wrongtype.WrongTypeEmbeddable]]
> {code}
> For AI, built and assemblied from master, failure is supressed for atomic and 
> occur only for transactional caches:
> {code:java}
> [17:39:09,305][SEVERE][sys-stripe-10-#11][] JVM will be halted immediately 
> due to the failure: [failureCtx=FailureContext [type=CRITICAL_ERROR, 
> err=class o.a.i.i.transactions.IgniteTxHeuristicCheckedException: Committing 
> a transaction has produced runtime exception]]
> {code}
> Root cause for all failures is:
> {code:java}
> Caused by: java.lang.ClassNotFoundException: 
> org.apache.ignite.wrongtype.WrongTypeEmbeddable
> {code}
> Logs:



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to