From 5cf2e71bf9f0d76a20e22bc0e679bbe459fa0018 Mon Sep 17 00:00:00 2001 From: "Valuyskiy.O.Y" Date: Sat, 28 Mar 2026 10:45:14 +1000 Subject: [PATCH 1/3] IGNITE-28099 Fix eviction warning to be logged per data region --- .../IgniteCacheDatabaseSharedManager.java | 17 ++++++++--------- .../IgniteDataStorageMetricsSelfTest.java | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java index cb63dbedbef70..6fee351c46a2c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -164,8 +165,8 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap /** Page size from memory configuration, may be set only for fake(standalone) IgniteCacheDataBaseSharedManager */ private int pageSize; - /** First eviction was warned flag. */ - private volatile boolean firstEvictWarn; + /** Data regions for which the first page-eviction warning has been logged. */ + private final Set evictWarnedRegions = Collections.newSetFromMap(new IdentityHashMap<>()); /** Data storege metrics. */ protected final DataStorageMetricsImpl dsMetrics; @@ -1592,19 +1593,17 @@ public void lastCheckpointInapplicableForWalRebalance(int grpId) { * @param regCfg data region configuration. */ private void warnFirstEvict(DataRegionConfiguration regCfg) { - if (firstEvictWarn) - return; + boolean shouldWarn; // Do not move warning output to synchronized block (it causes warning in IDE). synchronized (this) { - if (firstEvictWarn) - return; - - firstEvictWarn = true; + shouldWarn = evictWarnedRegions.add(regCfg); } - U.warn(log, "Page-based evictions started." + + if (shouldWarn) { + U.warn(log, "Page-based evictions started." + " Consider increasing 'maxSize' on Data Region configuration: " + regCfg.getName()); + } } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteDataStorageMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteDataStorageMetricsSelfTest.java index dffaf8a29a9a2..977368c4ee67d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteDataStorageMetricsSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteDataStorageMetricsSelfTest.java @@ -532,9 +532,11 @@ public void testEvictionsStartedMetric() throws Exception { String template = "Page-based evictions started. Consider increasing 'maxSize' on Data Region configuration: "; - LogListener lsnr = LogListener.matches(template + NO_PERSISTENCE_1).build(); + LogListener lsnr1 = LogListener.matches(template + NO_PERSISTENCE_1).build(); + LogListener lsnr2 = LogListener.matches(template + NO_PERSISTENCE_2).build(); - listeningLog.registerListener(lsnr); + listeningLog.registerListener(lsnr1); + listeningLog.registerListener(lsnr2); DataRegionMetrics memMetrics1 = ignite.dataRegionMetrics(NO_PERSISTENCE_1); DataRegionMetrics memMetrics2 = ignite.dataRegionMetrics(NO_PERSISTENCE_2); @@ -550,15 +552,12 @@ public void testEvictionsStartedMetric() throws Exception { String big = repeat('X', 256 * 1024); - int entryCnt = 0; + int entryCntMax = 1_000_000; - for (int i = 0; i < 1_000_000 && !lsnr.check(); i++) { + for (int i = 0; i < entryCntMax && !lsnr1.check(); i++) cacheNp1.put(i, new Person("first-" + i + "-" + big, "last-" + i + "-" + big)); - entryCnt++; - } - - assertTrue(lsnr.check()); + assertTrue(lsnr1.check()); memMetrics1 = ignite.dataRegionMetrics(NO_PERSISTENCE_1); memMetrics2 = ignite.dataRegionMetrics(NO_PERSISTENCE_2); @@ -566,9 +565,11 @@ public void testEvictionsStartedMetric() throws Exception { assertTrue(memMetrics1.isEvictionsStarted()); assertFalse(memMetrics2.isEvictionsStarted()); - for (int i = 0; i < entryCnt + 10; i++) + for (int i = 0; i < entryCntMax && !lsnr2.check(); i++) cacheNp2.put(i, new Person("first-" + i + "-" + big, "last-" + i + "-" + big)); + assertTrue(lsnr2.check()); + memMetrics1 = ignite.dataRegionMetrics(NO_PERSISTENCE_1); memMetrics2 = ignite.dataRegionMetrics(NO_PERSISTENCE_2); From addc3ca7feb48f6c49e7bc4bc89d5683a28b4324 Mon Sep 17 00:00:00 2001 From: "Valuyskiy.O.Y" Date: Fri, 3 Apr 2026 07:26:29 +1000 Subject: [PATCH 2/3] IGNITE-28099 Move first eviction warning logic to IgniteCacheDatabaseSharedManager#ensureFreeSpace --- .../IgniteCacheDatabaseSharedManager.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java index 6fee351c46a2c..e3c04e45eedb9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java @@ -22,7 +22,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; -import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -165,9 +164,6 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap /** Page size from memory configuration, may be set only for fake(standalone) IgniteCacheDataBaseSharedManager */ private int pageSize; - /** Data regions for which the first page-eviction warning has been logged. */ - private final Set evictWarnedRegions = Collections.newSetFromMap(new IdentityHashMap<>()); - /** Data storege metrics. */ protected final DataStorageMetricsImpl dsMetrics; @@ -1248,9 +1244,14 @@ public void ensureFreeSpace(DataRegion memPlc) throws IgniteCheckedException { return; while (memPlc.evictionTracker().evictionRequired()) { + boolean shouldWarn = !memPlc.metrics().isEvictionsStarted(); + memPlc.metrics().onPageEvictionsStarted(); - warnFirstEvict(memPlc.config()); + if (shouldWarn) { + U.warn(log, "Page-based evictions started." + + " Consider increasing 'maxSize' on Data Region configuration: " + memPlc.config().getName()); + } memPlc.evictionTracker().evictDataPage(); @@ -1588,24 +1589,6 @@ public void lastCheckpointInapplicableForWalRebalance(int grpId) { // No-op. } - /** - * Warns on first eviction. - * @param regCfg data region configuration. - */ - private void warnFirstEvict(DataRegionConfiguration regCfg) { - boolean shouldWarn; - - // Do not move warning output to synchronized block (it causes warning in IDE). - synchronized (this) { - shouldWarn = evictWarnedRegions.add(regCfg); - } - - if (shouldWarn) { - U.warn(log, "Page-based evictions started." + - " Consider increasing 'maxSize' on Data Region configuration: " + regCfg.getName()); - } - } - /** * Checking existence of a warm-up configuration. * From 6fe421b0872e2f8d18c784b87837fb41d144f02d Mon Sep 17 00:00:00 2001 From: "Valuyskiy.O.Y" Date: Mon, 6 Apr 2026 17:52:39 +1000 Subject: [PATCH 3/3] IGNITE-28099 Add DCL to IgniteCacheDatabaseSharedManager#ensureFreeSpace --- .../IgniteCacheDatabaseSharedManager.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java index e3c04e45eedb9..2143c85d25103 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java @@ -167,6 +167,9 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap /** Data storege metrics. */ protected final DataStorageMetricsImpl dsMetrics; + /** */ + private final Object mux = new Object(); + /** * @param ctx Kernal context. */ @@ -1244,11 +1247,19 @@ public void ensureFreeSpace(DataRegion memPlc) throws IgniteCheckedException { return; while (memPlc.evictionTracker().evictionRequired()) { - boolean shouldWarn = !memPlc.metrics().isEvictionsStarted(); + boolean shouldLog = false; + + if (!memPlc.metrics().isEvictionsStarted()) { + synchronized (mux) { + if (!memPlc.metrics().isEvictionsStarted()) { + memPlc.metrics().onPageEvictionsStarted(); - memPlc.metrics().onPageEvictionsStarted(); + shouldLog = true; + } + } + } - if (shouldWarn) { + if (shouldLog) { U.warn(log, "Page-based evictions started." + " Consider increasing 'maxSize' on Data Region configuration: " + memPlc.config().getName()); }