/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.loaders.file;
import org.infinispan.loaders.LockSupportCacheStoreConfig;
import java.beans.PropertyEditorSupport;
/**
* Configures {@link org.infinispan.loaders.file.FileCacheStore}. This allows you to tune a number of characteristics
* of the {@link FileCacheStore}.
* <p/>
* <ul>
* <li><tt>location</tt> - a location on disk where the store can write internal files. This defaults to
* <tt>Infinispan-FileCacheStore</tt> in the current working directory.</li>
* <li><tt>purgeSynchronously</tt> - whether {@link org.infinispan.loaders.CacheStore#purgeExpired()} calls happen
* synchronously or not. By default, this is set to <tt>false</tt>.</li>
* <li><tt>purgerThreads</tt> - number of threads to use when purging. Defaults to <tt>1</tt> if <tt>purgeSynchronously</tt>
* is <tt>true</tt>, ignored if <tt>false</tt>.</li>
* <li><tt>streamBufferSize</tt> - when writing state to disk, a buffered stream is used. This
* parameter allows you to tune the buffer size. Larger buffers are usually faster but take up more (temporary) memory,
* resulting in more gc. By default, this is set to <tt>8192</tt>.</li>
* <li><tt>lockConcurrencyLevel</tt> - locking granularity is per file bucket. This setting defines the number of
* shared locks to use. The more locks you have, the better your concurrency will be, but more locks take up more
* memory. By default, this is set to <tt>2048</tt>.</li>
* <li><tt>lockAcquistionTimeout</tt> - the length of time, in milliseconds, to wait for locks
* before timing out and throwing an exception. By default, this is set to <tt>60000</tt>.</li>
* <li><tt>fsyncMode</tt> - configures how the file changes will be
* synchronized with the underlying file system. This property has three
* possible values (The default mode configured is <tt>default</tt>):
* <ul>
* <li><tt>default</tt> - means that the file system will be
* synchronized when the OS buffer is full or when the bucket is read.</li>
* <li><tt>perWrite</tt> - configures the file cache store to sync up
* changes after each write request</li>
* <li><tt>periodic</tt> - enables sync operations to happen as per a
* defined interval, or when the bucket is about to be read.</li>
* </ul>
* <li><tt>fsyncInterval</tt> - specifies the time after which the file
* changes in the cache need to be flushed. This option has only effect when
* <tt>periodic</tt> fsync mode is in use. The default fsync interval is 1
* second.</li>
*
* </ul>
*
* @author Manik Surtani
* @author Vladimir Blagojevic
* @author Galder ZamarreƱo
* @since 4.0
*/
public class FileCacheStoreConfig extends LockSupportCacheStoreConfig {
private static final long serialVersionUID = 1551092386868095926L;
private String location = "Infinispan-FileCacheStore";
private int streamBufferSize = 8192;
private FsyncMode fsyncMode = FsyncMode.DEFAULT;
private long fsyncInterval = 1000;
public FileCacheStoreConfig() {
setCacheLoaderClassName(FileCacheStore.class.getName());
}
public String getLocation() {
return location;
}
/**
* @deprecated The visibility of this will be reduced, use {@link #location(String)}
*/
@Deprecated
public void setLocation(String location) {
testImmutability("location");
this.location = location;
}
public FileCacheStoreConfig location(String location) {
setLocation(location);
return this;
}
public int getStreamBufferSize() {
return streamBufferSize;
}
/**
* @deprecated The visibility of this will be reduced, use {@link #streamBufferSize(int)} instead
*/
@Deprecated
public void setStreamBufferSize(int streamBufferSize) {
testImmutability("streamBufferSize");
this.streamBufferSize = streamBufferSize;
}
public FileCacheStoreConfig streamBufferSize(int streamBufferSize) {
setStreamBufferSize(streamBufferSize);
return this;
}
// Method overrides below are used to make configuration more fluent.
@Override
public FileCacheStoreConfig purgeOnStartup(Boolean purgeOnStartup) {
super.purgeOnStartup(purgeOnStartup);
return this;
}
@Override
public FileCacheStoreConfig purgeSynchronously(Boolean purgeSynchronously) {
super.purgeSynchronously(purgeSynchronously);
return this;
}
@Override
public FileCacheStoreConfig fetchPersistentState(Boolean fetchPersistentState) {
super.fetchPersistentState(fetchPersistentState);
return this;
}
@Override
public FileCacheStoreConfig ignoreModifications(Boolean ignoreModifications) {
super.ignoreModifications(ignoreModifications);
return this;
}
public long getFsyncInterval() {
return fsyncInterval;
}
// TODO: This should be private since they should only be used for XML parsing, defer to XML changes for ISPN-1065
public void setFsyncInterval(long fsyncInterval) {
this.fsyncInterval = fsyncInterval;
}
public FileCacheStoreConfig fsyncInterval(long fsyncInterval) {
setFsyncInterval(fsyncInterval);
return this;
}
public FsyncMode getFsyncMode() {
return fsyncMode;
}
// TODO: This should be private since they should only be used for XML parsing, defer to XML changes for ISPN-1065
public void setFsyncMode(FsyncMode fsyncMode) {
this.fsyncMode = fsyncMode;
}
public FileCacheStoreConfig fsyncMode(FsyncMode fsyncMode) {
setFsyncMode(fsyncMode);
return this;
}
public static enum FsyncMode {
DEFAULT, PER_WRITE, PERIODIC
}
/**
* Property editor for fsync mode configuration. It's automatically
* registered the {@link java.beans.PropertyEditorManager} so that it can
* transform text based modes into its corresponding enum value.
*/
public static class FsyncModeEditor extends PropertyEditorSupport {
private FsyncMode mode;
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text.equals("default"))
mode = FsyncMode.DEFAULT;
else if (text.equals("perWrite"))
mode = FsyncMode.PER_WRITE;
else if (text.equals("periodic"))
mode = FsyncMode.PERIODIC;
else
throw new IllegalArgumentException("Unknown fsyncMode value: " + text);
}
@Override
public Object getValue() {
return mode;
}
}
}