This is an automated email from the ASF dual-hosted git repository. tkalkirill pushed a commit to branch ignite-26574 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit c6cbcc884b89f76a7183ed9b7b7a6469175c6c20 Author: Kirill Tkalenko <[email protected]> AuthorDate: Fri Oct 3 11:06:20 2025 +0300 IGNITE-26574 wip --- modules/page-memory/build.gradle | 1 + .../persistence/checkpoint/CheckpointManager.java | 4 +- .../checkpoint/CheckpointMetricSource.java | 85 +++++++++++++++ .../persistence/checkpoint/CheckpointMetrics.java | 116 +++++++++++++++++++++ .../persistence/checkpoint/Checkpointer.java | 10 +- .../checkpoint/CheckpointManagerTest.java | 2 + .../checkpoint/CheckpointMetricsTest.java | 98 +++++++++++++++++ .../persistence/checkpoint/CheckpointerTest.java | 21 ++-- .../replacement/AbstractPageReplacementTest.java | 2 + .../throttling/PageMemoryThrottlingTest.java | 2 + .../PersistentPageMemoryStorageEngine.java | 7 ++ .../pagememory/PersistentPageMemoryNoLoadTest.java | 2 + .../pagememory/mv/FailedCheckpointTest.java | 2 + 13 files changed, 343 insertions(+), 9 deletions(-) diff --git a/modules/page-memory/build.gradle b/modules/page-memory/build.gradle index a20830959e7..7189f055c56 100644 --- a/modules/page-memory/build.gradle +++ b/modules/page-memory/build.gradle @@ -41,6 +41,7 @@ dependencies { testImplementation project(':ignite-failure-handler') testImplementation testFixtures(project(':ignite-core')) testImplementation testFixtures(project(':ignite-configuration')) + testImplementation testFixtures(project(':ignite-metrics')) testImplementation libs.auto.service.annotations testFixturesAnnotationProcessor libs.auto.service diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java index acbe84a2f13..187d14d1252 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java @@ -113,6 +113,7 @@ public class CheckpointManager { PageIoRegistry ioRegistry, LogSyncer logSyncer, ExecutorService commonExecutorService, + CheckpointMetricSource checkpointMetricSource, // TODO: IGNITE-17017 Move to common config int pageSize ) throws IgniteInternalCheckedException { @@ -168,7 +169,8 @@ public class CheckpointManager { pageSize, checkpointConfig, logSyncer, - partitionDestructionLockManager + partitionDestructionLockManager, + checkpointMetricSource ); checkpointTimeoutLock = new CheckpointTimeoutLock( diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricSource.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricSource.java new file mode 100644 index 00000000000..85a296afeea --- /dev/null +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricSource.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.pagememory.persistence.checkpoint; + +import java.util.HashMap; +import java.util.Map; +import org.apache.ignite.internal.metrics.Metric; +import org.apache.ignite.internal.metrics.MetricSet; +import org.apache.ignite.internal.metrics.MetricSource; +import org.jetbrains.annotations.Nullable; + +/** Metric source for checkpoint of persistent page memory. */ +public class CheckpointMetricSource implements MetricSource { + private final String name; + + /** Metrics map. Only modified in {@code synchronized} context. */ + private final Map<String, Metric> metrics = new HashMap<>(); + + /** Enabled flag. Only modified in {@code synchronized} context. */ + private boolean enabled; + + /** + * Constructor. + * + * @param name Metric set name. + */ + public CheckpointMetricSource(String name) { + this.name = name; + } + + @Override + public String name() { + return name; + } + + @Override + public @Nullable String group() { + return "storage"; + } + + /** Adds metric to the source. */ + synchronized <T extends Metric> T addMetric(T metric) { + assert !enabled : "Cannot add metrics when source is enabled"; + + metrics.put(metric.name(), metric); + + return metric; + } + + @Override + public synchronized @Nullable MetricSet enable() { + if (enabled) { + return null; + } + + enabled = true; + + return new MetricSet(name, description(), group(), Map.copyOf(metrics)); + } + + @Override + public synchronized void disable() { + enabled = false; + } + + @Override + public synchronized boolean enabled() { + return enabled; + } +} diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetrics.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetrics.java new file mode 100644 index 00000000000..4a3769809d4 --- /dev/null +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetrics.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.pagememory.persistence.checkpoint; + +import java.util.concurrent.TimeUnit; +import org.apache.ignite.internal.metrics.AtomicLongMetric; + +/** Checkpoint metrics. */ +class CheckpointMetrics { + private final AtomicLongMetric lastLockWaitDuration; + + private final AtomicLongMetric lastLockHoldDuration; + + private final AtomicLongMetric lastPagesWriteDuration; + + private final AtomicLongMetric lastFsyncDuration; + + private final AtomicLongMetric lastBeforeLockDuration; + + private final AtomicLongMetric lastReplicatorLogSyncDuration; + + private final AtomicLongMetric lastSplitAndSortCheckpointPagesDuration; + + private final AtomicLongMetric lastWaitPageReplacementDuration; + + private final AtomicLongMetric lastCheckpointDuration; + + private final AtomicLongMetric lastTotalPagesNumber; + + CheckpointMetrics(CheckpointMetricSource source) { + lastLockWaitDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointLockWaitDuration", + "Duration of the last checkpoint lock wait in milliseconds." + )); + + lastLockHoldDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointLockHoldDuration", + "Duration of the last checkpoint lock hold in milliseconds." + )); + + lastBeforeLockDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointBeforeLockDuration", + "Duration of actions before hold lock by the last checkpoint in milliseconds." + )); + + lastPagesWriteDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointPagesWriteDuration", + "Duration of the last checkpoint pages write in milliseconds." + )); + + lastFsyncDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointFsyncDuration", + "Duration of the sync phase of the last checkpoint in milliseconds." + )); + + lastReplicatorLogSyncDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointReplicatorLogSyncDuration", + "Duration of the replicator log sync phase of the last checkpoint in milliseconds." + )); + + lastSplitAndSortCheckpointPagesDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointSplitAndSortPagesDuration", + "Duration of the split and sort dirty pages phase of the last checkpoint in milliseconds." + )); + + lastWaitPageReplacementDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointWaitPageReplacementDuration", + "Duration of the wait page replacement phase of the last checkpoint in milliseconds." + )); + + lastCheckpointDuration = source.addMetric(new AtomicLongMetric( + "LastCheckpointDuration", + "Duration of the last checkpoint in milliseconds." + )); + + lastTotalPagesNumber = source.addMetric(new AtomicLongMetric( + "LastCheckpointTotalPagesNumber", + "Total number of pages written during the last checkpoint." + )); + } + + /** + * Updates metrics. + * + * @param tracker Checkpoint metrics tracker. + * @param totalPages Total number of pages written during the checkpoint. + */ + void update(CheckpointMetricsTracker tracker, long totalPages) { + lastLockWaitDuration.value(tracker.writeLockWaitDuration(TimeUnit.MILLISECONDS)); + lastLockHoldDuration.value(tracker.writeLockHoldDuration(TimeUnit.MILLISECONDS)); + lastBeforeLockDuration.value(tracker.beforeWriteLockDuration(TimeUnit.MILLISECONDS)); + lastPagesWriteDuration.value(tracker.pagesWriteDuration(TimeUnit.MILLISECONDS)); + lastFsyncDuration.value(tracker.fsyncDuration(TimeUnit.MILLISECONDS)); + lastReplicatorLogSyncDuration.value(tracker.replicatorLogSyncDuration(TimeUnit.MILLISECONDS)); + lastSplitAndSortCheckpointPagesDuration.value(tracker.splitAndSortCheckpointPagesDuration(TimeUnit.MILLISECONDS)); + lastWaitPageReplacementDuration.value(tracker.waitPageReplacementDuration(TimeUnit.MILLISECONDS)); + lastCheckpointDuration.value(tracker.checkpointDuration(TimeUnit.MILLISECONDS)); + + lastTotalPagesNumber.value(totalPages); + } +} diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java index df0d9062170..0d331a17e74 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java @@ -99,6 +99,7 @@ import org.jetbrains.annotations.Nullable; * <li>Finish the checkpoint. * </ul> */ +// TODO: IGNITE-26593 Fix the counting and output of the written dirty pages metric public class Checkpointer extends IgniteWorker { private static final String CHECKPOINT_STARTED_LOG_TEMPLATE = "Checkpoint started [" + "checkpointId={}, " @@ -186,6 +187,8 @@ public class Checkpointer extends IgniteWorker { private final PartitionDestructionLockManager partitionDestructionLockManager; + private final CheckpointMetrics checkpointMetrics; + /** * Constructor. * @@ -213,7 +216,8 @@ public class Checkpointer extends IgniteWorker { int pageSize, CheckpointConfiguration checkpointConfig, LogSyncer logSyncer, - PartitionDestructionLockManager partitionDestructionLockManager + PartitionDestructionLockManager partitionDestructionLockManager, + CheckpointMetricSource checkpointMetricSource ) { super(LOG, igniteInstanceName, "checkpoint-thread"); @@ -245,6 +249,8 @@ public class Checkpointer extends IgniteWorker { } else { checkpointWritePagesPool = null; } + + checkpointMetrics = new CheckpointMetrics(checkpointMetricSource); } @Override @@ -434,6 +440,8 @@ public class Checkpointer extends IgniteWorker { ); } } + + checkpointMetrics.update(tracker, chp.dirtyPagesSize); } catch (IgniteInternalCheckedException e) { if (chp != null) { chp.progress.fail(e); diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java index bc00730f078..0b00e4907bf 100644 --- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java @@ -94,6 +94,7 @@ public class CheckpointManagerTest extends BaseIgniteAbstractTest { mock(PageIoRegistry.class), mock(LogSyncer.class), executorService, + new CheckpointMetricSource("test"), 1024 ); @@ -251,6 +252,7 @@ public class CheckpointManagerTest extends BaseIgniteAbstractTest { mock(PageIoRegistry.class), mock(LogSyncer.class), executorService, + new CheckpointMetricSource("test"), 1024 )); diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricsTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricsTest.java new file mode 100644 index 00000000000..1601954d357 --- /dev/null +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointMetricsTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.pagememory.persistence.checkpoint; + +import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.concurrent.TimeUnit; +import org.apache.ignite.internal.manager.ComponentContext; +import org.apache.ignite.internal.metrics.Metric; +import org.apache.ignite.internal.metrics.MetricManager; +import org.apache.ignite.internal.metrics.MetricSet; +import org.apache.ignite.internal.metrics.TestMetricManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** For {@link CheckpointMetrics} testing. */ +public class CheckpointMetricsTest { + private final MetricManager metricManager = new TestMetricManager(); + + private final CheckpointMetricSource metricSource = new CheckpointMetricSource("test"); + + private final CheckpointMetrics metrics = new CheckpointMetrics(metricSource); + + @BeforeEach + void setUp() { + metricManager.registerSource(metricSource); + metricManager.enable(metricSource); + + assertThat(metricManager.startAsync(new ComponentContext()), willCompleteSuccessfully()); + } + + @AfterEach + void tearDown() { + metricManager.beforeNodeStop(); + + assertThat(metricManager.stopAsync(new ComponentContext()), willCompleteSuccessfully()); + } + + @Test + void testUpdate() { + var tracker = mock(CheckpointMetricsTracker.class); + + when(tracker.writeLockWaitDuration(TimeUnit.MILLISECONDS)).thenReturn(10L); + when(tracker.writeLockHoldDuration(TimeUnit.MILLISECONDS)).thenReturn(20L); + when(tracker.beforeWriteLockDuration(TimeUnit.MILLISECONDS)).thenReturn(30L); + when(tracker.pagesWriteDuration(TimeUnit.MILLISECONDS)).thenReturn(40L); + when(tracker.fsyncDuration(TimeUnit.MILLISECONDS)).thenReturn(50L); + when(tracker.replicatorLogSyncDuration(TimeUnit.MILLISECONDS)).thenReturn(60L); + when(tracker.splitAndSortCheckpointPagesDuration(TimeUnit.MILLISECONDS)).thenReturn(70L); + when(tracker.waitPageReplacementDuration(TimeUnit.MILLISECONDS)).thenReturn(80L); + when(tracker.checkpointDuration(TimeUnit.MILLISECONDS)).thenReturn(90L); + + metrics.update(tracker, 100); + + MetricSet metricSet = metricManager.metricSnapshot().metrics().get(metricSource.name()); + + checkMetricValue(metricSet, "LastCheckpointLockWaitDuration", "10"); + checkMetricValue(metricSet, "LastCheckpointLockHoldDuration", "20"); + checkMetricValue(metricSet, "LastCheckpointBeforeLockDuration", "30"); + checkMetricValue(metricSet, "LastCheckpointPagesWriteDuration", "40"); + checkMetricValue(metricSet, "LastCheckpointFsyncDuration", "50"); + checkMetricValue(metricSet, "LastCheckpointReplicatorLogSyncDuration", "60"); + checkMetricValue(metricSet, "LastCheckpointSplitAndSortPagesDuration", "70"); + checkMetricValue(metricSet, "LastCheckpointWaitPageReplacementDuration", "80"); + checkMetricValue(metricSet, "LastCheckpointDuration", "90"); + + checkMetricValue(metricSet, "LastCheckpointTotalPagesNumber", "100"); + } + + private static void checkMetricValue(MetricSet metricSet, String metricName, String exp) { + Metric metric = metricSet.get(metricName); + + assertNotNull(metric, metricName); + + assertEquals(exp, metric.getValueAsString(), metricName); + } +} diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java index 789ac8c17e4..c225d371ce4 100644 --- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java @@ -134,7 +134,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - partitionDestructionLockManager + partitionDestructionLockManager, + new CheckpointMetricSource("test") ); assertNull(checkpointer.runner()); @@ -170,7 +171,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - new PartitionDestructionLockManager() + new PartitionDestructionLockManager(), + new CheckpointMetricSource("test") )); assertNull(checkpointer.lastCheckpointProgress()); @@ -277,7 +279,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - new PartitionDestructionLockManager() + new PartitionDestructionLockManager(), + new CheckpointMetricSource("test") ); CompletableFuture<?> waitCheckpointEventFuture = runAsync(checkpointer::waitCheckpointEvent); @@ -311,7 +314,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - partitionDestructionLockManager + partitionDestructionLockManager, + new CheckpointMetricSource("test") )); checkpointer.scheduledProgress() @@ -413,7 +417,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mockLogSyncer, - partitionDestructionLockManager + partitionDestructionLockManager, + new CheckpointMetricSource("test") )); assertDoesNotThrow(checkpointer::doCheckpoint); @@ -451,7 +456,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - partitionDestructionLockManager + partitionDestructionLockManager, + new CheckpointMetricSource("test") )); assertDoesNotThrow(checkpointer::doCheckpoint); @@ -479,7 +485,8 @@ public class CheckpointerTest extends BaseIgniteAbstractTest { PAGE_SIZE, checkpointConfig, mock(LogSyncer.class), - new PartitionDestructionLockManager() + new PartitionDestructionLockManager(), + new CheckpointMetricSource("test") ); // Checks case 0 deviation. diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java index 5337e7831d7..93754367275 100644 --- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java @@ -64,6 +64,7 @@ import org.apache.ignite.internal.pagememory.persistence.PartitionMetaManager; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMetricSource; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager; +import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricSource; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointProgress; import org.apache.ignite.internal.pagememory.persistence.store.DeltaFilePageStoreIo; import org.apache.ignite.internal.pagememory.persistence.store.FilePageStore; @@ -141,6 +142,7 @@ public abstract class AbstractPageReplacementTest extends IgniteAbstractTest { ioRegistry, mock(LogSyncer.class), executorService, + new CheckpointMetricSource("test"), PAGE_SIZE ); diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java index ddd1b902e63..fe13e66e035 100644 --- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java @@ -63,6 +63,7 @@ import org.apache.ignite.internal.pagememory.persistence.PartitionMetaManager; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMetricSource; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager; +import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricSource; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointProgress; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState; import org.apache.ignite.internal.pagememory.persistence.store.FilePageStore; @@ -153,6 +154,7 @@ public class PageMemoryThrottlingTest extends IgniteAbstractTest { ioRegistry, () -> {}, executorService, + new CheckpointMetricSource("test"), PAGE_SIZE ); diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java index c5cd187975a..194e5dd22c5 100644 --- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java +++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java @@ -48,6 +48,7 @@ import org.apache.ignite.internal.pagememory.io.PageIoRegistry; import org.apache.ignite.internal.pagememory.persistence.PartitionMetaManager; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager; +import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricSource; import org.apache.ignite.internal.pagememory.persistence.store.FilePageStoreManager; import org.apache.ignite.internal.pagememory.tree.BplusTree; import org.apache.ignite.internal.storage.StorageException; @@ -219,6 +220,8 @@ public class PersistentPageMemoryStorageEngine extends AbstractPageMemoryStorage partitionMetaManager = new PartitionMetaManager(ioRegistry, pageSize, StoragePartitionMeta.FACTORY); + var checkpointMetricSource = new CheckpointMetricSource("storage." + ENGINE_NAME + ".checkpoint"); + try { checkpointManager = new CheckpointManager( igniteInstanceName, @@ -231,6 +234,7 @@ public class PersistentPageMemoryStorageEngine extends AbstractPageMemoryStorage ioRegistry, logSyncer, commonExecutorService, + checkpointMetricSource, pageSize ); @@ -264,6 +268,9 @@ public class PersistentPageMemoryStorageEngine extends AbstractPageMemoryStorage executor.allowCoreThreadTimeOut(true); destructionExecutor = executor; + + metricManager.registerSource(checkpointMetricSource); + metricManager.enable(checkpointMetricSource); } /** Creates a checkpoint configuration based on the provided {@link PageMemoryCheckpointConfiguration}. */ diff --git a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java index e90e71da7fb..47161def84a 100644 --- a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java +++ b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java @@ -78,6 +78,7 @@ import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMet import org.apache.ignite.internal.pagememory.persistence.TestPageReadWriteManager; import org.apache.ignite.internal.pagememory.persistence.WriteDirtyPage; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager; +import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricSource; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricsTracker; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointProgress; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointProgressImpl; @@ -513,6 +514,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf ioRegistry, mock(LogSyncer.class), executorService, + new CheckpointMetricSource("test"), PAGE_SIZE ); } diff --git a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java index 07e37abd0fa..d96ab9d8410 100644 --- a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java +++ b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java @@ -61,6 +61,7 @@ import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId; import org.apache.ignite.internal.pagememory.persistence.PartitionMetaManager; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager; +import org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointMetricSource; import org.apache.ignite.internal.pagememory.persistence.store.FilePageStoreManager; import org.apache.ignite.internal.schema.BinaryRow; import org.apache.ignite.internal.storage.BaseMvStoragesTest; @@ -293,6 +294,7 @@ public class FailedCheckpointTest extends BaseMvStoragesTest { ioRegistry, mock(LogSyncer.class), commonExecutorService, + new CheckpointMetricSource("test"), pageSize );
