Jump To …

EnvironmentConfig.coffee

class EnvironmentConfig
  @MEMORY_USAGE = "exodus.memoryUsage"
  @MEMORY_USAGE_PERCENTAGE = "exodus.memoryUsagePercentage"
  @LOG_DURABLE_WRITE = "exodus.log.durableWrite"
  @LOG_FILE_SIZE = "exodus.log.fileSize" # in Kb
  @LOG_LOCK_TIMEOUT = "exodus.log.lockTimeout" # in milliseconds
  @LOG_CACHE_PAGE_SIZE = "exodus.log.cache.pageSize" # in bytes
  @LOG_CACHE_OPEN_FILES = "exodus.log.cache.openFilesCount"
  @LOG_CACHE_SHARED = "exodus.log.cache.shared"
  @LOG_CACHE_NON_BLOCKING = "exodus.log.cache.nonBlocking"
  @LOG_CACHE_WRITE_BUFFER_SIZE = "exodus.log.cache.writeBufferSize"
  @ENV_META_TREE_CACHED = "exodus.env.metaTree.cached"
  @ENV_CLOSE_FORCEDLY = "exodus.env.close.forcedly"
  @TREE_MAX_PAGE_SIZE = "exodus.tree.maxPageSize"
  @GC_ENABLED = "exodus.gc.enabled"
  @GC_MIN_UTILIZATION = "exodus.gc.minUtilization"
  @GC_RENAME_FILES = "exodus.gc.renameFiles"
  @GC_USE_EXPIRATION_CHECKER = "exodus.gc.useExpirationChecker"

Minimum age of a file to consider it for cleaning.

  @GC_MIN_FILE_AGE = "exodus.gc.fileMinAge"

Cleaner checks log utilization and runs if necessary after this many new files are created in the log.

  @GC_CLEANER_FILES_INTERVAL = "exodus.gc.cleaner.filesInterval";
  @GC_UTILIZATION_FROM_SCRATCH = "exodus.gc.utilization.fromScratch";

@private

  settings: undefined

@private

  balanceStrategy: undefined

  getSetting: (key) ->
    return @settings[key]

  setSetting: (key, value) ->
    @settings[key] = value

  getMemoryUsage: () ->
    @getSetting(EnvironmentConfig.MEMORY_USAGE)

  setMemoryUsage: (maxMemory) ->
    @setSetting(EnvironmentConfig.MEMORY_USAGE, maxMemory)

  getMemoryUsagePercentage: () ->
    return @getSetting(EnvironmentConfig.MEMORY_USAGE_PERCENTAGE)

  setMemoryUsagePercentage: (memoryUsagePercentage) ->
    @setSetting(EnvironmentConfig.MEMORY_USAGE_PERCENTAGE, memoryUsagePercentage)

  getLogDurableWrite: () ->
    return @getSetting(EnvironmentConfig.LOG_DURABLE_WRITE)

  setLogDurableWrite: (durableWrite)->
    @setSetting(EnvironmentConfig.LOG_DURABLE_WRITE, durableWrite)

  getLogFileSize: () ->
    return @getSetting(EnvironmentConfig.LOG_FILE_SIZE)

  setLogFileSize: (kilobytes) ->
    @setSetting(EnvironmentConfig.LOG_FILE_SIZE, kilobytes)

  getLogLockTimeout: () ->
    return @getSetting(EnvironmentConfig.LOG_LOCK_TIMEOUT)

  setLogLockTimeout: (millis) ->
    @setSetting(EnvironmentConfig.LOG_LOCK_TIMEOUT, millis)

  getLogCachePageSize: () ->
    return @getSetting(EnvironmentConfig.LOG_CACHE_PAGE_SIZE)

  setLogCachePageSize: (bytes) ->
    @setSetting(EnvironmentConfig.LOG_CACHE_PAGE_SIZE, bytes)

  getLogCacheOpenFilesCount: () ->
    return @getSetting(EnvironmentConfig.LOG_CACHE_OPEN_FILES)

  setLogCacheOpenFilesCount: (files) ->
    @setSetting(EnvironmentConfig.LOG_CACHE_OPEN_FILES, files)

  isLogCacheShared: () ->
    return @getSetting(EnvironmentConfig.LOG_CACHE_SHARED)

  setLogCacheShared: (shared) ->
    @setSetting(EnvironmentConfig.LOG_CACHE_SHARED, shared)

  isLogCacheNonBlocking: () ->
    return @getSetting(EnvironmentConfig.LOG_CACHE_NON_BLOCKING)

  setLogCacheNonBlocking: (shared) ->
    @setSetting(EnvironmentConfig.LOG_CACHE_NON_BLOCKING, shared)

  getLogCacheWriteBufferSize: () ->
    return @getSetting(EnvironmentConfig.LOG_CACHE_WRITE_BUFFER_SIZE)

  setLogCacheWriteBufferSize: (pagesCount) ->
    @setSetting(EnvironmentConfig.LOG_CACHE_WRITE_BUFFER_SIZE, pagesCount)

  getEnvMetaTreeCached: () ->
    return @getSetting(EnvironmentConfig.ENV_META_TREE_CACHED)

  setEnvMetaTreeCached: (cached) ->
    @setSetting(EnvironmentConfig.ENV_META_TREE_CACHED, cached)

  getEnvCloseForcedly: () ->
    return @getSetting(EnvironmentConfig.ENV_CLOSE_FORCEDLY)

  setEnvCloseForcedly: (closeForcedly) ->
    @setSetting(EnvironmentConfig.ENV_CLOSE_FORCEDLY, closeForcedly)

  getTreeMaxPageSize: () ->
    return @getSetting(EnvironmentConfig.TREE_MAX_PAGE_SIZE)

  setTreeMaxPageSize: (pageSize) ->

