You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ni...@apache.org on 2022/01/27 08:43:50 UTC

[ignite] branch master updated: IGNITE-16387 Improve CDC monitoring and logging (#9766)

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

nizhikov 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 e084f4a  IGNITE-16387 Improve CDC monitoring and logging (#9766)
e084f4a is described below

commit e084f4a88475b48be64ce8e2d02467a40247c0dd
Author: Nikolay <ni...@apache.org>
AuthorDate: Thu Jan 27 11:43:08 2022 +0300

    IGNITE-16387 Improve CDC monitoring and logging (#9766)
---
 docs/_docs/monitoring-metrics/new-metrics.adoc     |  14 ++
 docs/_docs/monitoring-metrics/system-views.adoc    |   1 +
 docs/_docs/tools/control-script.adoc               |   2 +-
 .../ignite/jdbc/thin/JdbcThinMetadataSelfTest.java |   1 +
 .../systemview/walker/CacheViewWalker.java         | 196 +++++++++++----------
 .../processors/cache/ClusterCachesInfo.java        |   2 +-
 .../processors/cache/GridCacheContext.java         |   5 +
 .../processors/cache/version/GridCacheVersion.java |   3 +-
 .../cache/version/GridCacheVersionEx.java          |   1 +
 .../cache/version/GridCacheVersionManager.java     |   5 +
 .../ignite/internal/visor/tx/TxVerboseId.java      |   2 +-
 .../ignite/spi/systemview/view/CacheView.java      |  22 ++-
 .../org/apache/ignite/cdc/CdcCacheVersionTest.java |  31 ++++
 .../processors/cache/GridCacheVersionSelfTest.java |   8 +
 14 files changed, 190 insertions(+), 103 deletions(-)

diff --git a/docs/_docs/monitoring-metrics/new-metrics.adoc b/docs/_docs/monitoring-metrics/new-metrics.adoc
index 08b69c7..44a68fc 100644
--- a/docs/_docs/monitoring-metrics/new-metrics.adoc
+++ b/docs/_docs/monitoring-metrics/new-metrics.adoc
@@ -452,3 +452,17 @@ Register name: `cluster`
 |TotalClientNodes| integer | Client nodes count.
 |TotalServerNodes| integer | Server nodes count.
 |===
+
+== Cache processor
+
+Cache processor metrics.
+
+Register name: `cache`
+
+
+[cols="2,1,3",opts="header"]
+|===
+|Name|    Type|    Description
+|LastDataVer| long | The latest data version on the node.
+|DataVersionClusterId| integer | Data version cluster id.
+|===
diff --git a/docs/_docs/monitoring-metrics/system-views.adoc b/docs/_docs/monitoring-metrics/system-views.adoc
index c642aad..a3ef869 100644
--- a/docs/_docs/monitoring-metrics/system-views.adoc
+++ b/docs/_docs/monitoring-metrics/system-views.adoc
@@ -114,6 +114,7 @@ control.bat --system-view NODE_METRICS --node-id a1b77663-b37f-4ddf-87a6-1e2d684
 |EVICTION_FILTER | string |  toString representation of eviction filter
 |EVICTION_POLICY_FACTORY | string |  toString representation of eviction policy factory
 |EXPIRY_POLICY_FACTORY | string |  toString representation of expiry policy factory
+|CONFLICT_RESOLVER | string |  toString representation of cache conflict resolver
 |INTERCEPTOR | string |  toString representation of interceptor
 |IS_COPY_ON_READ | boolean | Flag indicating whether a copy of the value stored in the on-heap cache
 |IS_EAGER_TTL | boolean | Flag indicating whether expired cache entries will be eagerly removed from cache
diff --git a/docs/_docs/tools/control-script.adoc b/docs/_docs/tools/control-script.adoc
index be2f9ed..a1cce22 100644
--- a/docs/_docs/tools/control-script.adoc
+++ b/docs/_docs/tools/control-script.adoc
@@ -593,7 +593,7 @@ If the index inline sizes are different, the console output is similar to the da
 [source,text]
 ----
 Control utility [ver. 2.10.0]
-2021 Copyright(C) Apache Software Foundation
+2022 Copyright(C) Apache Software Foundation
 User: test
 Time: 2021-04-27T16:13:21.213
 Command [CACHE] started
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
index cea2d07..43ec92f 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
@@ -692,6 +692,7 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest {
                 "SYS.CACHES.REBALANCE_ORDER.null.10",
                 "SYS.CACHES.EVICTION_FILTER.null.2147483647",
                 "SYS.CACHES.EVICTION_POLICY_FACTORY.null.2147483647",
+                "SYS.CACHES.CONFLICT_RESOLVER.null.2147483647",
                 "SYS.CACHES.IS_NEAR_CACHE_ENABLED.null.1",
                 "SYS.CACHES.NEAR_CACHE_EVICTION_POLICY_FACTORY.null.2147483647",
                 "SYS.CACHES.NEAR_CACHE_START_SIZE.null.10",
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/systemview/walker/CacheViewWalker.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/systemview/walker/CacheViewWalker.java
index 0b5f1c9..cc98a09 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/systemview/walker/CacheViewWalker.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/systemview/walker/CacheViewWalker.java
@@ -48,54 +48,55 @@ public class CacheViewWalker implements SystemViewRowAttributeWalker<CacheView>
         v.accept(10, "cacheLoaderFactory", String.class);
         v.accept(11, "cacheStoreFactory", String.class);
         v.accept(12, "cacheWriterFactory", String.class);
-        v.accept(13, "dataRegionName", String.class);
-        v.accept(14, "defaultLockTimeout", long.class);
-        v.accept(15, "evictionFilter", String.class);
-        v.accept(16, "evictionPolicyFactory", String.class);
-        v.accept(17, "expiryPolicyFactory", String.class);
-        v.accept(18, "interceptor", String.class);
-        v.accept(19, "isCopyOnRead", boolean.class);
-        v.accept(20, "isEagerTtl", boolean.class);
-        v.accept(21, "isEncryptionEnabled", boolean.class);
-        v.accept(22, "isEventsDisabled", boolean.class);
-        v.accept(23, "isInvalidate", boolean.class);
-        v.accept(24, "isLoadPreviousValue", boolean.class);
-        v.accept(25, "isManagementEnabled", boolean.class);
-        v.accept(26, "isNearCacheEnabled", boolean.class);
-        v.accept(27, "isOnheapCacheEnabled", boolean.class);
-        v.accept(28, "isReadFromBackup", boolean.class);
-        v.accept(29, "isReadThrough", boolean.class);
-        v.accept(30, "isSqlEscapeAll", boolean.class);
-        v.accept(31, "isSqlOnheapCacheEnabled", boolean.class);
-        v.accept(32, "isStatisticsEnabled", boolean.class);
-        v.accept(33, "isStoreKeepBinary", boolean.class);
-        v.accept(34, "isWriteBehindEnabled", boolean.class);
-        v.accept(35, "isWriteThrough", boolean.class);
-        v.accept(36, "maxConcurrentAsyncOperations", int.class);
-        v.accept(37, "maxQueryIteratorsCount", int.class);
-        v.accept(38, "nearCacheEvictionPolicyFactory", String.class);
-        v.accept(39, "nearCacheStartSize", int.class);
-        v.accept(40, "nodeFilter", String.class);
-        v.accept(41, "partitionLossPolicy", PartitionLossPolicy.class);
-        v.accept(42, "queryDetailMetricsSize", int.class);
-        v.accept(43, "queryParallelism", int.class);
-        v.accept(44, "rebalanceBatchSize", int.class);
-        v.accept(45, "rebalanceBatchesPrefetchCount", long.class);
-        v.accept(46, "rebalanceDelay", long.class);
-        v.accept(47, "rebalanceMode", CacheRebalanceMode.class);
-        v.accept(48, "rebalanceOrder", int.class);
-        v.accept(49, "rebalanceThrottle", long.class);
-        v.accept(50, "rebalanceTimeout", long.class);
-        v.accept(51, "sqlIndexMaxInlineSize", int.class);
-        v.accept(52, "sqlOnheapCacheMaxSize", int.class);
-        v.accept(53, "sqlSchema", String.class);
-        v.accept(54, "topologyValidator", String.class);
-        v.accept(55, "writeBehindBatchSize", int.class);
-        v.accept(56, "writeBehindCoalescing", boolean.class);
-        v.accept(57, "writeBehindFlushFrequency", long.class);
-        v.accept(58, "writeBehindFlushSize", int.class);
-        v.accept(59, "writeBehindFlushThreadCount", int.class);
-        v.accept(60, "writeSynchronizationMode", CacheWriteSynchronizationMode.class);
+        v.accept(13, "conflictResolver", String.class);
+        v.accept(14, "dataRegionName", String.class);
+        v.accept(15, "defaultLockTimeout", long.class);
+        v.accept(16, "evictionFilter", String.class);
+        v.accept(17, "evictionPolicyFactory", String.class);
+        v.accept(18, "expiryPolicyFactory", String.class);
+        v.accept(19, "interceptor", String.class);
+        v.accept(20, "isCopyOnRead", boolean.class);
+        v.accept(21, "isEagerTtl", boolean.class);
+        v.accept(22, "isEncryptionEnabled", boolean.class);
+        v.accept(23, "isEventsDisabled", boolean.class);
+        v.accept(24, "isInvalidate", boolean.class);
+        v.accept(25, "isLoadPreviousValue", boolean.class);
+        v.accept(26, "isManagementEnabled", boolean.class);
+        v.accept(27, "isNearCacheEnabled", boolean.class);
+        v.accept(28, "isOnheapCacheEnabled", boolean.class);
+        v.accept(29, "isReadFromBackup", boolean.class);
+        v.accept(30, "isReadThrough", boolean.class);
+        v.accept(31, "isSqlEscapeAll", boolean.class);
+        v.accept(32, "isSqlOnheapCacheEnabled", boolean.class);
+        v.accept(33, "isStatisticsEnabled", boolean.class);
+        v.accept(34, "isStoreKeepBinary", boolean.class);
+        v.accept(35, "isWriteBehindEnabled", boolean.class);
+        v.accept(36, "isWriteThrough", boolean.class);
+        v.accept(37, "maxConcurrentAsyncOperations", int.class);
+        v.accept(38, "maxQueryIteratorsCount", int.class);
+        v.accept(39, "nearCacheEvictionPolicyFactory", String.class);
+        v.accept(40, "nearCacheStartSize", int.class);
+        v.accept(41, "nodeFilter", String.class);
+        v.accept(42, "partitionLossPolicy", PartitionLossPolicy.class);
+        v.accept(43, "queryDetailMetricsSize", int.class);
+        v.accept(44, "queryParallelism", int.class);
+        v.accept(45, "rebalanceBatchSize", int.class);
+        v.accept(46, "rebalanceBatchesPrefetchCount", long.class);
+        v.accept(47, "rebalanceDelay", long.class);
+        v.accept(48, "rebalanceMode", CacheRebalanceMode.class);
+        v.accept(49, "rebalanceOrder", int.class);
+        v.accept(50, "rebalanceThrottle", long.class);
+        v.accept(51, "rebalanceTimeout", long.class);
+        v.accept(52, "sqlIndexMaxInlineSize", int.class);
+        v.accept(53, "sqlOnheapCacheMaxSize", int.class);
+        v.accept(54, "sqlSchema", String.class);
+        v.accept(55, "topologyValidator", String.class);
+        v.accept(56, "writeBehindBatchSize", int.class);
+        v.accept(57, "writeBehindCoalescing", boolean.class);
+        v.accept(58, "writeBehindFlushFrequency", long.class);
+        v.accept(59, "writeBehindFlushSize", int.class);
+        v.accept(60, "writeBehindFlushThreadCount", int.class);
+        v.accept(61, "writeSynchronizationMode", CacheWriteSynchronizationMode.class);
     }
 
     /** {@inheritDoc} */
@@ -113,58 +114,59 @@ public class CacheViewWalker implements SystemViewRowAttributeWalker<CacheView>
         v.accept(10, "cacheLoaderFactory", String.class, row.cacheLoaderFactory());
         v.accept(11, "cacheStoreFactory", String.class, row.cacheStoreFactory());
         v.accept(12, "cacheWriterFactory", String.class, row.cacheWriterFactory());
-        v.accept(13, "dataRegionName", String.class, row.dataRegionName());
-        v.acceptLong(14, "defaultLockTimeout", row.defaultLockTimeout());
-        v.accept(15, "evictionFilter", String.class, row.evictionFilter());
-        v.accept(16, "evictionPolicyFactory", String.class, row.evictionPolicyFactory());
-        v.accept(17, "expiryPolicyFactory", String.class, row.expiryPolicyFactory());
-        v.accept(18, "interceptor", String.class, row.interceptor());
-        v.acceptBoolean(19, "isCopyOnRead", row.isCopyOnRead());
-        v.acceptBoolean(20, "isEagerTtl", row.isEagerTtl());
-        v.acceptBoolean(21, "isEncryptionEnabled", row.isEncryptionEnabled());
-        v.acceptBoolean(22, "isEventsDisabled", row.isEventsDisabled());
-        v.acceptBoolean(23, "isInvalidate", row.isInvalidate());
-        v.acceptBoolean(24, "isLoadPreviousValue", row.isLoadPreviousValue());
-        v.acceptBoolean(25, "isManagementEnabled", row.isManagementEnabled());
-        v.acceptBoolean(26, "isNearCacheEnabled", row.isNearCacheEnabled());
-        v.acceptBoolean(27, "isOnheapCacheEnabled", row.isOnheapCacheEnabled());
-        v.acceptBoolean(28, "isReadFromBackup", row.isReadFromBackup());
-        v.acceptBoolean(29, "isReadThrough", row.isReadThrough());
-        v.acceptBoolean(30, "isSqlEscapeAll", row.isSqlEscapeAll());
-        v.acceptBoolean(31, "isSqlOnheapCacheEnabled", row.isSqlOnheapCacheEnabled());
-        v.acceptBoolean(32, "isStatisticsEnabled", row.isStatisticsEnabled());
-        v.acceptBoolean(33, "isStoreKeepBinary", row.isStoreKeepBinary());
-        v.acceptBoolean(34, "isWriteBehindEnabled", row.isWriteBehindEnabled());
-        v.acceptBoolean(35, "isWriteThrough", row.isWriteThrough());
-        v.acceptInt(36, "maxConcurrentAsyncOperations", row.maxConcurrentAsyncOperations());
-        v.acceptInt(37, "maxQueryIteratorsCount", row.maxQueryIteratorsCount());
-        v.accept(38, "nearCacheEvictionPolicyFactory", String.class, row.nearCacheEvictionPolicyFactory());
-        v.acceptInt(39, "nearCacheStartSize", row.nearCacheStartSize());
-        v.accept(40, "nodeFilter", String.class, row.nodeFilter());
-        v.accept(41, "partitionLossPolicy", PartitionLossPolicy.class, row.partitionLossPolicy());
-        v.acceptInt(42, "queryDetailMetricsSize", row.queryDetailMetricsSize());
-        v.acceptInt(43, "queryParallelism", row.queryParallelism());
-        v.acceptInt(44, "rebalanceBatchSize", row.rebalanceBatchSize());
-        v.acceptLong(45, "rebalanceBatchesPrefetchCount", row.rebalanceBatchesPrefetchCount());
-        v.acceptLong(46, "rebalanceDelay", row.rebalanceDelay());
-        v.accept(47, "rebalanceMode", CacheRebalanceMode.class, row.rebalanceMode());
-        v.acceptInt(48, "rebalanceOrder", row.rebalanceOrder());
-        v.acceptLong(49, "rebalanceThrottle", row.rebalanceThrottle());
-        v.acceptLong(50, "rebalanceTimeout", row.rebalanceTimeout());
-        v.acceptInt(51, "sqlIndexMaxInlineSize", row.sqlIndexMaxInlineSize());
-        v.acceptInt(52, "sqlOnheapCacheMaxSize", row.sqlOnheapCacheMaxSize());
-        v.accept(53, "sqlSchema", String.class, row.sqlSchema());
-        v.accept(54, "topologyValidator", String.class, row.topologyValidator());
-        v.acceptInt(55, "writeBehindBatchSize", row.writeBehindBatchSize());
-        v.acceptBoolean(56, "writeBehindCoalescing", row.writeBehindCoalescing());
-        v.acceptLong(57, "writeBehindFlushFrequency", row.writeBehindFlushFrequency());
-        v.acceptInt(58, "writeBehindFlushSize", row.writeBehindFlushSize());
-        v.acceptInt(59, "writeBehindFlushThreadCount", row.writeBehindFlushThreadCount());
-        v.accept(60, "writeSynchronizationMode", CacheWriteSynchronizationMode.class, row.writeSynchronizationMode());
+        v.accept(13, "conflictResolver", String.class, row.conflictResolver());
+        v.accept(14, "dataRegionName", String.class, row.dataRegionName());
+        v.acceptLong(15, "defaultLockTimeout", row.defaultLockTimeout());
+        v.accept(16, "evictionFilter", String.class, row.evictionFilter());
+        v.accept(17, "evictionPolicyFactory", String.class, row.evictionPolicyFactory());
+        v.accept(18, "expiryPolicyFactory", String.class, row.expiryPolicyFactory());
+        v.accept(19, "interceptor", String.class, row.interceptor());
+        v.acceptBoolean(20, "isCopyOnRead", row.isCopyOnRead());
+        v.acceptBoolean(21, "isEagerTtl", row.isEagerTtl());
+        v.acceptBoolean(22, "isEncryptionEnabled", row.isEncryptionEnabled());
+        v.acceptBoolean(23, "isEventsDisabled", row.isEventsDisabled());
+        v.acceptBoolean(24, "isInvalidate", row.isInvalidate());
+        v.acceptBoolean(25, "isLoadPreviousValue", row.isLoadPreviousValue());
+        v.acceptBoolean(26, "isManagementEnabled", row.isManagementEnabled());
+        v.acceptBoolean(27, "isNearCacheEnabled", row.isNearCacheEnabled());
+        v.acceptBoolean(28, "isOnheapCacheEnabled", row.isOnheapCacheEnabled());
+        v.acceptBoolean(29, "isReadFromBackup", row.isReadFromBackup());
+        v.acceptBoolean(30, "isReadThrough", row.isReadThrough());
+        v.acceptBoolean(31, "isSqlEscapeAll", row.isSqlEscapeAll());
+        v.acceptBoolean(32, "isSqlOnheapCacheEnabled", row.isSqlOnheapCacheEnabled());
+        v.acceptBoolean(33, "isStatisticsEnabled", row.isStatisticsEnabled());
+        v.acceptBoolean(34, "isStoreKeepBinary", row.isStoreKeepBinary());
+        v.acceptBoolean(35, "isWriteBehindEnabled", row.isWriteBehindEnabled());
+        v.acceptBoolean(36, "isWriteThrough", row.isWriteThrough());
+        v.acceptInt(37, "maxConcurrentAsyncOperations", row.maxConcurrentAsyncOperations());
+        v.acceptInt(38, "maxQueryIteratorsCount", row.maxQueryIteratorsCount());
+        v.accept(39, "nearCacheEvictionPolicyFactory", String.class, row.nearCacheEvictionPolicyFactory());
+        v.acceptInt(40, "nearCacheStartSize", row.nearCacheStartSize());
+        v.accept(41, "nodeFilter", String.class, row.nodeFilter());
+        v.accept(42, "partitionLossPolicy", PartitionLossPolicy.class, row.partitionLossPolicy());
+        v.acceptInt(43, "queryDetailMetricsSize", row.queryDetailMetricsSize());
+        v.acceptInt(44, "queryParallelism", row.queryParallelism());
+        v.acceptInt(45, "rebalanceBatchSize", row.rebalanceBatchSize());
+        v.acceptLong(46, "rebalanceBatchesPrefetchCount", row.rebalanceBatchesPrefetchCount());
+        v.acceptLong(47, "rebalanceDelay", row.rebalanceDelay());
+        v.accept(48, "rebalanceMode", CacheRebalanceMode.class, row.rebalanceMode());
+        v.acceptInt(49, "rebalanceOrder", row.rebalanceOrder());
+        v.acceptLong(50, "rebalanceThrottle", row.rebalanceThrottle());
+        v.acceptLong(51, "rebalanceTimeout", row.rebalanceTimeout());
+        v.acceptInt(52, "sqlIndexMaxInlineSize", row.sqlIndexMaxInlineSize());
+        v.acceptInt(53, "sqlOnheapCacheMaxSize", row.sqlOnheapCacheMaxSize());
+        v.accept(54, "sqlSchema", String.class, row.sqlSchema());
+        v.accept(55, "topologyValidator", String.class, row.topologyValidator());
+        v.acceptInt(56, "writeBehindBatchSize", row.writeBehindBatchSize());
+        v.acceptBoolean(57, "writeBehindCoalescing", row.writeBehindCoalescing());
+        v.acceptLong(58, "writeBehindFlushFrequency", row.writeBehindFlushFrequency());
+        v.acceptInt(59, "writeBehindFlushSize", row.writeBehindFlushSize());
+        v.acceptInt(60, "writeBehindFlushThreadCount", row.writeBehindFlushThreadCount());
+        v.accept(61, "writeSynchronizationMode", CacheWriteSynchronizationMode.class, row.writeSynchronizationMode());
     }
 
     /** {@inheritDoc} */
     @Override public int count() {
-        return 61;
+        return 62;
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
index a72b444..299b53c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
@@ -177,7 +177,7 @@ public class ClusterCachesInfo {
         ctx.systemView().registerView(CACHES_VIEW, CACHES_VIEW_DESC,
             new CacheViewWalker(),
             registeredCaches.values(),
-            CacheView::new);
+            (desc) -> new CacheView(desc, ctx));
 
         ctx.systemView().registerView(CACHE_GRPS_VIEW, CACHE_GRPS_VIEW_DESC,
             new CacheGroupViewWalker(),
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 319c3ec..281dc2a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -1654,6 +1654,11 @@ public class GridCacheContext<K, V> implements Externalizable {
         return conflictRslvr != null;
     }
 
+    /** @return Conflict resolver. */
+    public CacheVersionConflictResolver conflictResolver() {
+        return conflictRslvr;
+    }
+
     /**
      * Resolve DR conflict.
      *
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java
index 7769501..a54a9f5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java
@@ -326,6 +326,7 @@ public class GridCacheVersion implements Message, Externalizable, CacheEntryVers
     @Override public String toString() {
         return "GridCacheVersion [topVer=" + topologyVersion() +
             ", order=" + order() +
-            ", nodeOrder=" + nodeOrder() + ']';
+            ", nodeOrder=" + nodeOrder() +
+            ", dataCenterId=" + dataCenterId() + ']';
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java
index 1d5bad0..4848893 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java
@@ -168,6 +168,7 @@ public class GridCacheVersionEx extends GridCacheVersion {
         return "GridCacheVersionEx [topVer=" + topologyVersion() +
             ", order=" + order() +
             ", nodeOrder=" + nodeOrder() +
+            ", dataCenterId=" + dataCenterId() +
             ", drVer=" + drVer + ']';
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
index 48a6507..ac81bf9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
@@ -49,6 +49,9 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
     /** Last data version metric name. */
     public static final String LAST_DATA_VER = "LastDataVersion";
 
+    /** Cluster ID metric name. */
+    public static final String DATA_VER_CLUSTER_ID = "DataVersionClusterId";
+
     /** Last version metric. */
     protected AtomicLongMetric lastDataVer;
 
@@ -99,6 +102,8 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
 
         lastDataVer = sysreg.longMetric(LAST_DATA_VER, "The latest data version on the node.");
 
+        sysreg.register(DATA_VER_CLUSTER_ID, () -> dataCenterId, "Data version cluster id.");
+
         startVer = new GridCacheVersion(0, 0, 0, dataCenterId);
 
         cctx.gridEvents().addLocalEventListener(discoLsnr, EVT_NODE_METRICS_UPDATED);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/TxVerboseId.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/TxVerboseId.java
index 0bb25ac..afd4547 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/TxVerboseId.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/TxVerboseId.java
@@ -88,7 +88,7 @@ public class TxVerboseId extends IgniteDataTransferObject {
                 "either UUID or GridCacheVersion text representation: " + text);
         }
 
-        assert m.groupCount() == 3 : "Unexpected group count [cnt=" + m.groupCount() + ", pattern=" + regexPtrn + ']';
+        assert m.groupCount() == 4 : "Unexpected group count [cnt=" + m.groupCount() + ", pattern=" + regexPtrn + ']';
 
         try {
             return new TxVerboseId(null, new GridCacheVersion(
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/CacheView.java b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/CacheView.java
index e2c0932..72c663f 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/CacheView.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/CacheView.java
@@ -27,10 +27,13 @@ import org.apache.ignite.cache.affinity.AffinityKeyMapper;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.configuration.TopologyValidator;
+import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.managers.systemview.walker.Order;
 import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
 import org.apache.ignite.internal.processors.cache.CacheType;
 import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
+import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
+import org.apache.ignite.internal.processors.cache.version.CacheVersionConflictResolver;
 
 import static org.apache.ignite.internal.util.IgniteUtils.toStringSafe;
 
@@ -39,13 +42,18 @@ import static org.apache.ignite.internal.util.IgniteUtils.toStringSafe;
  */
 public class CacheView {
     /** Cache descriptor. */
-    private DynamicCacheDescriptor cache;
+    private final DynamicCacheDescriptor cache;
+
+    /** Kernal context. */
+    private final GridKernalContext ctx;
 
     /**
      * @param cache Cache descriptor.
+     * @param ctx Kernal context.
      */
-    public CacheView(DynamicCacheDescriptor cache) {
+    public CacheView(DynamicCacheDescriptor cache, GridKernalContext ctx) {
         this.cache = cache;
+        this.ctx = ctx;
     }
 
     /** @see DynamicCacheDescriptor#groupId() */
@@ -370,4 +378,14 @@ public class CacheView {
     public String dataRegionName() {
         return cache.cacheConfiguration().getDataRegionName();
     }
+
+    /** @see CacheVersionConflictResolver */
+    public String conflictResolver() {
+        IgniteInternalCache<Object, Object> cache = ctx.cache().cache(this.cache.cacheName());
+
+        if (cache == null || !cache.context().conflictNeedResolve())
+            return null;
+
+        return toStringSafe(cache.context().conflictResolver());
+    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/cdc/CdcCacheVersionTest.java b/modules/core/src/test/java/org/apache/ignite/cdc/CdcCacheVersionTest.java
index 050f4bc..efea107 100644
--- a/modules/core/src/test/java/org/apache/ignite/cdc/CdcCacheVersionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/cdc/CdcCacheVersionTest.java
@@ -49,10 +49,16 @@ import org.apache.ignite.plugin.AbstractCachePluginProvider;
 import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.apache.ignite.plugin.CachePluginContext;
 import org.apache.ignite.plugin.CachePluginProvider;
+import org.apache.ignite.spi.metric.IntMetric;
+import org.apache.ignite.spi.systemview.view.CacheView;
+import org.apache.ignite.spi.systemview.view.SystemView;
 import org.jetbrains.annotations.Nullable;
 import org.junit.Test;
 
 import static org.apache.ignite.cluster.ClusterState.ACTIVE;
+import static org.apache.ignite.internal.processors.cache.CacheMetricsImpl.CACHE_METRICS;
+import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHES_VIEW;
+import static org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager.DATA_VER_CLUSTER_ID;
 import static org.apache.ignite.testframework.GridTestUtils.runAsync;
 import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 
@@ -122,6 +128,27 @@ public class CdcCacheVersionTest extends AbstractCdcTest {
         IgniteCache<Integer, User> cache = ign.getOrCreateCache(FOR_OTHER_CLUSTER_ID);
 
         addAndWaitForConsumption(cnsmr, cfg, cache, null, this::addConflictData, 0, KEYS_CNT, true);
+
+        assertEquals(
+            DFLT_CLUSTER_ID,
+            ign.context().metric().registry(CACHE_METRICS).<IntMetric>findMetric(DATA_VER_CLUSTER_ID).value()
+        );
+
+        boolean found = false;
+
+        SystemView<CacheView> caches = ign.context().systemView().view(CACHES_VIEW);
+
+        for (CacheView v : caches) {
+            if (v.cacheName().equals(FOR_OTHER_CLUSTER_ID)) {
+                assertEquals(v.conflictResolver(), "TestCacheConflictResolutionManager");
+
+                found = true;
+            }
+            else
+                assertNull(v.conflictResolver());
+        }
+
+        assertTrue(found);
     }
 
     /** */
@@ -223,6 +250,10 @@ public class CdcCacheVersionTest extends AbstractCdcTest {
 
                     return res;
                 }
+
+                @Override public String toString() {
+                    return "TestCacheConflictResolutionManager";
+                }
             };
         }
     }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheVersionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheVersionSelfTest.java
index 77df9f6..12918ad 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheVersionSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheVersionSelfTest.java
@@ -47,10 +47,18 @@ public class GridCacheVersionSelfTest extends GridCommonAbstractTest {
         ver = version(0x7FFFFFF, 15);
         assertEquals(0x7FFFFFF, ver.nodeOrder());
         assertEquals(15, ver.dataCenterId());
+        assertEquals(
+            ver.toString(),
+            "GridCacheVersion [topVer=0, order=0, nodeOrder=" + 0x7FFFFFF + ", dataCenterId=15]"
+        );
 
         ver = version(0x7FFFFFF, 31);
         assertEquals(0x7FFFFFF, ver.nodeOrder());
         assertEquals(31, ver.dataCenterId());
+        assertEquals(
+            ver.toString(),
+            "GridCacheVersion [topVer=0, order=0, nodeOrder=" + 0x7FFFFFF + ", dataCenterId=31]"
+        );
 
         // Check max dr ID with some topology versions.
         ver = version(11, 31);