blob: 1cf02fd02e0c01037bd47daa7878250a6bffb750 [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.geode.cache;
import java.io.File;
import org.apache.geode.annotations.internal.MakeImmutable;
import org.apache.geode.distributed.internal.DistributionConfig;
/**
* Factory for creating instances of {@link DiskStore}. To get an instance of this factory call
* {@link Cache#createDiskStoreFactory}. If all you want to do is find an existing disk store see
* {@link Cache#findDiskStore}.
* <P>
* To use this factory configure it with the <code>set</code> methods and then call {@link #create}
* to produce a disk store instance.
*
* @since GemFire 6.5
*/
public interface DiskStoreFactory {
/**
* The name of the default disk store is "DEFAULT". This name can be used to redefine the default
* disk store. Regions that have not had their disk-store-name set will use this disk store.
*/
String DEFAULT_DISK_STORE_NAME = "DEFAULT";
/**
* The default setting for auto compaction.
* <p>
* Current value: <code>true</code>.
*/
boolean DEFAULT_AUTO_COMPACT = true;
/**
* The default compaction threshold.
* <p>
* Current value: <code>50</code>.
*/
int DEFAULT_COMPACTION_THRESHOLD = 50;
/**
* The default value of the allow force compaction attribute.
* <p>
* Current value: <code>false</code>.
*/
boolean DEFAULT_ALLOW_FORCE_COMPACTION = false;
/**
* The default maximum oplog file size in megabytes.
* <p>
* Current value: <code>1024</code> which is one gigabyte.
*/
long DEFAULT_MAX_OPLOG_SIZE =
Long.getLong(DistributionConfig.GEMFIRE_PREFIX + "DEFAULT_MAX_OPLOG_SIZE", 1024L).longValue();
/**
* The default time interval in milliseconds.
* <p>
* Current value: <code>1000</code>.
*/
long DEFAULT_TIME_INTERVAL = 1000; // 1 sec
/**
* The default write buffer size.
* <p>
* Current value: <code>32768</code>.
*/
int DEFAULT_WRITE_BUFFER_SIZE = 32 * 1024;
/**
* The default maximum number of operations that can be asynchronously queued.
* <p>
* Current value: <code>0</code>.
*/
int DEFAULT_QUEUE_SIZE = 0;
/**
* The default disk directories.
* <p>
* Current value: <code>current directory</code>.
*/
@MakeImmutable
File[] DEFAULT_DISK_DIRS = new File[] {new File(".")};
/**
* The default disk directory size in megabytes.
* <p>
* Current value: <code>2,147,483,647</code> which is two petabytes.
*/
int DEFAULT_DISK_DIR_SIZE = Integer.MAX_VALUE; // unlimited for bug 41863
/**
* The default disk directory sizes.
* <p>
* Current value: {@link #DEFAULT_DISK_DIR_SIZE} which is two petabytes each.
*/
@MakeImmutable
int[] DEFAULT_DISK_DIR_SIZES = new int[] {DEFAULT_DISK_DIR_SIZE};
/**
* The default disk usage warning percentage.
* <p>
* Current value: <code>90</code>.
*/
float DEFAULT_DISK_USAGE_WARNING_PERCENTAGE = 90;
/**
* The default disk usage critical percentage.
* <p>
* Current value: <code>99</code>.
*/
float DEFAULT_DISK_USAGE_CRITICAL_PERCENTAGE = 99;
/**
* Set to <code>true</code> to cause the disk files to be automatically compacted. Set to
* <code>false</code> if no compaction is needed or manual compaction will be used.
*
* @param isAutoCompact if true then use auto compaction
* @return a reference to <code>this</code>
*/
DiskStoreFactory setAutoCompact(boolean isAutoCompact);
/**
* Sets the threshold at which an oplog will become compactable. Until it reaches this threshold
* the oplog will not be compacted. The threshold is a percentage in the range 0..100. When the
* amount of live data in an oplog becomes less than this percentage then when a compaction is
* done this garbage will be cleaned up freeing up disk space. Garbage is created by entry
* destroys, entry updates, and region destroys.
*
* @param compactionThreshold percentage of remaining live data in the oplog at which an oplog is
* compactable
* @return a reference to <code>this</code>
*/
DiskStoreFactory setCompactionThreshold(int compactionThreshold);
/**
* Set to <code>true</code> to allow {@link DiskStore#forceCompaction} to be called on regions
* using this disk store.
*
* @param allowForceCompaction if true then allow force compaction.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setAllowForceCompaction(boolean allowForceCompaction);
/**
* Sets the maximum size in megabytes a single oplog (operation log) is allowed to be. When an
* oplog is created this amount of file space will be immediately reserved.
*
* @param maxOplogSize maximum size in megabytes for one single oplog file.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setMaxOplogSize(long maxOplogSize);
/**
* Sets the number of milliseconds that can elapse before data written asynchronously is flushed
* to disk.
* <p>
* For how to configure a region to be asynchronous see:
* {@link AttributesFactory#setDiskSynchronous}.
*
* @param timeInterval number of milliseconds that can elapse before async data is flushed to
* disk.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setTimeInterval(long timeInterval);
/**
* Sets the write buffer size in bytes.
*
* @param writeBufferSize write buffer size in bytes.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setWriteBufferSize(int writeBufferSize);
/**
* Sets the maximum number of operations that can be asynchronously queued. Once this many pending
* async operations have been queued async ops will begin blocking until some of the queued ops
* have been flushed to disk.
* <p>
* For how to configure a region to be asynchronous see:
* {@link AttributesFactory#setDiskSynchronous}.
*
* @param queueSize number of operations that can be asynchronously queued. If 0, the queue will
* be unlimited.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setQueueSize(int queueSize);
/**
* Sets the directories to which this disk store's data is written. If multiple directories are
* used, GemFire will attempt to distribute the data evenly amongst them. The size of each
* directory will be set to the default of {@link #DEFAULT_DISK_DIR_SIZE}.
*
* @param diskDirs directories to put the oplog files.
* @return a reference to <code>this</code>
*/
DiskStoreFactory setDiskDirs(File[] diskDirs);
/**
* Sets the directories to which this disk store's data is written and also set the sizes in
* megabytes of each directory.
*
* @param diskDirs directories to put the oplog files.
* @param diskDirSizes sizes of disk directories in megabytes
* @return a reference to <code>this</code>
*
* @throws IllegalArgumentException if length of the size array does not match to the length of
* the dir array
*/
DiskStoreFactory setDiskDirsAndSizes(File[] diskDirs, int[] diskDirSizes);
/**
* Sets the warning threshold for disk usage as a percentage of the total disk volume.
*
* @param warningPercent warning percent of disk usage
* @return a reference to <code>this</code>
* @since GemFire 8.0
*/
DiskStoreFactory setDiskUsageWarningPercentage(float warningPercent);
/**
* Sets the critical threshold for disk usage as a percentage of the total disk volume.
*
* @param criticalPercent critical percent of disk usage
* @return a reference to <code>this</code>
* @since GemFire 8.0
*/
DiskStoreFactory setDiskUsageCriticalPercentage(float criticalPercent);
/**
* Create a new disk store or find an existing one. In either case the returned disk store's
* configuration will be the same as this factory's configuration.
*
* @param name the name of the DiskStore
* @return the newly created DiskStore.
* @throws IllegalStateException if a disk store with the given name already exists and its
* configuration is not consistent with this factory.
*/
DiskStore create(String name);
}