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

Surkov Aleksandr updated IGNITE-13192:
--------------------------------------
    Description: 
Start use thin client with compact footer equals true(setCompactFooter(true) ). 
Create table through SQL. Then execut INSERT and put() with different id/key. 
And then call method get() with id from INSERT. A BinaryObjectException will 
occur. It is expected the value inserted through INSERT. 

Reproducer:
{code:java}
@Test
public void testSql() throws Exception {
    try (Ignite ignored = Ignition.start(Config.getServerConfiguration()); 
Ignite ignored2 = Ignition.start(Config.getServerConfiguration());
         IgniteClient client = Ignition.startClient(new 
ClientConfiguration().setBinaryConfiguration(new 
BinaryConfiguration().setCompactFooter(true)).setAddresses(Config.SERVER))
    ) {
        // 1. Create table
        client.query(
            new SqlFieldsQuery(String.format(
                "CREATE TABLE IF NOT EXISTS Person (id INT PRIMARY KEY, name 
VARCHAR) WITH \"VALUE_TYPE=%s,CACHE_NAME=%s\"",
                Person.class.getName(), "PersonCache"
            )).setSchema("PUBLIC")
        ).getAll();


        int key = 1;
        Person val = new Person(key, "Person " + key);
        
        // 2. INSERT value to cache
        client.query(new SqlFieldsQuery("INSERT INTO Person(id, name) VALUES(?, 
?)")
            .setArgs(val.getId(), val.getName())
            .setSchema("PUBLIC")
        )
        .getAll();
        
        // 4. Execute put(). The key must be different from what was in INSERT
        // Without this line, there will be no exception
        client.getOrCreateCache("PersonCache").put(2, val);

        // 5. Execute get(). There will be an exception: 
org.apache.ignite.binary.BinaryObjectException: Cannot find metadata for object 
with compact footer
        assertNotNull(client.getOrCreateCache("PersonCache").get(1));
    }
}{code}
 

Decision:
{code:java}
+++ 
modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
      (date 1593418365270)
@@ -365,6 +365,11 @@
         @Override public BinaryType metadata(int typeId, int schemaId) throws 
BinaryObjectException {
             BinaryType meta = metadata(typeId);
 
+            if (meta != null && 
!((BinaryTypeImpl)meta).metadata().hasSchema(schemaId)) {
+                cache.metadata().removeIf(t -> t.typeId() == typeId);
+                meta = metadata(typeId);
+            }
+
             return meta != null && 
((BinaryTypeImpl)meta).metadata().hasSchema(schemaId) ? meta : null;
         }{code}

  was:
If use thin client with setCompactFooter(true) 

Reproducer:
{code:java}
@Test
public void testSql() throws Exception {
    try (Ignite ignored = Ignition.start(Config.getServerConfiguration()); 
Ignite ignored2 = Ignition.start(Config.getServerConfiguration());
         IgniteClient client = Ignition.startClient(new 
ClientConfiguration().setBinaryConfiguration(new 
BinaryConfiguration().setCompactFooter(true)).setAddresses(Config.SERVER))
    ) {
        // 1. Create table
        client.query(
            new SqlFieldsQuery(String.format(
                "CREATE TABLE IF NOT EXISTS Person (id INT PRIMARY KEY, name 
VARCHAR) WITH \"VALUE_TYPE=%s,CACHE_NAME=%s\"",
                Person.class.getName(), "PersonCache"
            )).setSchema("PUBLIC")
        ).getAll();


        int key = 1;
        Person val = new Person(key, "Person " + key);
        
        // 2. INSERT value to cache
        client.query(new SqlFieldsQuery("INSERT INTO Person(id, name) VALUES(?, 
?)")
            .setArgs(val.getId(), val.getName())
            .setSchema("PUBLIC")
        )
        .getAll();
        
        // 4. Execute put(). The key must be different from what was in INSERT
        // Without this line, there will be no exception
        client.getOrCreateCache("PersonCache").put(2, val);

        // 5. Execute get(). There will be an exception: 
org.apache.ignite.binary.BinaryObjectException: Cannot find metadata for object 
with compact footer
        assertNotNull(client.getOrCreateCache("PersonCache").get(1));
    }
}{code}
 

