blob: 8d9ffbed35addfb8115c7a08654a9980ea746f46 [file] [log] [blame]
/*
* 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.configuration;
import java.io.Serializable;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
/**
* A page memory configuration for an Apache Ignite node. The page memory is a manageable off-heap based memory
* architecture that divides all expandable memory regions into pages of fixed size
* (see {@link MemoryConfiguration#getPageSize()}. An individual page can store one or many cache key-value entries
* that allows reusing the memory in the most efficient way and avoid memory fragmentation issues.
* <p>
* By default, the page memory allocates a single expandable memory region using settings of
* {@link MemoryConfiguration#createDefaultPolicyConfig()}. All the caches that will be configured in an application
* will be mapped to this memory region by default, thus, all the cache data will reside in that memory region.
* <p>
* If initial size of the default memory region doesn't satisfy requirements or it's required to have multiple memory
* regions with different properties then {@link MemoryPolicyConfiguration} can be used for both scenarios.
* For instance, using memory policies you can define memory regions of different maximum size, eviction policies,
* swapping options, etc. Once you define a new memory region you can bind particular Ignite caches to it.
* <p>
* To learn more about memory policies refer to {@link MemoryPolicyConfiguration} documentation.
* <p>Sample configuration below shows how to make 5 GB memory regions the default one for Apache Ignite:</p>
* <pre>
* {@code
* <property name="memoryConfiguration">
* <bean class="org.apache.ignite.configuration.MemoryConfiguration">
* <property name="systemCacheInitialSize" value="#{100L * 1024 * 1024}"/>
* <property name="defaultMemoryPolicyName" value="default_mem_plc"/>
*
* <property name="memoryPolicies">
* <list>
* <bean class="org.apache.ignite.configuration.MemoryPolicyConfiguration">
* <property name="name" value="default_mem_plc"/>
* <property name="initialSize" value="#{5L * 1024 * 1024 * 1024}"/>
* </bean>
* </list>
* </property>
* </bean>
* </property>
* }
* </pre>
*
* @deprecated Use {@link DataStorageConfiguration} instead.
*/
@Deprecated
public class MemoryConfiguration implements Serializable {
/** */
private static final long serialVersionUID = 0L;
/** Default memory policy start size (256 MB). */
public static final long DFLT_MEMORY_POLICY_INITIAL_SIZE = 256L * 1024 * 1024;
/** Fraction of available memory to allocate for default DataRegion. */
private static final double DFLT_MEMORY_POLICY_FRACTION = 0.2;
/** Default memory policy's size is 20% of physical memory available on current machine. */
public static final long DFLT_MEMORY_POLICY_MAX_SIZE = Math.max(
(long)(DFLT_MEMORY_POLICY_FRACTION * U.getTotalMemoryAvailable()),
DFLT_MEMORY_POLICY_INITIAL_SIZE);
/** Default initial size of a memory chunk for the system cache (40 MB). */
private static final long DFLT_SYS_CACHE_INIT_SIZE = 40L * 1024 * 1024;
/** Default max size of a memory chunk for the system cache (100 MB). */
private static final long DFLT_SYS_CACHE_MAX_SIZE = 100L * 1024 * 1024;
/** Default memory page size. */
public static final int DFLT_PAGE_SIZE = 4 * 1024;
/** This name is assigned to default DataRegion if no user-defined default MemPlc is specified */
public static final String DFLT_MEM_PLC_DEFAULT_NAME = "default";
/** Size of a memory chunk reserved for system cache initially. */
private long sysCacheInitSize = DFLT_SYS_CACHE_INIT_SIZE;
/** Maximum size of system cache. */
private long sysCacheMaxSize = DFLT_SYS_CACHE_MAX_SIZE;
/** Memory page size. */
private int pageSize;
/** Concurrency level. */
private int concLvl;
/** A name of the memory policy that defines the default memory region. */
private String dfltMemPlcName = DFLT_MEM_PLC_DEFAULT_NAME;
/** Size of memory (in bytes) to use for default DataRegion. */
private long dfltMemPlcSize = DFLT_MEMORY_POLICY_MAX_SIZE;
/** Memory policies. */
private MemoryPolicyConfiguration[] memPlcs;
/**
* Initial size of a memory region reserved for system cache.
*
* @return Size in bytes.
*/
public long getSystemCacheInitialSize() {
return sysCacheInitSize;
}
/**
* Sets initial size of a memory region reserved for system cache.
*
* Default value is {@link #DFLT_SYS_CACHE_INIT_SIZE}
*
* @param sysCacheInitSize Size in bytes.
*
* @return {@code this} for chaining.
*/
public MemoryConfiguration setSystemCacheInitialSize(long sysCacheInitSize) {
A.ensure(sysCacheInitSize > 0, "System cache initial size can not be less zero.");
this.sysCacheInitSize = sysCacheInitSize;
return this;
}
/**
* Maximum memory region size reserved for system cache.
*
* @return Size in bytes.
*/
public long getSystemCacheMaxSize() {
return sysCacheMaxSize;
}
/**
* Sets maximum memory region size reserved for system cache. The total size should not be less than 10 MB
* due to internal data structures overhead.
*
* @param sysCacheMaxSize Maximum size in bytes for system cache memory region.
*
* @return {@code this} for chaining.
*/
public MemoryConfiguration setSystemCacheMaxSize(long sysCacheMaxSize) {
A.ensure(sysCacheMaxSize > 0, "System cache max size can not be less zero.");
this.sysCacheMaxSize = sysCacheMaxSize;
return this;
}
/**
* The pages memory consists of one or more expandable memory regions defined by {@link MemoryPolicyConfiguration}.
* Every memory region is split on pages of fixed size that store actual cache entries.
*
* @return Page size in bytes.
*/
public int getPageSize() {
return pageSize;
}
/**
* Changes the page size.
*
* Default value is {@link #DFLT_PAGE_SIZE}
*
* @param pageSize Page size in bytes.
* @return {@code this} for chaining.
*/
public MemoryConfiguration setPageSize(int pageSize) {
A.ensure(pageSize >= 1024 && pageSize <= 16 * 1024, "Page size must be between 1kB and 16kB.");
A.ensure(U.isPow2(pageSize), "Page size must be a power of 2.");
this.pageSize = pageSize;
return this;
}
/**
* Gets an array of all memory policies configured. Apache Ignite will instantiate a dedicated memory region per
* policy. An Apache Ignite cache can be mapped to a specific policy with
* {@link CacheConfiguration#setMemoryPolicyName(String)} method.
*
* @return Array of configured memory policies.
*/
public MemoryPolicyConfiguration[] getMemoryPolicies() {
return memPlcs;
}
/**
* Sets memory policies configurations.
*
* @param memPlcs Memory policies configurations.
* @return {@code this} for chaining.
*/
public MemoryConfiguration setMemoryPolicies(MemoryPolicyConfiguration... memPlcs) {
this.memPlcs = memPlcs;
return this;
}
/**
* Creates a configuration for the default memory policy that will instantiate the default memory region.
* To override settings of the default memory policy in order to create the default memory region with different
* parameters, create own memory policy first, pass it to
* {@link MemoryConfiguration#setMemoryPolicies(MemoryPolicyConfiguration...)} method and change the name of the
* default memory policy with {@link MemoryConfiguration#setDefaultMemoryPolicyName(String)}.
*
* @return default Memory policy configuration.
*/
public MemoryPolicyConfiguration createDefaultPolicyConfig() {
MemoryPolicyConfiguration memPlc = new MemoryPolicyConfiguration();
long maxSize = dfltMemPlcSize;
if (maxSize < DFLT_MEMORY_POLICY_INITIAL_SIZE)
memPlc.setInitialSize(maxSize);
else
memPlc.setInitialSize(DFLT_MEMORY_POLICY_INITIAL_SIZE);
memPlc.setMaxSize(maxSize);
return memPlc;
}
/**
* Returns the number of concurrent segments in Ignite internal page mapping tables. By default equals
* to the number of available CPUs multiplied by 4.
*
* @return Mapping table concurrency level.
*/
public int getConcurrencyLevel() {
return concLvl;
}
/**
* Sets the number of concurrent segments in Ignite internal page mapping tables.
*
* @param concLvl Mapping table concurrency level.
* @return {@code this} for chaining.
*/
public MemoryConfiguration setConcurrencyLevel(int concLvl) {
this.concLvl = concLvl;
return this;
}
/**
* Gets a size for default memory policy overridden by user.
*
* @return Default memory policy size overridden by user or {@link #DFLT_MEMORY_POLICY_MAX_SIZE} if nothing was specified.
*/
public long getDefaultMemoryPolicySize() {
return dfltMemPlcSize;
}
/**
* Overrides size of default memory policy which is created automatically.
*
* If user doesn't specify any memory policy configuration, a default one with default size
* (20% of available RAM) is created by Ignite.
*
* This property allows user to specify desired size of default memory policy
* without having to use more verbose syntax of MemoryPolicyConfiguration elements.
*
* @param dfltMemPlcSize Size of default memory policy overridden by user.
* @return {@code this} for chaining.
*/
public MemoryConfiguration setDefaultMemoryPolicySize(long dfltMemPlcSize) {
this.dfltMemPlcSize = dfltMemPlcSize;
return this;
}
/**
* Gets a name of default memory policy.
*
* @return A name of a custom memory policy configured with {@code MemoryConfiguration} or {@code null} of the
* default policy is used.
*/
public String getDefaultMemoryPolicyName() {
return dfltMemPlcName;
}
/**
* Sets the name for the default memory policy that will initialize the default memory region.
* To set own default memory policy, create the policy first, pass it to
* {@link MemoryConfiguration#setMemoryPolicies(MemoryPolicyConfiguration...)} method and change the name of the
* default memory policy with {@code MemoryConfiguration#setDefaultMemoryPolicyName(String)}.
*
* If nothing is specified by user, it is set to {@link #DFLT_MEM_PLC_DEFAULT_NAME} value.
*
* @param dfltMemPlcName Name of a memory policy to be used as default one.
* @return {@code this} for chaining.
*/
public MemoryConfiguration setDefaultMemoryPolicyName(String dfltMemPlcName) {
this.dfltMemPlcName = dfltMemPlcName;
return this;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(MemoryConfiguration.class, this);
}
}