IGNITE-10376 Fail to update metadata during invocation on cache - Fixes #5520.
authorIvan Fedotov <ivanan639@gmail.com>
Wed, 16 Jan 2019 13:11:33 +0000 (16:11 +0300)
committerIvan Rakov <irakov@apache.org>
Wed, 16 Jan 2019 13:13:32 +0000 (16:13 +0300)
Signed-off-by: Ivan Rakov <irakov@apache.org>
modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryMetadataHandler.java
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataKey.java
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java

index 85ab137..3652d98 100644 (file)
@@ -20,13 +20,15 @@ package org.apache.ignite.internal.binary;
 import java.util.Collection;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.binary.BinaryType;
+import org.apache.ignite.internal.processors.cache.binary.MetadataUpdateProposedMessage;
 
 /**
- * Binary meta data handler.
+ * Binary metadata handler.
  */
 public interface BinaryMetadataHandler {
     /**
-     * Adds meta data.
+     * Adds a new or updates an existing metadata to the latest version.
+     * See {@link MetadataUpdateProposedMessage} javadoc for detailed protocol description.
      *
      * @param typeId Type ID.
      * @param meta Metadata.
@@ -36,7 +38,7 @@ public interface BinaryMetadataHandler {
     public void addMeta(int typeId, BinaryType meta, boolean failIfUnregistered) throws BinaryObjectException;
 
     /**
-     * Gets meta data for provided type ID.
+     * Gets metadata for provided type ID.
      *
      * @param typeId Type ID.
      * @return Metadata.
@@ -45,7 +47,7 @@ public interface BinaryMetadataHandler {
     public BinaryType metadata(int typeId) throws BinaryObjectException;
 
     /**
-     * Gets unwrapped meta data for provided type ID.
+     * Gets unwrapped metadata for provided type ID.
      *
      * @param typeId Type ID.
      * @return Metadata.
index 32ab2a0..3527540 100644 (file)
@@ -25,7 +25,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheUtilityKey;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
 /**
- * Key for binary meta data.
+ * Key for binary metadata.
  */
 public class BinaryMetadataKey extends GridCacheUtilityKey<BinaryMetadataKey> implements Externalizable {
     /** */
index 7b6b4ab..4045766 100644 (file)
@@ -535,8 +535,16 @@ public class CacheObjectBinaryProcessorImpl extends GridProcessorAdapter impleme
 
             BinaryMetadata mergedMeta = BinaryUtils.mergeMetadata(oldMeta, newMeta0, changedSchemas);
 
-            if (oldMeta != null && mergedMeta == oldMeta && metaHolder.pendingVersion() == metaHolder.acceptedVersion())
-                return; // Safe to use existing schemas.
+            if (mergedMeta == oldMeta) {
+                // Metadata locally is up-to-date. Waiting for updating metadata in an entire cluster, if necessary.
+                if (metaHolder.pendingVersion() != metaHolder.acceptedVersion()) {
+                    GridFutureAdapter<MetadataUpdateResult> fut =
+                        transport.awaitMetadataUpdate(typeId, metaHolder.pendingVersion());
+
+                    fut.get();
+                }
+                return;
+            }
 
             if (failIfUnregistered)
                 throw new UnregisteredBinaryTypeException(
@@ -571,7 +579,7 @@ public class CacheObjectBinaryProcessorImpl extends GridProcessorAdapter impleme
                 throw res.error();
         }
         catch (IgniteCheckedException e) {
-            throw new BinaryObjectException("Failed to update meta data for type: " + newMeta.typeName(), e);
+            throw new BinaryObjectException("Failed to update metadata for type: " + newMeta.typeName(), e);
         }
     }
 
@@ -610,7 +618,7 @@ public class CacheObjectBinaryProcessorImpl extends GridProcessorAdapter impleme
 
     /**
      * @param typeId Type ID.
-     * @return Meta data.
+     * @return Metadata.
      * @throws IgniteException In case of error.
      */
     @Nullable public BinaryMetadata metadata0(final int typeId) {
index 84e32e1..c465314 100644 (file)
@@ -77,22 +77,22 @@ public final class MetadataUpdateProposedMessage implements DiscoveryCustomMessa
     /** */
     private final IgniteUuid id = IgniteUuid.randomUuid();
 
-    /** */
+    /** Node UUID which initiated metadata update. */
     private final UUID origNodeId;
 
     /** */
     private BinaryMetadata metadata;
 
-    /** */
+    /** Metadata type id. */
     private final int typeId;
 
-    /** */
+    /** Metadata version which is pending for update. */
     private int pendingVer;
 
-    /** */
+    /** Metadata version which is already accepted by entire cluster. */
     private int acceptedVer;
 
-    /** */
+    /** Message acceptance status. */
     private ProposalStatus status = ProposalStatus.SUCCESSFUL;
 
     /** */
@@ -222,7 +222,7 @@ public final class MetadataUpdateProposedMessage implements DiscoveryCustomMessa
         return typeId;
     }
 
-    /** */
+    /** Message acceptance status. */
     private enum ProposalStatus {
         /** */
         SUCCESSFUL,
index f59a99e..c029705 100644 (file)
@@ -240,7 +240,7 @@ public interface IgniteCacheObjectProcessor extends GridProcessor {
 
     /**
      * @param typeId Type ID.
-     * @param newMeta New meta data.
+     * @param newMeta New metadata.
      * @param failIfUnregistered Fail if unregistered.
      * @throws IgniteException In case of error.
      */
@@ -253,7 +253,7 @@ public interface IgniteCacheObjectProcessor extends GridProcessor {
      * of BinaryType.
      *
      * @param typeId Type ID.
-     * @param newMeta New meta data.
+     * @param newMeta New metadata.
      * @throws IgniteException In case of error.
      */
     public void addMetaLocally(int typeId, final BinaryType newMeta) throws IgniteException;
@@ -273,7 +273,7 @@ public interface IgniteCacheObjectProcessor extends GridProcessor {
 
     /**
      * @param typeId Type ID.
-     * @return Meta data.
+     * @return Metadata.
      * @throws IgniteException In case of error.
      */
     @Nullable public BinaryType metadata(int typeId) throws IgniteException;
@@ -282,14 +282,14 @@ public interface IgniteCacheObjectProcessor extends GridProcessor {
     /**
      * @param typeId Type ID.
      * @param schemaId Schema ID.
-     * @return Meta data.
+     * @return Metadata.
      * @throws IgniteException In case of error.
      */
     @Nullable public BinaryType metadata(int typeId, int schemaId) throws IgniteException;
 
     /**
      * @param typeIds Type ID.
-     * @return Meta data.
+     * @return Metadata.
      * @throws IgniteException In case of error.
      */
     public Map<Integer, BinaryType> metadata(Collection<Integer> typeIds) throws IgniteException;