You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Nikolay Izhikov (Jira)" <ji...@apache.org> on 2021/12/03 21:20:00 UTC

[jira] [Updated] (IGNITE-16057) Second read of array field from BinaryObject fail

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

Nikolay Izhikov updated IGNITE-16057:
-------------------------------------
    Description: 
Second read of array field fail and read some garbage.
This happen because when object read with handle stream position don't move to the end of already deserialized object.
So second array element is just random bytes from the middle of the stream.

BinaryObjectBuilderAdditionalSelfTest
{code:java}
    /** */
    @Test
    public void testArrayFieldSeveralRead() throws Exception {
        try (Ignite ignite = startGrid(1)) {
            TestClass1[] expArr = new TestClass1[] {new TestClass1(), new TestClass1()};

            BinaryObject arrObj = ignite.binary().toBinary(new TestClsWithArray(expArr));

            for (int i = 0; i < 10; i++)
                Assert.assertArrayEquals(i + " iteration", expArr, PlatformUtils.unwrapBinariesInArray(arrObj.field("arr")));

            arrObj = ignite.binary().builder(TestClsWithArray.class.getName()).setField("arr", expArr).build();

            for (int i = 0; i < 10; i++)
                Assert.assertArrayEquals(i + " iteration", expArr, PlatformUtils.unwrapBinariesInArray(arrObj.field("arr")));
        }
        finally {
            clearBinaryMeta();
        }
    }

    /** Test class with array. */
    public static class TestClsWithArray {
        /** */
        private final Object[] arr;

        /** */
        public TestClsWithArray(TestClass1[] arr) {
            this.arr = arr;
        }
    }
{code}

> Second read of array field from BinaryObject fail
> -------------------------------------------------
>
>                 Key: IGNITE-16057
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16057
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Nikolay Izhikov
>            Priority: Blocker
>
> Second read of array field fail and read some garbage.
> This happen because when object read with handle stream position don't move to the end of already deserialized object.
> So second array element is just random bytes from the middle of the stream.
> BinaryObjectBuilderAdditionalSelfTest
> {code:java}
>     /** */
>     @Test
>     public void testArrayFieldSeveralRead() throws Exception {
>         try (Ignite ignite = startGrid(1)) {
>             TestClass1[] expArr = new TestClass1[] {new TestClass1(), new TestClass1()};
>             BinaryObject arrObj = ignite.binary().toBinary(new TestClsWithArray(expArr));
>             for (int i = 0; i < 10; i++)
>                 Assert.assertArrayEquals(i + " iteration", expArr, PlatformUtils.unwrapBinariesInArray(arrObj.field("arr")));
>             arrObj = ignite.binary().builder(TestClsWithArray.class.getName()).setField("arr", expArr).build();
>             for (int i = 0; i < 10; i++)
>                 Assert.assertArrayEquals(i + " iteration", expArr, PlatformUtils.unwrapBinariesInArray(arrObj.field("arr")));
>         }
>         finally {
>             clearBinaryMeta();
>         }
>     }
>     /** Test class with array. */
>     public static class TestClsWithArray {
>         /** */
>         private final Object[] arr;
>         /** */
>         public TestClsWithArray(TestClass1[] arr) {
>             this.arr = arr;
>         }
>     }
> {code}



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