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..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 @@ -164,12 +164,12 @@ 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 storege metrics. */ protected final DataStorageMetricsImpl dsMetrics; + /** */ + private final Object mux = new Object(); + /** * @param ctx Kernal context. */ @@ -1247,9 +1247,22 @@ public void ensureFreeSpace(DataRegion memPlc) throws IgniteCheckedException { return; while (memPlc.evictionTracker().evictionRequired()) { - memPlc.metrics().onPageEvictionsStarted(); + boolean shouldLog = false; - warnFirstEvict(memPlc.config()); + if (!memPlc.metrics().isEvictionsStarted()) { + synchronized (mux) { + if (!memPlc.metrics().isEvictionsStarted()) { + memPlc.metrics().onPageEvictionsStarted(); + + shouldLog = true; + } + } + } + + if (shouldLog) { + U.warn(log, "Page-based evictions started." + + " Consider increasing 'maxSize' on Data Region configuration: " + memPlc.config().getName()); + } memPlc.evictionTracker().evictDataPage(); @@ -1587,26 +1600,6 @@ public void lastCheckpointInapplicableForWalRebalance(int grpId) { // No-op. } - /** - * Warns on first eviction. - * @param regCfg data region configuration. - */ - private void warnFirstEvict(DataRegionConfiguration regCfg) { - if (firstEvictWarn) - return; - - // Do not move warning output to synchronized block (it causes warning in IDE). - synchronized (this) { - if (firstEvictWarn) - return; - - firstEvictWarn = true; - } - - U.warn(log, "Page-based evictions started." + - " Consider increasing 'maxSize' on Data Region configuration: " + regCfg.getName()); - } - /** * Checking existence of a warm-up configuration. * 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);