in component/block_cache/block_cache.go [224:352]
func (bc *BlockCache) Configure(_ bool) error {
log.Trace("BlockCache::Configure : %s", bc.Name())
if common.IsStream {
err := bc.stream.Configure(true)
if err != nil {
log.Err("BlockCache:Stream::Configure : config error [invalid config attributes]")
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
}
conf := BlockCacheOptions{}
err := config.UnmarshalKey(bc.Name(), &conf)
if err != nil {
log.Err("BlockCache::Configure : config error [invalid config attributes]")
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
bc.blockSize = uint64(defaultBlockSize) * _1MB
if config.IsSet(compName + ".block-size-mb") {
bc.blockSize = uint64(conf.BlockSize * float64(_1MB))
}
if config.IsSet(compName + ".mem-size-mb") {
bc.memSize = conf.MemSize * _1MB
} else {
bc.memSize = bc.getDefaultMemSize()
}
bc.diskTimeout = defaultTimeout
if config.IsSet(compName + ".disk-timeout-sec") {
bc.diskTimeout = conf.DiskTimeout
}
bc.consistency = conf.Consistency
bc.prefetchOnOpen = conf.PrefetchOnOpen
bc.prefetch = uint32(math.Max((MIN_PREFETCH*2)+1, (float64)(2*runtime.NumCPU())))
bc.noPrefetch = false
if (!config.IsSet(compName + ".mem-size-mb")) && (uint64(bc.prefetch)*uint64(bc.blockSize)) > bc.memSize {
bc.prefetch = (MIN_PREFETCH * 2) + 1
}
err = config.UnmarshalKey("lazy-write", &bc.lazyWrite)
if err != nil {
log.Err("BlockCache: config error [unable to obtain lazy-write]")
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
if config.IsSet(compName + ".prefetch") {
bc.prefetch = conf.PrefetchCount
if bc.prefetch == 0 {
bc.noPrefetch = true
} else if conf.PrefetchCount <= (MIN_PREFETCH * 2) {
log.Err("BlockCache::Configure : Prefetch count can not be less then %v", (MIN_PREFETCH*2)+1)
return fmt.Errorf("config error in %s [invalid prefetch count]", bc.Name())
}
}
bc.maxDiskUsageHit = false
bc.workers = uint32(3 * runtime.NumCPU())
if config.IsSet(compName + ".parallelism") {
bc.workers = conf.Workers
}
bc.tmpPath = common.ExpandPath(conf.TmpPath)
bc.cleanupOnStart = conf.CleanupOnStart
if bc.tmpPath != "" {
//check mnt path is not same as temp path
err = config.UnmarshalKey("mount-path", &bc.mntPath)
if err != nil {
log.Err("BlockCache: config error [unable to obtain Mount Path]")
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
if bc.mntPath == bc.tmpPath {
log.Err("BlockCache: config error [tmp-path is same as mount path]")
return fmt.Errorf("config error in %s error [tmp-path is same as mount path]", bc.Name())
}
// Extract values from 'conf' and store them as you wish here
_, err = os.Stat(bc.tmpPath)
if os.IsNotExist(err) {
log.Info("BlockCache: config error [tmp-path does not exist. attempting to create tmp-path.]")
err := os.Mkdir(bc.tmpPath, os.FileMode(0755))
if err != nil {
log.Err("BlockCache: config error creating directory of temp path after clean [%s]", err.Error())
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
} else {
if bc.cleanupOnStart {
err := common.TempCacheCleanup(bc.tmpPath)
if err != nil {
return fmt.Errorf("error in %s error [fail to cleanup temp cache]", bc.Name())
}
}
}
if !common.IsDirectoryEmpty(bc.tmpPath) {
log.Err("BlockCache: config error %s directory is not empty", bc.tmpPath)
return fmt.Errorf("config error in %s [%s]", bc.Name(), "temp directory not empty")
}
bc.diskSize = bc.getDefaultDiskSize(bc.tmpPath)
if config.IsSet(compName + ".disk-size-mb") {
bc.diskSize = conf.DiskSize * _1MB
}
}
if (uint64(bc.prefetch) * uint64(bc.blockSize)) > bc.memSize {
log.Err("BlockCache::Configure : config error [memory limit too low for configured prefetch]")
return fmt.Errorf("config error in %s [memory limit too low for configured prefetch]", bc.Name())
}
if bc.tmpPath != "" {
bc.diskPolicy, err = tlru.New(uint32((bc.diskSize)/bc.blockSize), bc.diskTimeout, bc.diskEvict, 60, bc.checkDiskUsage)
if err != nil {
log.Err("BlockCache::Configure : fail to create LRU for memory nodes [%s]", err.Error())
return fmt.Errorf("config error in %s [%s]", bc.Name(), err.Error())
}
}
log.Crit("BlockCache::Configure : block size %v, mem size %v, worker %v, prefetch %v, disk path %v, max size %v, disk timeout %v, prefetch-on-open %t, maxDiskUsageHit %v, noPrefetch %v, consistency %v",
bc.blockSize, bc.memSize, bc.workers, bc.prefetch, bc.tmpPath, bc.diskSize, bc.diskTimeout, bc.prefetchOnOpen, bc.maxDiskUsageHit, bc.noPrefetch, bc.consistency)
return nil
}