All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.config.PersistenceConfig Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * Licensed 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 com.hazelcast.config;

import java.io.File;
import java.util.Objects;

import static com.hazelcast.internal.util.Preconditions.checkNotNegative;
import static com.hazelcast.internal.util.Preconditions.checkNotNull;
import static com.hazelcast.internal.util.Preconditions.checkPositive;

/**
 * Configures the Persistence stores.
 * 

* Persistence stores are used to hold copy of in-memory data in * disk to be able to restart very fast without needing to load * data from a central storage. *

* PersistenceConfig configures whether persistence is enabled, * where disk data will be stored, should data be persisted * sync or async etc. * *

* Note: If either, but not both, persistence ({@code PersistenceConfig}) or * hot-restart-persistence ({@code HotRestartPersistenceConfig}) is enabled, * Hazelcast will use the configuration of the enabled element. If both are * enabled, Hazelcast will use the persistence ({@code PersistenceConfig}) * configuration. hot-restart-persistence element (and thus {@code HotRestartPersistenceConfig}) * will be removed in a future release. */ public class PersistenceConfig { /** Default directory name for the Persistence store's home */ public static final String PERSISTENCE_BASE_DIR_DEFAULT = "persistence"; /** * Default validation timeout */ public static final int DEFAULT_VALIDATION_TIMEOUT = 2 * 60; /** * Default load timeout */ public static final int DEFAULT_DATA_LOAD_TIMEOUT = 15 * 60; /** * Default level of parallelism in Persistence. Controls the number * of instances operating with a single IO thread and a * single GC thread. */ public static final int DEFAULT_PARALLELISM = 1; /** * */ public static final int DEFAULT_REBALANCE_DELAY = 0; private boolean enabled; private File baseDir = new File(PERSISTENCE_BASE_DIR_DEFAULT); private File backupDir; private int parallelism = DEFAULT_PARALLELISM; private int validationTimeoutSeconds = DEFAULT_VALIDATION_TIMEOUT; private int dataLoadTimeoutSeconds = DEFAULT_DATA_LOAD_TIMEOUT; private PersistenceClusterDataRecoveryPolicy clusterDataRecoveryPolicy = PersistenceClusterDataRecoveryPolicy.FULL_RECOVERY_ONLY; private boolean autoRemoveStaleData = true; private EncryptionAtRestConfig encryptionAtRestConfig = new EncryptionAtRestConfig(); private int rebalanceDelaySeconds = DEFAULT_REBALANCE_DELAY; /** * Returns whether persistence enabled on this member. * * @return true if persistence enabled, false otherwise */ public boolean isEnabled() { return enabled; } /** * Sets whether persistence is enabled on this member. * * @return PersistenceConfig */ public PersistenceConfig setEnabled(boolean enabled) { this.enabled = enabled; return this; } /** * Returns the policy to be used when the cluster is started * * @return the policy to be used when the cluster is started */ public PersistenceClusterDataRecoveryPolicy getClusterDataRecoveryPolicy() { return clusterDataRecoveryPolicy; } /** * Sets the policy to be used when the cluster is started * * @param clusterDataRecoveryPolicy the policy to be used when the cluster is started * * @return PersistenceConfig */ public PersistenceConfig setClusterDataRecoveryPolicy(PersistenceClusterDataRecoveryPolicy clusterDataRecoveryPolicy) { this.clusterDataRecoveryPolicy = clusterDataRecoveryPolicy; return this; } /** * Base directory for all Persistence stores. Can be an absolute or relative path to the node startup directory. */ public File getBaseDir() { return baseDir; } /** * Sets base directory for all Persistence stores. Can be an absolute or relative path to the node startup directory. * * @param baseDir home directory * @return PersistenceConfig */ public PersistenceConfig setBaseDir(File baseDir) { checkNotNull(baseDir, "Base directory cannot be null!"); this.baseDir = baseDir; return this; } /** * Base directory for persistence backups. Each new backup will be created in a separate directory inside this one. * Can be an absolute or relative path to the node startup directory. */ public File getBackupDir() { return backupDir; } /** * Sets base directory for all Hot Restart stores. * * @param backupDir home directory * @return PersistenceConfig */ public PersistenceConfig setBackupDir(File backupDir) { this.backupDir = backupDir; return this; } /** * Gets the configured number of Persistence store instance to create for one Hazelcast instance. */ public int getParallelism() { return parallelism; } /** * Sets the number of Persistence store instances to create for one Hazelcast instance. */ public PersistenceConfig setParallelism(int parallelism) { checkPositive(parallelism, "Parallelism must be a positive integer"); this.parallelism = parallelism; return this; } /** * Returns configured validation timeout for restart process. * * @return validation timeout in seconds */ public int getValidationTimeoutSeconds() { return validationTimeoutSeconds; } /** * Sets validation timeout for persistence restart process, includes validating * cluster members expected to join and partition table on all cluster. * * @param validationTimeoutSeconds validation timeout in seconds * @return PersistenceConfig */ public PersistenceConfig setValidationTimeoutSeconds(int validationTimeoutSeconds) { checkPositive(validationTimeoutSeconds, "Validation timeout should be positive!"); this.validationTimeoutSeconds = validationTimeoutSeconds; return this; } /** * Returns configured data load timeout for persistence restart process. * * @return data load timeout in seconds */ public int getDataLoadTimeoutSeconds() { return dataLoadTimeoutSeconds; } /** * Sets data load timeout for persistence restart process, * all members in the cluster should complete restoring their local data * before this timeout. * * @param dataLoadTimeoutSeconds data load timeout in seconds * @return PersistenceConfig */ public PersistenceConfig setDataLoadTimeoutSeconds(int dataLoadTimeoutSeconds) { checkPositive(dataLoadTimeoutSeconds, "Load timeout should be positive!"); this.dataLoadTimeoutSeconds = dataLoadTimeoutSeconds; return this; } /** * Returns whether automatic removal of stale Persistence restart data is enabled. * * @return whether automatically removal of stale data is enabled */ public boolean isAutoRemoveStaleData() { return autoRemoveStaleData; } /** * Sets whether automatic removal of stale Persistence restart data is enabled. *

* When a member terminates or crashes when cluster state is {@link com.hazelcast.cluster.ClusterState#ACTIVE}, * remaining members redistributes data among themselves and data persisted on terminated member's storage becomes * stale. That terminated member cannot rejoin the cluster without removing Persistence data. * When auto-removal of stale Persistence data is enabled, while restarting that member, Persistence data is * automatically removed, and it joins the cluster as a completely new member. * Otherwise, Persistence data should be removed manually. * * @param autoRemoveStaleData {@code true} to enable auto-removal of stale data, {@code false} otherwise * @return PersistenceConfig */ public PersistenceConfig setAutoRemoveStaleData(boolean autoRemoveStaleData) { this.autoRemoveStaleData = autoRemoveStaleData; return this; } /** * Sets the Persistence Encryption at Rest configuration. * @param encryptionAtRestConfig the Encryption at Rest configuration * @return PersistenceConfig */ public PersistenceConfig setEncryptionAtRestConfig(EncryptionAtRestConfig encryptionAtRestConfig) { checkNotNull(encryptionAtRestConfig, "Encryption at rest config cannot be null!"); this.encryptionAtRestConfig = encryptionAtRestConfig; return this; } /** * Returns the Persistence Encryption at Rest configuration. * @return the Encryption at Rest configuration */ public EncryptionAtRestConfig getEncryptionAtRestConfig() { return encryptionAtRestConfig; } /** * Get the configured rebalance delay in seconds. * * @return the configured rebalance delay in seconds. * @see #setRebalanceDelaySeconds(int) * @since 5.0 */ public int getRebalanceDelaySeconds() { return rebalanceDelaySeconds; } /** * Set the rebalance delay in seconds. This is the time * to wait before triggering automatic partition rebalancing * after a member leaves the cluster unexpectedly. Unexpectedly in this context * means that a member leaves the cluster by means other than graceful shutdown: * programmatic termination (eg {@code LifecycleService.terminate()}), a * process crash or network partition. * Default is 0, which means rebalancing is triggered immediately. * Setting this to a higher value will allow some time for members that are gone * to rejoin the cluster. The benefit is that partition rebalancing in this * case will be avoided, saving the burden of migrating partition data over * the network. * Do not use this option if your cluster also stores in-memory data. This option * stops the cluster from migrating in-memory data. As a result any data that is * not persisted will be lost if the member restarts within the configured delay, * including backups. * While members are gone, operations on partitions for which the owner is missing * may fail immediately or will be retried until the member rejoins or operation * timeout is exceeded. * Notice that this delay only applies when cluster members leave the cluster; * when the cluster is being scaled up and members are being added, partition * rebalancing will be triggered immediately (subject to limitations imposed * by the current cluster state). * * @param rebalanceDelaySeconds the desired non-negative rebalance delay in seconds. * @return PersistenceConfig * @since 5.0 */ public PersistenceConfig setRebalanceDelaySeconds(int rebalanceDelaySeconds) { checkNotNegative(rebalanceDelaySeconds, "Rebalance delay cannot be negative."); this.rebalanceDelaySeconds = rebalanceDelaySeconds; return this; } @Override @SuppressWarnings("checkstyle:npathcomplexity") public final boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof PersistenceConfig that)) { return false; } if (enabled != that.enabled) { return false; } if (parallelism != that.parallelism) { return false; } if (validationTimeoutSeconds != that.validationTimeoutSeconds) { return false; } if (dataLoadTimeoutSeconds != that.dataLoadTimeoutSeconds) { return false; } if (rebalanceDelaySeconds != that.rebalanceDelaySeconds) { return false; } if (autoRemoveStaleData != that.autoRemoveStaleData) { return false; } if (!Objects.equals(baseDir, that.baseDir)) { return false; } if (!Objects.equals(backupDir, that.backupDir)) { return false; } if (!Objects.equals(encryptionAtRestConfig, that.encryptionAtRestConfig)) { return false; } return clusterDataRecoveryPolicy == that.clusterDataRecoveryPolicy; } @Override public final int hashCode() { int result = (enabled ? 1 : 0); result = 31 * result + (baseDir != null ? baseDir.hashCode() : 0); result = 31 * result + (backupDir != null ? backupDir.hashCode() : 0); result = 31 * result + (encryptionAtRestConfig != null ? encryptionAtRestConfig.hashCode() : 0); result = 31 * result + parallelism; result = 31 * result + validationTimeoutSeconds; result = 31 * result + dataLoadTimeoutSeconds; result = 31 * result + rebalanceDelaySeconds; result = 31 * result + (clusterDataRecoveryPolicy != null ? clusterDataRecoveryPolicy.hashCode() : 0); result = 31 * result + (autoRemoveStaleData ? 1 : 0); return result; } @Override public String toString() { return "PersistenceConfig{" + "enabled=" + enabled + ", baseDir=" + baseDir + ", backupDir=" + backupDir + ", parallelism=" + parallelism + ", validationTimeoutSeconds=" + validationTimeoutSeconds + ", dataLoadTimeoutSeconds=" + dataLoadTimeoutSeconds + ", rebalanceDelaySeconds=" + dataLoadTimeoutSeconds + ", clusterDataRecoveryPolicy=" + clusterDataRecoveryPolicy + ", autoRemoveStaleData=" + autoRemoveStaleData + ", encryptionAtRestConfig=" + encryptionAtRestConfig + '}'; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy