Repository: ignite Updated Branches: refs/heads/master 7deec60a8 -> 82d2efe1a
IGNITE-9784 Automatically adjust WAL history size - Fixes #4924. Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/82d2efe1 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/82d2efe1 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/82d2efe1 Branch: refs/heads/master Commit: 82d2efe1a20d148fa2c591265988a1852f68f120 Parents: 7deec60 Author: Alexey Goncharuk <alexey.goncha...@gmail.com> Authored: Fri Oct 19 12:30:48 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Fri Oct 19 12:30:48 2018 +0300 ---------------------------------------------------------------------- .../discovery/GridDiscoveryManager.java | 4 +- .../GridCacheDatabaseSharedManager.java | 34 +------- .../wal/FileWriteAheadLogManager.java | 9 +- .../wal/FsyncModeFileWriteAheadLogManager.java | 9 +- .../ignite/internal/util/IgniteUtils.java | 86 ++++++++++++++++++++ 5 files changed, 99 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/82d2efe1/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java index 907720a..30d169f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java @@ -1537,13 +1537,13 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> { for (DataRegionConfiguration dataReg : dataRegions) { res += dataReg.getMaxSize(); - res += GridCacheDatabaseSharedManager.checkpointBufferSize(dataReg); + res += U.checkpointBufferSize(dataReg); } } res += memCfg.getDefaultDataRegionConfiguration().getMaxSize(); - res += GridCacheDatabaseSharedManager.checkpointBufferSize(memCfg.getDefaultDataRegionConfiguration()); + res += U.checkpointBufferSize(memCfg.getDefaultDataRegionConfiguration()); return res; } http://git-wip-us.apache.org/repos/asf/ignite/blob/82d2efe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java index 33f593d..73d65f4 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java @@ -172,6 +172,7 @@ import static org.apache.ignite.failure.FailureType.CRITICAL_ERROR; import static org.apache.ignite.failure.FailureType.SYSTEM_WORKER_TERMINATION; import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.CHECKPOINT_RECORD; import static org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_CACHE_ID; +import static org.apache.ignite.internal.util.IgniteUtils.checkpointBufferSize; /** * @@ -184,15 +185,6 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan /** MemoryPolicyConfiguration name reserved for meta store. */ public static final String METASTORE_DATA_REGION_NAME = "metastoreMemPlc"; - /** */ - private static final long GB = 1024L * 1024 * 1024; - - /** Minimum checkpointing page buffer size (may be adjusted by Ignite). */ - public static final Long DFLT_MIN_CHECKPOINTING_PAGE_BUFFER_SIZE = GB / 4; - - /** Default minimum checkpointing page buffer size (may be adjusted by Ignite). */ - public static final Long DFLT_MAX_CHECKPOINTING_PAGE_BUFFER_SIZE = 2 * GB; - /** Skip sync. */ private final boolean skipSync = IgniteSystemProperties.getBoolean(IGNITE_PDS_CHECKPOINT_TEST_SKIP_SYNC); @@ -680,30 +672,6 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan } } - /** - * Get checkpoint buffer size for the given configuration. - * - * @param regCfg Configuration. - * @return Checkpoint buffer size. - */ - public static long checkpointBufferSize(DataRegionConfiguration regCfg) { - if (!regCfg.isPersistenceEnabled()) - return 0L; - - long res = regCfg.getCheckpointPageBufferSize(); - - if (res == 0L) { - if (regCfg.getMaxSize() < GB) - res = Math.min(DFLT_MIN_CHECKPOINTING_PAGE_BUFFER_SIZE, regCfg.getMaxSize()); - else if (regCfg.getMaxSize() < 8 * GB) - res = regCfg.getMaxSize() / 4; - else - res = DFLT_MAX_CHECKPOINTING_PAGE_BUFFER_SIZE; - } - - return res; - } - /** {@inheritDoc} */ @Override public void onActivate(GridKernalContext ctx) throws IgniteCheckedException { if (log.isDebugEnabled()) http://git-wip-us.apache.org/repos/asf/ignite/blob/82d2efe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java index 8198149..0b03128 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java @@ -276,7 +276,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl * Maximum number of allowed segments without checkpoint. If we have their more checkpoint should be triggered. * It is simple way to calculate WAL size without checkpoint instead fair WAL size calculating. */ - private final long maxSegCountWithoutCheckpoint; + private long maxSegCountWithoutCheckpoint; /** Size of wal archive since which removing of old archive should be started */ private final long allowedThresholdWalArchiveSize; @@ -417,9 +417,6 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl segmentFileInputFactory = new SimpleSegmentFileInputFactory(); walAutoArchiveAfterInactivity = dsCfg.getWalAutoArchiveAfterInactivity(); - maxSegCountWithoutCheckpoint = - (long)((dsCfg.getMaxWalArchiveSize() * CHECKPOINT_TRIGGER_ARCHIVE_SIZE_PERCENTAGE) / dsCfg.getWalSegmentSize()); - allowedThresholdWalArchiveSize = (long)(dsCfg.getMaxWalArchiveSize() * THRESHOLD_WAL_ARCHIVE_SIZE_PERCENTAGE); evt = ctx.event(); @@ -438,6 +435,10 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl /** {@inheritDoc} */ @Override public void start0() throws IgniteCheckedException { if (!cctx.kernalContext().clientNode()) { + maxSegCountWithoutCheckpoint = + (long)((U.adjustedWalHistorySize(dsCfg, log) * CHECKPOINT_TRIGGER_ARCHIVE_SIZE_PERCENTAGE) + / dsCfg.getWalSegmentSize()); + final PdsFolderSettings resolveFolders = cctx.kernalContext().pdsFolderResolver().resolveFolders(); checkWalConfiguration(); http://git-wip-us.apache.org/repos/asf/ignite/blob/82d2efe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java index 0ede897..d1e0ebc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java @@ -218,7 +218,7 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda * Maximum number of allowed segments without checkpoint. If we have their more checkpoint should be triggered. * It is simple way to calculate wal size without checkpoint instead fair wal size calculating. */ - private final long maxSegCountWithoutCheckpoint; + private long maxSegCountWithoutCheckpoint; /** Size of wal archive since which removing of old archive should be started */ private final long allowedThresholdWalArchiveSize; @@ -355,9 +355,6 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda walAutoArchiveAfterInactivity = dsCfg.getWalAutoArchiveAfterInactivity(); evt = ctx.event(); - maxSegCountWithoutCheckpoint = - (long)((dsCfg.getMaxWalArchiveSize() * CHECKPOINT_TRIGGER_ARCHIVE_SIZE_PERCENTAGE) / dsCfg.getWalSegmentSize()); - allowedThresholdWalArchiveSize = (long)(dsCfg.getMaxWalArchiveSize() * THRESHOLD_WAL_ARCHIVE_SIZE_PERCENTAGE); assert mode == WALMode.FSYNC : dsCfg; @@ -375,6 +372,10 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda /** {@inheritDoc} */ @Override public void start0() throws IgniteCheckedException { if (!cctx.kernalContext().clientNode()) { + maxSegCountWithoutCheckpoint = + (long)((U.adjustedWalHistorySize(dsCfg, log) * CHECKPOINT_TRIGGER_ARCHIVE_SIZE_PERCENTAGE) + / dsCfg.getWalSegmentSize()); + final PdsFolderSettings resolveFolders = cctx.kernalContext().pdsFolderResolver().resolveFolders(); checkWalConfiguration(); http://git-wip-us.apache.org/repos/asf/ignite/blob/82d2efe1/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index d2f45c9..d10a7c7 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -180,6 +180,8 @@ import org.apache.ignite.compute.ComputeTaskCancelledException; import org.apache.ignite.compute.ComputeTaskName; import org.apache.ignite.compute.ComputeTaskTimeoutException; import org.apache.ignite.configuration.AddressResolver; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.events.EventType; import org.apache.ignite.internal.GridKernalContext; @@ -281,6 +283,15 @@ import static org.apache.ignite.internal.util.GridUnsafe.staticFieldOffset; */ @SuppressWarnings({"UnusedReturnValue", "UnnecessaryFullyQualifiedName", "RedundantStringConstructorCall"}) public abstract class IgniteUtils { + /** */ + private static final long GB = 1024L * 1024 * 1024; + + /** Minimum checkpointing page buffer size (may be adjusted by Ignite). */ + public static final Long DFLT_MIN_CHECKPOINTING_PAGE_BUFFER_SIZE = GB / 4; + + /** Default minimum checkpointing page buffer size (may be adjusted by Ignite). */ + public static final Long DFLT_MAX_CHECKPOINTING_PAGE_BUFFER_SIZE = 2 * GB; + /** {@code True} if {@code unsafe} should be used for array copy. */ private static final boolean UNSAFE_BYTE_ARR_CP = unsafeByteArrayCopyAvailable(); @@ -10399,6 +10410,81 @@ public abstract class IgniteUtils { } /** + * Get checkpoint buffer size for the given configuration. + * + * @param regCfg Configuration. + * @return Checkpoint buffer size. + */ + public static long checkpointBufferSize(DataRegionConfiguration regCfg) { + if (!regCfg.isPersistenceEnabled()) + return 0L; + + long res = regCfg.getCheckpointPageBufferSize(); + + if (res == 0L) { + if (regCfg.getMaxSize() < GB) + res = Math.min(DFLT_MIN_CHECKPOINTING_PAGE_BUFFER_SIZE, regCfg.getMaxSize()); + else if (regCfg.getMaxSize() < 8 * GB) + res = regCfg.getMaxSize() / 4; + else + res = DFLT_MAX_CHECKPOINTING_PAGE_BUFFER_SIZE; + } + + return res; + } + + /** + * Calculates maximum WAL archive size based on maximum checkpoint buffer size, if the default value of + * {@link DataStorageConfiguration#getMaxWalArchiveSize()} is not overridden. + * + * @return User-set max WAL archive size of triple size of the maximum checkpoint buffer. + */ + public static long adjustedWalHistorySize(DataStorageConfiguration dsCfg, @Nullable IgniteLogger log) { + if (dsCfg.getMaxWalArchiveSize() != DataStorageConfiguration.DFLT_WAL_ARCHIVE_MAX_SIZE) + return dsCfg.getMaxWalArchiveSize(); + + // Find out the maximum checkpoint buffer size. + long maxCpBufSize = 0; + + if (dsCfg.getDataRegionConfigurations() != null) { + for (DataRegionConfiguration regCfg : dsCfg.getDataRegionConfigurations()) { + long cpBufSize = checkpointBufferSize(regCfg); + + if (cpBufSize > regCfg.getMaxSize()) + cpBufSize = regCfg.getMaxSize(); + + if (cpBufSize > maxCpBufSize) + maxCpBufSize = cpBufSize; + } + } + + { + DataRegionConfiguration regCfg = dsCfg.getDefaultDataRegionConfiguration(); + + long cpBufSize = checkpointBufferSize(regCfg); + + if (cpBufSize > regCfg.getMaxSize()) + cpBufSize = regCfg.getMaxSize(); + + if (cpBufSize > maxCpBufSize) + maxCpBufSize = cpBufSize; + } + + long adjustedWalArchiveSize = maxCpBufSize * 4; + + if (adjustedWalArchiveSize > dsCfg.getMaxWalArchiveSize()) { + if (log != null) + U.quietAndInfo(log, "Automatically adjusted max WAL archive size to " + + U.readableSize(adjustedWalArchiveSize, false) + + " (to override, use DataStorageConfiguration.setMaxWalArhiveSize)"); + + return adjustedWalArchiveSize; + } + + return dsCfg.getMaxWalArchiveSize(); + } + + /** * Return count of regular file in the directory (including in sub-directories) * * @param dir path to directory