Decision:
{code:java}
+++ 
modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
      (date 1593418365270)
@@ -365,6 +365,11 @@
         @Override public BinaryType metadata(int typeId, int schemaId) throws 
BinaryObjectException {
             BinaryType meta = metadata(typeId);
 
+            if (meta != null && 
!((BinaryTypeImpl)meta).metadata().hasSchema(schemaId)) {
+                cache.metadata().removeIf(t -> t.typeId() == typeId);
+                meta = metadata(typeId);
+            }
+
             return meta != null && 
((BinaryTypeImpl)meta).metadata().hasSchema(schemaId) ? meta : null;
         }{code}


> Thin client with compactFooter: exception on get value after INSERT and put
> ---------------------------------------------------------------------------
>
>                 Key: IGNITE-13192
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13192
>             Project: Ignite
>          Issue Type: Bug
>          Components: thin client
>            Reporter: Surkov Aleksandr
>            Assignee: Aleksey Plekhanov
>            Priority: Major
>
> Start use thin client with compact footer equals true(setCompactFooter(true) 
> ). Create table through SQL. Then execut INSERT and put() with different 
> id/key. And then call method get() with id from INSERT. A 
> BinaryObjectException will occur. It is expected the value inserted through 
> INSERT. 
> Reproducer:
> {code:java}
> @Test
> public void testSql() throws Exception {
>     try (Ignite ignored = Ignition.start(Config.getServerConfiguration()); 
> Ignite ignored2 = Ignition.start(Config.getServerConfiguration());
>          IgniteClient client = Ignition.startClient(new 
> ClientConfiguration().setBinaryConfiguration(new 
> BinaryConfiguration().setCompactFooter(true)).setAddresses(Config.SERVER))
>     ) {
>         // 1. Create table
>         client.query(
>             new SqlFieldsQuery(String.format(
>                 "CREATE TABLE IF NOT EXISTS Person (id INT PRIMARY KEY, name 
> VARCHAR) WITH \"VALUE_TYPE=%s,CACHE_NAME=%s\"",
>                 Person.class.getName(), "PersonCache"
>             )).setSchema("PUBLIC")
>         ).getAll();
>         int key = 1;
>         Person val = new Person(key, "Person " + key);
>         
>         // 2. INSERT value to cache
>         client.query(new SqlFieldsQuery("INSERT INTO Person(id, name) 
> VALUES(?, ?)")
>             .setArgs(val.getId(), val.getName())
>             .setSchema("PUBLIC")
>         )
>         .getAll();
>         
>         // 4. Execute put(). The key must be different from what was in INSERT
>         // Without this line, there will be no exception
>         client.getOrCreateCache("PersonCache").put(2, val);
>         // 5. Execute get(). There will be an exception: 
> org.apache.ignite.binary.BinaryObjectException: Cannot find metadata for 
> object with compact footer
>         assertNotNull(client.getOrCreateCache("PersonCache").get(1));
>     }
> }{code}
>  
> Decision:
> {code:java}
> +++ 
> modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
>     (date 1593418365270)
> @@ -365,6 +365,11 @@
>          @Override public BinaryType metadata(int typeId, int schemaId) 
> throws BinaryObjectException {
>              BinaryType meta = metadata(typeId);
>  
> +            if (meta != null && 
> !((BinaryTypeImpl)meta).metadata().hasSchema(schemaId)) {
> +                cache.metadata().removeIf(t -> t.typeId() == typeId);
> +                meta = metadata(typeId);
> +            }
> +
>              return meta != null && 
> ((BinaryTypeImpl)meta).metadata().hasSchema(schemaId) ? meta : null;
>          }{code}



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

Reply via email to