/** * Closure that can be used to compute fill factor for provided data region. * * @param dataRegCfg Data region configuration. * @return Closure. */ protected IgniteOutClosure<Long> freeSpaceProvider(final DataRegionConfiguration dataRegCfg) { final String dataRegName = dataRegCfg.getName(); return new IgniteOutClosure<Long>() { private CacheFreeListImpl freeList; @Override public Long apply() { if (freeList == null) { CacheFreeListImpl freeList0 = freeListMap.get(dataRegName); if (freeList0 == null) return 0L; freeList = freeList0; } return freeList.freeSpace(); } }; }
/** * @param memPlcsCfgs User-defined data region configurations. */ private boolean hasCustomDefaultDataRegion(DataRegionConfiguration[] memPlcsCfgs) { for (DataRegionConfiguration memPlcsCfg : memPlcsCfgs) { if (DFLT_DATA_REG_DEFAULT_NAME.equals(memPlcsCfg.getName())) return true; } return false; }
/** {@inheritDoc} */ @Override public String getName() { return U.maskName(memPlcCfg.getName()); }
/** * Warns on first eviction. * @param regCfg data region configuration. */ private void warnFirstEvict(DataRegionConfiguration regCfg) { if (firstEvictWarn) return; // Do not move warning output to synchronized block (it causes warning in IDE). synchronized (this) { if (firstEvictWarn) return; firstEvictWarn = true; } U.warn(log, "Page-based evictions started." + " Consider increasing 'maxSize' on Data Region configuration: " + regCfg.getName()); } }
/** * @param plcCfg Policy config. * @return DirectMemoryProvider provider. */ private DirectMemoryProvider createOrReuseMemoryProvider(DataRegionConfiguration plcCfg) throws IgniteCheckedException { if (!supportsMemoryReuse(plcCfg)) return createMemoryProvider(plcCfg); DirectMemoryProvider memProvider = memProviderMap.get(plcCfg.getName()); if (memProvider == null) memProviderMap.put(plcCfg.getName(), (memProvider = createMemoryProvider(plcCfg))); return memProvider; }
/** * @param dbCfg Database config. * @throws IgniteCheckedException If failed. */ protected void initPageMemoryDataStructures(DataStorageConfiguration dbCfg) throws IgniteCheckedException { freeListMap = U.newHashMap(dataRegionMap.size()); String dfltMemPlcName = dbCfg.getDefaultDataRegionConfiguration().getName(); for (DataRegion memPlc : dataRegionMap.values()) { DataRegionConfiguration memPlcCfg = memPlc.config(); DataRegionMetricsImpl memMetrics = (DataRegionMetricsImpl) memMetricsMap.get(memPlcCfg.getName()); boolean persistenceEnabled = memPlcCfg.isPersistenceEnabled(); CacheFreeListImpl freeList = new CacheFreeListImpl(0, cctx.igniteInstanceName(), memMetrics, memPlc, null, persistenceEnabled ? cctx.wal() : null, 0L, true); freeListMap.put(memPlcCfg.getName(), freeList); } dfltFreeList = freeListMap.get(dfltMemPlcName); }
/** {@inheritDoc} */ @Override protected IgniteOutClosure<Long> freeSpaceProvider(final DataRegionConfiguration dataRegCfg) { if (!dataRegCfg.isPersistenceEnabled()) return super.freeSpaceProvider(dataRegCfg); final String dataRegName = dataRegCfg.getName(); return new IgniteOutClosure<Long>() { @Override public Long apply() { long freeSpace = 0L; for (CacheGroupContext grpCtx : cctx.cache().cacheGroups()) { if (!grpCtx.dataRegion().config().getName().equals(dataRegName)) continue; assert grpCtx.offheap() instanceof GridCacheOffheapManager; freeSpace += ((GridCacheOffheapManager)grpCtx.offheap()).freeSpace(); } return freeSpace; } }; }
/** * @param memPlcs Collection of memory policies. * @param nameToVerify Excepted name of memory policy. */ private boolean isMemoryPolicyPresented(Collection<DataRegion> memPlcs, String nameToVerify) { for (DataRegion memPlc : memPlcs) { if (nameToVerify.equals(memPlc.config().getName())) return true; } return false; } }
/** * Registers MBeans for all DataRegionMetrics configured in this instance. * * @param cfg Ignite configuration. */ protected void registerMetricsMBeans(IgniteConfiguration cfg) { if (U.IGNITE_MBEANS_DISABLED) return; assert cfg != null; for (DataRegionMetrics memMetrics : memMetricsMap.values()) { DataRegionConfiguration memPlcCfg = dataRegionMap.get(memMetrics.getName()).config(); registerMetricsMBean( cfg, MBEAN_GROUP_NAME, memPlcCfg.getName(), new DataRegionMetricsMXBeanImpl((DataRegionMetricsImpl)memMetrics, memPlcCfg), DataRegionMetricsMXBean.class ); } }
/** * @return Data region configuration. */ private DataRegionConfiguration getDataRegionConfiguration() { DataStorageConfiguration memCfg = ctx.kernalContext().config().getDataStorageConfiguration(); assert memCfg != null; String dataRegionName = memMetrics.getName(); if (memCfg.getDefaultDataRegionConfiguration().getName().equals(dataRegionName)) return memCfg.getDefaultDataRegionConfiguration(); DataRegionConfiguration[] dataRegions = memCfg.getDataRegionConfigurations(); if (dataRegions != null) { for (DataRegionConfiguration reg : dataRegions) { if (reg != null && reg.getName().equals(dataRegionName)) return reg; } } return null; }
/** {@inheritDoc} */ @Override protected void checkRegionEvictionProperties(DataRegionConfiguration regCfg, DataStorageConfiguration dbCfg) throws IgniteCheckedException { if (!regCfg.isPersistenceEnabled()) super.checkRegionEvictionProperties(regCfg, dbCfg); else if (regCfg.getPageEvictionMode() != DataPageEvictionMode.DISABLED) { U.warn(log, "Page eviction mode will have no effect because the oldest pages are evicted automatically " + "if Ignite persistence is enabled: " + regCfg.getName()); } }
/** * @param regCfg DataRegionConfiguration to validate. * @param dbCfg Memory configuration. * @throws IgniteCheckedException If config is invalid. */ protected void checkRegionEvictionProperties(DataRegionConfiguration regCfg, DataStorageConfiguration dbCfg) throws IgniteCheckedException { if (regCfg.getPageEvictionMode() == DataPageEvictionMode.DISABLED) return; if (regCfg.getEvictionThreshold() < 0.5 || regCfg.getEvictionThreshold() > 0.999) { throw new IgniteCheckedException("Page eviction threshold must be between 0.5 and 0.999: " + regCfg.getName()); } if (regCfg.getEmptyPagesPoolSize() <= 10) throw new IgniteCheckedException("Evicted pages pool size should be greater than 10: " + regCfg.getName()); long maxPoolSize = regCfg.getMaxSize() / dbCfg.getPageSize() / 10; if (regCfg.getEmptyPagesPoolSize() >= maxPoolSize) { throw new IgniteCheckedException("Evicted pages pool size should be lesser than " + maxPoolSize + ": " + regCfg.getName()); } }
@Override public Long apply() { long freeSpace = 0L; for (CacheGroupContext grpCtx : cctx.cache().cacheGroups()) { if (!grpCtx.dataRegion().config().getName().equals(dataRegName)) continue; assert grpCtx.offheap() instanceof GridCacheOffheapManager; freeSpace += ((GridCacheOffheapManager)grpCtx.offheap()).freeSpace(); } return freeSpace; } };
/** * @param regCfg DataRegionConfiguration to validate. * @throws IgniteCheckedException If config is invalid. */ private void checkRegionMemoryStorageType(DataRegionConfiguration regCfg) throws IgniteCheckedException { if (regCfg.isPersistenceEnabled() && regCfg.getSwapPath() != null) throw new IgniteCheckedException("DataRegionConfiguration must not have both persistence " + "storage and swap space enabled at the same time (Use DataRegionConfiguration.setSwapPath(null) " + "to disable the swap space usage or DataRegionConfiguration.setPersistenceEnabled(false) " + "to disable the persistence) [name=" + regCfg.getName() + ", swapPath=" + regCfg.getSwapPath() + ", persistenceEnabled=" + regCfg.isPersistenceEnabled() + "]" ); }
/** * @param memCfg Mem config. * @param regNames Region names. * @param regCfg Reg config. */ private void checkDataRegionConfiguration(DataStorageConfiguration memCfg, Set<String> regNames, DataRegionConfiguration regCfg) throws IgniteCheckedException { assert regCfg != null; checkDataRegionName(regCfg.getName(), regNames); checkDataRegionSize(regCfg); checkMetricsProperties(regCfg); checkRegionEvictionProperties(regCfg, memCfg); checkRegionMemoryStorageType(regCfg); }
/** * Constructor. * * @param plc Memory policy configuration. */ public VisorMemoryPolicyConfiguration(DataRegionConfiguration plc) { assert plc != null; name = plc.getName(); maxSize = plc.getMaxSize(); initSize = plc.getInitialSize(); swapFilePath = plc.getSwapPath(); pageEvictionMode = plc.getPageEvictionMode(); evictionThreshold = plc.getEvictionThreshold(); emptyPagesPoolSize = plc.getEmptyPagesPoolSize(); }
/** * @param cache Cache. * @param plcName Policy name. */ private void verifyCacheMemoryPolicy(IgniteCache cache, String plcName) { GridCacheContext ctx = ((IgniteCacheProxy) cache).context(); assertEquals(plcName, ctx.dataRegion().config().getName()); }
/** * Constructor. * * @param plc Data region configuration. */ public VisorDataRegionConfiguration(DataRegionConfiguration plc) { assert plc != null; name = plc.getName(); initSize = plc.getInitialSize(); maxSize = plc.getMaxSize(); swapPath = plc.getSwapPath(); pageEvictionMode = plc.getPageEvictionMode(); evictionThreshold = plc.getEvictionThreshold(); emptyPagesPoolSize = plc.getEmptyPagesPoolSize(); metricsEnabled = plc.isMetricsEnabled(); metricsSubIntervalCount = plc.getMetricsSubIntervalCount(); metricsRateTimeInterval = plc.getMetricsRateTimeInterval(); persistenceEnabled = plc.isPersistenceEnabled(); checkpointPageBufSize = plc.getCheckpointPageBufferSize(); }
/** * @param regCfg Data region configuration. * @return Data region message. */ private String dataRegionConfigurationMessage(DataRegionConfiguration regCfg) { if (regCfg == null) return null; SB m = new SB(); m.a(" ^-- ").a(regCfg.getName()).a(" ["); m.a("initSize=").a(U.readableSize(regCfg.getInitialSize(), false)); m.a(", maxSize=").a(U.readableSize(regCfg.getMaxSize(), false)); m.a(", persistence=" + regCfg.isPersistenceEnabled()).a(']'); return m.toString(); }
/** * Writes the data region configuration. * * @param w Writer. */ private static void writeDataRegionConfiguration(BinaryRawWriter w, DataRegionConfiguration cfg) { assert w != null; assert cfg != null; w.writeString(cfg.getName()); w.writeBoolean(cfg.isPersistenceEnabled()); w.writeLong(cfg.getInitialSize()); w.writeLong(cfg.getMaxSize()); w.writeString(cfg.getSwapPath()); w.writeInt(cfg.getPageEvictionMode().ordinal()); w.writeDouble(cfg.getEvictionThreshold()); w.writeInt(cfg.getEmptyPagesPoolSize()); w.writeBoolean(cfg.isMetricsEnabled()); w.writeInt(cfg.getMetricsSubIntervalCount()); w.writeLong(cfg.getMetricsRateTimeInterval()); w.writeLong(cfg.getCheckpointPageBufferSize()); }