You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2020/08/20 11:35:46 UTC

[ignite] branch master updated: IGNITE-13367 Unnecessary system classes registration fixed, 'Type not found' scenario handling improved. - Fixes #8162.

This is an automated email from the ASF dual-hosted git repository.

sergeychugunov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new cdb5500  IGNITE-13367 Unnecessary system classes registration fixed, 'Type not found' scenario handling improved. - Fixes #8162.
cdb5500 is described below

commit cdb5500e8aa5e1484599319d2d86d1ad33015808
Author: Sergey Chugunov <se...@gmail.com>
AuthorDate: Thu Aug 20 14:27:00 2020 +0300

    IGNITE-13367 Unnecessary system classes registration fixed, 'Type not found' scenario handling improved. - Fixes #8162.
    
    Signed-off-by: Sergey Chugunov <se...@gmail.com>
---
 .../meta/subcommands/MetadataRemoveCommand.java    |   7 +-
 .../util/GridCommandHandlerMetadataTest.java       | 105 +++++++++++++++++++++
 .../internal/binary/BinaryClassDescriptor.java     |  10 +-
 .../commandline/meta/tasks/MetadataRemoveTask.java |   3 +
 .../commandline/meta/tasks/MetadataTypeArgs.java   |   7 +-
 .../main/resources/META-INF/classnames.properties  |  49 ++++++++++
 6 files changed, 171 insertions(+), 10 deletions(-)

diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataRemoveCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataRemoveCommand.java
index 7d4b0e6..08e731b 100644
--- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataRemoveCommand.java
+++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataRemoveCommand.java
@@ -86,11 +86,8 @@ public class MetadataRemoveCommand
 
     /** {@inheritDoc} */
     @Override protected void printResult(MetadataMarshalled res, Logger log) {
-        if (res.metadata() == null) {
-            log.info("Type not found");
-
-            return;
-        }
+        if (res.metadata() == null)
+            throw new IllegalArgumentException("Failed to remove binary type, type not found: " + arg());
 
         BinaryMetadata m = res.metadata();
 
diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerMetadataTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerMetadataTest.java
index d7a1d1e..e4a2579 100644
--- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerMetadataTest.java
+++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerMetadataTest.java
@@ -26,10 +26,14 @@ import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.UUID;
+import java.util.stream.Collectors;
+
 import org.apache.ignite.IgniteBinary;
+import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.binary.BinaryObject;
@@ -43,6 +47,7 @@ import org.apache.ignite.internal.binary.BinarySchema;
 import org.apache.ignite.internal.binary.BinaryTypeImpl;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.jetbrains.annotations.Nullable;
+import org.junit.After;
 import org.junit.Test;
 
 import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS;
@@ -60,6 +65,12 @@ public class GridCommandHandlerMetadataTest extends GridCommandHandlerClusterByC
     /** Types count. */
     private static final int TYPES_CNT = 10;
 
+    /** */
+    @After
+    public void clear() {
+        crd.binary().types().stream().forEach(type -> crd.context().cacheObjects().removeType(type.typeId()));
+    }
+
     /**
      * Check the command '--meta list'.
      * Steps:
@@ -89,6 +100,100 @@ public class GridCommandHandlerMetadataTest extends GridCommandHandlerClusterByC
     }
 
     /**
+     * Checks that command remove when provided with absent type name prints informative message and
+     * returns corresponding error code (invalid argument).
+     *
+     * Test scenario:
+     * <ol>
+     *     <li>
+     *         Execute meta --remove command passing non-existing type name.
+     *     </li>
+     *     <li>
+     *         Verify that invalid argument error code is returned, message is printed to command output.
+     *     </li>
+     *     <li>
+     *         Execute meta --remove command passing non-existing type id.
+     *     </li>
+     *     <li>
+     *         Verify that invalid argument error code is returned, message is printed to command output.
+     *     </li>
+     * </ol>
+     */
+    @Test
+    public void testMetadataRemoveWrongType() {
+        injectTestSystemOut();
+
+        String wrongTypeName = "Type01";
+
+        assertEquals(EXIT_CODE_INVALID_ARGUMENTS, execute("--meta", "remove", "--typeName", wrongTypeName));
+
+        assertContains(log, testOut.toString(), "Failed to remove binary type, type not found: " + wrongTypeName);
+
+        int wrongTypeId = 42;
+
+        assertEquals(EXIT_CODE_INVALID_ARGUMENTS, execute("--meta", "remove", "--typeId", Integer.toString(wrongTypeId)));
+
+        assertContains(log, testOut.toString(), "Failed to remove binary type, type not found: ");
+        assertContains(log, testOut.toString(), "0x" +
+            Integer.toHexString(wrongTypeId).toUpperCase() + " (" + wrongTypeId + ")");
+    }
+
+    /**
+     * Checks that commands --meta list and --meta remove don't cause registering system or internal classes
+     * in binary metadata.
+     *
+     * Test scenario:
+     * <ol>
+     *     <li>
+     *         Put a value of a user class to the default cache that requires registering new binary type for that class.
+     *     </li>
+     *     <li>
+     *         Run --meta list command to check that class is registered.
+     *     </li>
+     *     <li>
+     *         Destroy the cache. Remove binary type with --meta remove command.
+     *     </li>
+     *     <li>
+     *         Run --meta list again to check that no additional system or internal classes were registered.
+     *     </li>
+     * </ol>
+     */
+    @Test
+    public void testMetadataForInternalClassesIsNotRegistered() {
+        injectTestSystemOut();
+
+        IgniteCache<Object, Object> dfltCache = grid(0).getOrCreateCache(DEFAULT_CACHE_NAME);
+
+        dfltCache.put(1, new TestValue());
+
+        Collection<BinaryType> metadata = crd.context().cacheObjects().metadata();
+
+        assertEquals(EXIT_CODE_OK, execute("--meta", "list"));
+
+        assertEquals(metadata.toString(), 1, metadata.size());
+
+        assertContains(log, testOut.toString(), "typeName=" + TestValue.class.getTypeName());
+
+        grid(0).destroyCache(DEFAULT_CACHE_NAME);
+
+        metadata = crd.context().cacheObjects().metadata();
+
+        assertEquals(metadata.toString(), 1, metadata.size());
+
+        assertEquals(EXIT_CODE_OK, execute("--meta", "remove", "--typeName", TestValue.class.getTypeName()));
+
+        metadata = crd.context().cacheObjects().metadata();
+
+        assertEquals("Binary metadata is expected to be empty but the following binary types were found: "
+            + metadata
+                .stream()
+                .map(b -> "BinaryType[typeId=" + b.typeId() + ", typeName=" + b.typeName() + ']')
+                .collect(Collectors.toList()).toString(),
+            0,
+            metadata.size());
+    }
+
+    /**
      * Check the command '--meta details'.
      * Steps:
      * - Creates binary two types for a test (by BinaryObjectBuilder) with several fields and shemas;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
index 5b58300..f15ac5b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java
@@ -827,12 +827,14 @@ public class BinaryClassDescriptor {
 
                                     BinarySchema newSchema = collector.schema();
 
-                                    BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(),
-                                        affKeyFieldName, Collections.singleton(newSchema), false, null);
+                                    schemaReg.addSchema(newSchema.schemaId(), newSchema);
 
-                                    ctx.updateMetadata(typeId, meta, writer.failIfUnregistered());
+                                    if (userType) {
+                                        BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(),
+                                            affKeyFieldName, Collections.singleton(newSchema), false, null);
 
-                                    schemaReg.addSchema(newSchema.schemaId(), newSchema);
+                                        ctx.updateMetadata(typeId, meta, writer.failIfUnregistered());
+                                    }
                                 }
                             }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataRemoveTask.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataRemoveTask.java
index f7de2ca..e85d1d6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataRemoveTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataRemoveTask.java
@@ -100,6 +100,9 @@ public class MetadataRemoveTask extends VisorMultiNodeTask<MetadataTypeArgs, Met
                     BinaryMetadata meta = ((CacheObjectBinaryProcessorImpl)ignite.context().cacheObjects())
                         .binaryMetadata(typeId);
 
+                    if (meta == null)
+                        return new MetadataMarshalled(null, null);
+
                     byte[] marshalled = U.marshal(ignite.context(), meta);
 
                     res = new MetadataMarshalled(marshalled, meta);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataTypeArgs.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataTypeArgs.java
index 05f8139..1704b76 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataTypeArgs.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/meta/tasks/MetadataTypeArgs.java
@@ -91,6 +91,11 @@ public class MetadataTypeArgs extends IgniteDataTransferObject {
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        return typeId != null ? "0x" + Integer.toHexString(typeId).toUpperCase() : typeName;
+        return typeId != null ? printInt(typeId) : typeName;
+    }
+
+    /** */
+    private String printInt(int val) {
+        return "0x" + Integer.toHexString(val).toUpperCase() + " (" + val + ')';
     }
 }
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index d4f4f01..f97d546 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -337,6 +337,54 @@ org.apache.ignite.internal.cluster.IgniteKillTask
 org.apache.ignite.internal.cluster.IgniteKillTask$IgniteKillJob
 org.apache.ignite.internal.cluster.NodeOrderComparator
 org.apache.ignite.internal.cluster.NodeOrderLegacyComparator