if (pageSize < 4 || pageSize > 1024) TODO throw new InvalidSettingException("Invalid tree page size: " + pageSize);

    @setSetting(EnvironmentConfig.TREE_MAX_PAGE_SIZE, pageSize)
    balanceStrategy = null;

  isGcEnabled: () ->
    return @getSetting(EnvironmentConfig.GC_ENABLED)

  setGcEnabled: (enabled) ->
    @setSetting(EnvironmentConfig.GC_ENABLED, enabled)

  getGcMinUtilization: () ->
    return @getSetting(EnvironmentConfig.GC_MIN_UTILIZATION)

  setGcMinUtilization: (percent) ->

if (percent < 1 || percent > 90) { TODO throw new InvalidSettingException("Invalid minimum log files utilization: " + percent);

    @setSetting(EnvironmentConfig.GC_MIN_UTILIZATION, percent)

  getGcRenameFiles: () ->
    return @getSetting(EnvironmentConfig.GC_RENAME_FILES)

  setGcRenameFiles: (rename) ->
    @setSetting(EnvironmentConfig.GC_RENAME_FILES, rename)

  getGcUseExpirationChecker: () ->
    return @getSetting(EnvironmentConfig.GC_USE_EXPIRATION_CHECKER)

  setGcUseExpirationChecker: (use) ->
    @setSetting(EnvironmentConfig.GC_USE_EXPIRATION_CHECKER, use)

  getGcFileMinAge: () ->
    return @getSetting(GC_MIN_FILE_AGE)

  setGcFileMinAge: (minAge) ->

if (minAge < 1) { TODO throw new InvalidSettingException("Invalid file minimum age: " + minAge);

    @setSetting(EnvironmentConfig.GC_MIN_FILE_AGE, minAge)

  getGcCleanerFilesInterval: () ->
    return @getSetting(EnvironmentConfig.GC_CLEANER_FILES_INTERVAL)

  setGcCleanerFilesInterval: (files) ->

if (files < 1) { TODO throw new InvalidSettingException("Invalid number of files: " + files);

    @setSetting(EnvironmentConfig.GC_CLEANER_FILES_INTERVAL, files)

  getGcUtilizationFromScratch: () ->
    return @getSetting(EnvironmentConfig.GC_UTILIZATION_FROM_SCRATCH)

  setGcUtilizationFromScratch: (fromScratch) ->
    @setSetting(EnvironmentConfig.GC_UTILIZATION_FROM_SCRATCH, fromScratch)

  getBalanceStrategy: () ->

no actual need to avoid race condition here TODO if (balanceStrategy == null) { balanceStrategy = new BalanceStrategy(getTreeMaxPageSize());

    return @balanceStrategy;

private static boolean getBoolean(@NotNull final String propName, final boolean defaultValue) { final String value = System.getProperty(propName); return value == null ? defaultValue : "true".equalsIgnoreCase(value);

  @create: (o) ->
    if !o? then o = new EnvironmentConfig()
    o.settings = new Object()
    o.setMemoryUsagePercentage(60)
    o.setLogDurableWrite(true)
    o.setLogFileSize(8192)
    o.setLogLockTimeout(0)
    o.setLogCachePageSize(16284)
    o.setLogCacheOpenFilesCount(50)
    o.setLogCacheShared(true)
    o.setLogCacheNonBlocking(true)
    o.setLogCacheWriteBufferSize(16)
    o.setEnvMetaTreeCached(true)
    o.setEnvCloseForcedly(false)
    o.setTreeMaxPageSize(128)
    o.setGcEnabled(true)
    o.setGcMinUtilization(50)
    o.setGcRenameFiles(false)
    o.setGcUseExpirationChecker(true)
    o.setGcFileMinAge(2)
    o.setGcCleanerFilesInterval(2)
    o.setGcUtilizationFromScratch(false)
    return o

setMemoryUsagePercentage(Integer.getInteger(MEMORYUSAGEPERCENTAGE, 60)); setLogDurableWrite(getBoolean(LOGDURABLEWRITE, true)); setLogFileSize(Long.getLong(LOGFILESIZE, 8192L)); setLogLockTimeout(Long.getLong(LOGLOCKTIMEOUT, 0L)); setLogCachePageSize(Integer.getInteger(LOGCACHEPAGESIZE, 16384)); setLogCacheOpenFilesCount(Integer.getInteger(LOGCACHEOPENFILES, 50)); setLogCacheShared(getBoolean(LOGCACHESHARED, true)); setLogCacheNonBlocking(getBoolean(LOGCACHENONBLOCKING, true)); setLogCacheWriteBufferSize(Integer.getInteger(LOGCACHEWRITEBUFFERSIZE, 16)); setEnvMetaTreeCached(getBoolean(ENVMETATREECACHED, true)); setEnvCloseForcedly(getBoolean(ENVCLOSEFORCEDLY, false)); setTreeMaxPageSize(Integer.getInteger(TREEMAXPAGESIZE, 128)); setGcEnabled(getBoolean(GCENABLED, true)); setGcMinUtilization(Integer.getInteger(GCMINUTILIZATION, 50)); setGcRenameFiles(getBoolean(GCRENAMEFILES, false)); setGcUseExpirationChecker(getBoolean(GCUSEEXPIRATIONCHECKER, true)); setGcFileMinAge(Integer.getInteger(GCMINFILEAGE, 2)); setGcCleanerFilesInterval(Integer.getInteger(GCCLEANERFILESINTERVAL, 2)); setGcUtilizationFromScratch(getBoolean(GCUTILIZATIONFROMSCRATCH, false));

  @DEFAULT: EnvironmentConfig.create()

exports.EnvironmentConfig = EnvironmentConfig