/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.github.geophile.erdo.apiimpl;
import com.github.geophile.erdo.Configuration;
import com.github.geophile.erdo.UsageError;
import com.github.geophile.erdo.config.ConfigurationKeys;
import com.github.geophile.erdo.config.ConfigurationMap;
import java.io.File;
import java.io.IOException;
import java.util.Map;
public class ConfigurationImpl extends Configuration implements DefaultConfiguration
{
// Configuration interface
public static Configuration defaultConfiguration()
{
ConfigurationImpl configuration = new ConfigurationImpl();
configuration.diskPageSizeBytes(DEFAULT_DISK_PAGE_SIZE_BYTES);
configuration.consolidationMaxPendingCommittedSizeBytes(DEFAULT_CONSOLIDATION_MAX_PENDING_COMMITTED_SIZE_BYTES);
configuration.diskCacheSizeBytes(DEFAULT_DISK_CACHE_SIZE_BYTES);
configuration.diskCacheSlabSizeBytes(DEFAULT_DISK_CACHE_SLAB_SIZE_BYTES);
configuration.diskSegmentSizeBytes(DEFAULT_DISK_SEGMENT_SIZE_BYTES);
configuration.consolidationThreads(DEFAULT_CONSOLIDATION_THREADS);
configuration.consolidationMinSizeBytes(DEFAULT_CONSOLIDATION_MIN_SIZE_BYTES);
configuration.consolidationMinMapsToConsolidate(DEFAULT_CONSOLIDATION_MIN_MAPS_TO_CONSOLIDATE);
configuration.consolidationIdleTimeSec(DEFAULT_CONSOLIDATION_IDLE_TIME_SEC);
configuration.keysInMemoryMapLimit(DEFAULT_KEYS_IN_MEMORY_MAP_LIMIT);
configuration.keysBloomFilterErrorRate(DEFAULT_KEYS_BLOOM_FILTER_ERROR_RATE);
return configuration;
}
public static Configuration emptyConfiguration()
{
return new ConfigurationImpl();
}
@Override
public int diskPageSizeBytes()
{
return map.intValue(ConfigurationKeys.DISK_PAGE_SIZE_BYTES);
}
@Override
public void diskPageSizeBytes(int pageSizeBytes)
{
map.value(ConfigurationKeys.DISK_PAGE_SIZE_BYTES, pageSizeBytes);
}
@Override
public int diskSegmentSizeBytes()
{
return map.intValue(ConfigurationKeys.DISK_SEGMENT_SIZE_BYTES);
}
@Override
public void diskSegmentSizeBytes(int segmentSizeBytes)
{
map.value(ConfigurationKeys.DISK_SEGMENT_SIZE_BYTES, segmentSizeBytes);
}
@Override
public long diskCacheSizeBytes()
{
return map.longValue(ConfigurationKeys.DISK_CACHE_SIZE_BYTES);
}
@Override
public void diskCacheSizeBytes(long cacheSizeBytes)
{
map.value(ConfigurationKeys.DISK_CACHE_SIZE_BYTES, cacheSizeBytes);
}
@Override
public int diskCacheSlabSizeBytes()
{
return map.intValue(ConfigurationKeys.DISK_CACHE_SLAB_SIZE_BYTES);
}
@Override
public void diskCacheSlabSizeBytes(int cacheSlabSizeBytes)
{
map.value(ConfigurationKeys.DISK_CACHE_SLAB_SIZE_BYTES, cacheSlabSizeBytes);
}
@Override
public int consolidationThreads()
{
return map.intValue(ConfigurationKeys.CONSOLIDATION_THREADS);
}
@Override
public void consolidationThreads(int consolidationThreads)
{
map.value(ConfigurationKeys.CONSOLIDATION_THREADS, consolidationThreads);
}
@Override
public int consolidationMinSizeBytes()
{
return map.intValue(ConfigurationKeys.CONSOLIDATION_MIN_SIZE_BYTES);
}
@Override
public void consolidationMinSizeBytes(int consolidationMinSizeBytes)
{
map.value(ConfigurationKeys.CONSOLIDATION_MIN_SIZE_BYTES, consolidationMinSizeBytes);
}
@Override
public int consolidationMaxPendingCommittedSizeBytes()
{
return map.intValue(ConfigurationKeys.CONSOLIDATION_MAX_PENDING_COMMITTED_SIZE_BYTES);
}
@Override
public void consolidationMaxPendingCommittedSizeBytes(int consolidationMaxPendingCommittedSizeBytes)
{
map.value(ConfigurationKeys.CONSOLIDATION_MAX_PENDING_COMMITTED_SIZE_BYTES,
consolidationMaxPendingCommittedSizeBytes);
}
@Override
public int consolidationMinMapsToConsolidate()
{
return map.intValue(ConfigurationKeys.CONSOLIDATION_MIN_MAPS_TO_CONSOLIDATE);
}
@Override
public void consolidationMinMapsToConsolidate(int consolidationMinMapsToConsolidate)
{
map.value(ConfigurationKeys.CONSOLIDATION_MIN_MAPS_TO_CONSOLIDATE, consolidationMinMapsToConsolidate);
}
@Override
public int consolidationIdleTimeSec()
{
return map.intValue(ConfigurationKeys.CONSOLIDATION_IDLE_TIME_SEC);
}
@Override
public void consolidationIdleTimeSec(int consolidationIdleTimeSec)
{
map.value(ConfigurationKeys.CONSOLIDATION_IDLE_TIME_SEC, consolidationIdleTimeSec);
}
@Override
public long keysInMemoryMapLimit()
{
return map.longValue(ConfigurationKeys.KEYS_PER_MAP_LIMIT);
}
@Override
public void keysInMemoryMapLimit(long keysPerMapLimit)
{
map.value(ConfigurationKeys.KEYS_PER_MAP_LIMIT, keysPerMapLimit);
}
@Override
public double keysBloomFilterErrorRate()
{
return map.doubleValue(ConfigurationKeys.KEYS_BLOOM_FILTER_ERROR_RATE);
}
@Override
public void keysBloomFilterErrorRate(double keysBloomFilterErrorRate)
{
map.value(ConfigurationKeys.KEYS_BLOOM_FILTER_ERROR_RATE, keysBloomFilterErrorRate);
}
@Override
public Map<String, String> toMap()
{
return map.toMap();
}
// ConfigurationImpl interface
public void read(File file) throws IOException
{
map.read(file);
checkConfiguration();
}
public void write(File file) throws IOException
{
checkConfiguration();
map.write(file);
}
public void override(Configuration overrideConfiguration)
{
Map<String, String> override = ((ConfigurationImpl) overrideConfiguration).map.toMap();
for (Map.Entry<String, String> entry : override.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (!ConfigurationKeys.SETTABLE_ON_DATABASE_OPEN.contains(key)) {
throw new UsageError(
String.format("The value of the configuration property %s " +
"can only be set on database creation.",
key));
}
map.toMap().put(key, value);
}
}
public ConfigurationImpl()
{
this.map = new ConfigurationMap();
}
// For use by this class
private void checkConfiguration()
{
if (!powerOf2(diskPageSizeBytes())) {
throw new UsageError(
String.format("%s must be a power of 2: %s",
ConfigurationKeys.DISK_PAGE_SIZE_BYTES, diskPageSizeBytes()));
}
if (!powerOf2(diskSegmentSizeBytes())) {
throw new UsageError(
String.format("%s must be a power of 2: %s",
ConfigurationKeys.DISK_PAGE_SIZE_BYTES, diskPageSizeBytes()));
}
if (!(diskSegmentSizeBytes() > diskPageSizeBytes())) {
throw new UsageError(
String.format("%s must exceed %s. %s = %s, %s = %s",
ConfigurationKeys.DISK_SEGMENT_SIZE_BYTES,
ConfigurationKeys.DISK_PAGE_SIZE_BYTES,
ConfigurationKeys.DISK_SEGMENT_SIZE_BYTES,
diskSegmentSizeBytes(),
ConfigurationKeys.DISK_PAGE_SIZE_BYTES,
diskPageSizeBytes()));
}
}
boolean powerOf2(long x)
{
long powerOf2 = 1;
while (powerOf2 < x) {
powerOf2 *= 2;
}
return powerOf2 == x;
}
// Object state
final ConfigurationMap map;
}