+org.apache.ignite.internal.commandline.CommandList
+org.apache.ignite.internal.commandline.OutputFormat
+org.apache.ignite.internal.commandline.TxCommandArg
+org.apache.ignite.internal.commandline.baseline.AutoAdjustCommandArg
+org.apache.ignite.internal.commandline.baseline.BaselineSubcommands
+org.apache.ignite.internal.commandline.cache.CacheCommandList
+org.apache.ignite.internal.commandline.cache.CacheSubcommands
+org.apache.ignite.internal.commandline.cache.argument.DistributionCommandArg
+org.apache.ignite.internal.commandline.cache.argument.FindAndDeleteGarbageArg
+org.apache.ignite.internal.commandline.cache.argument.IdleVerifyCommandArg
+org.apache.ignite.internal.commandline.cache.argument.ListCommandArg
+org.apache.ignite.internal.commandline.cache.argument.PartitionReconciliationCommandArg
+org.apache.ignite.internal.commandline.cache.argument.ValidateIndexesCommandArg
+org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesResult
+org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesTask
+org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesTask$CheckIndexInlineSizesJob
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionGroup
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionNode
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionPartition
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTask$CacheDistributionJob
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskArg
+org.apache.ignite.internal.commandline.cache.distribution.CacheDistributionTaskResult
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask$CacheResetLostPartitionsJob
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskArg
+org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskResult
+org.apache.ignite.internal.commandline.diagnostic.DiagnosticSubCommand
+org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand$PageLocksCommandArg
+org.apache.ignite.internal.commandline.dr.DrSubCommandsList
+org.apache.ignite.internal.commandline.dr.subcommands.DrCacheCommand$Action
+org.apache.ignite.internal.commandline.dr.subcommands.DrCacheCommand$CacheFilter
+org.apache.ignite.internal.commandline.dr.subcommands.DrCacheCommand$SenderGroup
+org.apache.ignite.internal.commandline.management.ManagementCommandList
+org.apache.ignite.internal.commandline.management.ManagementURLCommandArg
+org.apache.ignite.internal.commandline.meta.subcommands.MetadataAbstractSubCommand.VoidDto
+org.apache.ignite.internal.commandline.meta.tasks.MetadataListResult
+org.apache.ignite.internal.commandline.meta.tasks.MetadataInfoTask
+org.apache.ignite.internal.commandline.meta.tasks.MetadataInfoTask.MetadataListJob
+org.apache.ignite.internal.commandline.meta.tasks.MetadataMarshalled
+org.apache.ignite.internal.commandline.meta.tasks.MetadataRemoveTask
+org.apache.ignite.internal.commandline.meta.tasks.MetadataRemoveTask$MetadataRemoveJob
+org.apache.ignite.internal.commandline.meta.tasks.MetadataRemoveTask$DropAllThinSessionsJob
+org.apache.ignite.internal.commandline.meta.tasks.MetadataTypeArgs
+org.apache.ignite.internal.commandline.meta.tasks.MetadataUpdateTask
+org.apache.ignite.internal.commandline.meta.tasks.MetadataUpdateTask.MetadataUpdateJob
+org.apache.ignite.internal.commandline.ru.RollingUpgradeCommandArg
+org.apache.ignite.internal.commandline.ru.RollingUpgradeSubCommands
 org.apache.ignite.internal.compute.ComputeTaskCancelledCheckedException
 org.apache.ignite.internal.compute.ComputeTaskTimeoutCheckedException
 org.apache.ignite.internal.direct.DirectMessageReader$1
@@ -2457,3 +2505,4 @@ org.apache.ignite.transactions.TransactionTimeoutException
 org.apache.ignite.transactions.TransactionUnsupportedConcurrencyException
 org.apache.ignite.util.AttributeNodeFilter
 org.apache.ignite.internal.processors.cache.SysCacheInconsistencyInternalKeyTest$KeyUtility
+org.apache.ignite.util.deque.FastSizeDeque