diff --git a/.classpath b/.classpath index 9daadee954..cdbfb70065 100644 --- a/.classpath +++ b/.classpath @@ -40,7 +40,7 @@ - + diff --git a/lib/je-4.0.92.jar b/lib/je-4.0.92.jar deleted file mode 100644 index fa9225dd07..0000000000 Binary files a/lib/je-4.0.92.jar and /dev/null differ diff --git a/lib/je-4.1.17.jar b/lib/je-4.1.17.jar new file mode 100644 index 0000000000..17cc9f11f6 Binary files /dev/null and b/lib/je-4.1.17.jar differ diff --git a/src/java/voldemort/server/VoldemortConfig.java b/src/java/voldemort/server/VoldemortConfig.java index 0756f7e06e..36ac12510d 100644 --- a/src/java/voldemort/server/VoldemortConfig.java +++ b/src/java/voldemort/server/VoldemortConfig.java @@ -87,6 +87,9 @@ public class VoldemortConfig implements Serializable { private long bdbStatsCacheTtlMs; private boolean bdbExposeSpaceUtilization; private long bdbMinimumSharedCache; + private boolean bdbCleanerLazyMigration; + private boolean bdbCacheModeEvictLN; + private boolean bdbMinimizeScanImpact; private String mysqlUsername; private String mysqlPassword; @@ -233,6 +236,9 @@ public VoldemortConfig(Props props) { this.bdbStatsCacheTtlMs = props.getLong("bdb.stats.cache.ttl.ms", 5 * Time.MS_PER_SECOND); this.bdbExposeSpaceUtilization = props.getBoolean("bdb.expose.space.utilization", true); this.bdbMinimumSharedCache = props.getLong("bdb.minimum.shared.cache", 0); + this.bdbCleanerLazyMigration = props.getBoolean("bdb.cleaner.lazy.migration", true); + this.bdbCacheModeEvictLN = props.getBoolean("bdb.cache.evictln", false); + this.bdbMinimizeScanImpact = props.getBoolean("bdb.minimize.scan.impact", false); this.readOnlyBackups = props.getInt("readonly.backups", 1); this.readOnlySearchStrategy = props.getString("readonly.search.strategy", @@ -821,6 +827,62 @@ public void setBdbBtreeFanout(int bdbBtreeFanout) { this.bdbBtreeFanout = bdbBtreeFanout; } + /** + * If true, Cleaner offloads some work to application threads, to keep up + * with the write rate. + * + *
    + *
  • property: "bdb.cleaner.lazy.migration"
  • + *
  • default : true
  • + *
+ * + * @return + */ + public boolean getBdbCleanerLazyMigration() { + return bdbCleanerLazyMigration; + } + + public final void setBdbCleanerLazyMigration(boolean bdbCleanerLazyMigration) { + this.bdbCleanerLazyMigration = bdbCleanerLazyMigration; + } + + /** + * If true, BDB will not cache data in the JVM. + * + *
    + *
  • Property : "bdb.cache.evictln"
  • + *
  • Default : false
  • + *
+ * + * @return + */ + public boolean getBdbCacheModeEvictLN() { + return bdbCacheModeEvictLN; + } + + public void setBdbCacheModeEvictLN(boolean bdbCacheModeEvictLN) { + this.bdbCacheModeEvictLN = bdbCacheModeEvictLN; + } + + /** + * If true, attempts are made to minimize impact to BDB cache during scan + * jobs + * + *
    + *
  • Property : "bdb.minimize.scan.impact"
  • + *
  • Default : false
  • + *
+ * + * @return + */ + public boolean getBdbMinimizeScanImpact() { + return bdbMinimizeScanImpact; + } + + public void setBdbMinimizeScanImpact(boolean bdbMinimizeScanImpact) { + this.bdbMinimizeScanImpact = bdbMinimizeScanImpact; + } + /** * The comfortable number of threads the threadpool will attempt to * maintain. Specified by "core.threads" default: max(1, floor(0.5 * diff --git a/src/java/voldemort/store/bdb/BdbRuntimeConfig.java b/src/java/voldemort/store/bdb/BdbRuntimeConfig.java index e568a02049..3352aefbe5 100644 --- a/src/java/voldemort/store/bdb/BdbRuntimeConfig.java +++ b/src/java/voldemort/store/bdb/BdbRuntimeConfig.java @@ -14,10 +14,12 @@ public class BdbRuntimeConfig { public static final long DEFAULT_STATS_CACHE_TTL_MS = 5 * Time.MS_PER_SECOND; public static final LockMode DEFAULT_LOCK_MODE = LockMode.READ_UNCOMMITTED; public static final boolean DEFAULT_EXPOSE_SPACE_UTIL = true; + public static final boolean DEFAULT_MINIMIZE_SCAN_IMPACT = false; private long statsCacheTtlMs = DEFAULT_STATS_CACHE_TTL_MS; private LockMode lockMode = DEFAULT_LOCK_MODE; private boolean exposeSpaceUtil = DEFAULT_EXPOSE_SPACE_UTIL; + private boolean minimizeScanImpact = DEFAULT_MINIMIZE_SCAN_IMPACT; public BdbRuntimeConfig() { @@ -29,6 +31,7 @@ public BdbRuntimeConfig(VoldemortConfig config) { setLockMode(lockMode); setStatsCacheTtlMs(config.getBdbStatsCacheTtlMs()); setExposeSpaceUtil(config.getBdbExposeSpaceUtilization()); + setMinimizeScanImpact(config.getBdbMinimizeScanImpact()); } public long getStatsCacheTtlMs() { @@ -56,4 +59,12 @@ public void setExposeSpaceUtil(boolean expose) { public boolean getExposeSpaceUtil() { return this.exposeSpaceUtil; } + + public boolean getMinimizeScanImpact() { + return minimizeScanImpact; + } + + public void setMinimizeScanImpact(boolean minimizeScanImpact) { + this.minimizeScanImpact = minimizeScanImpact; + } } diff --git a/src/java/voldemort/store/bdb/BdbStorageConfiguration.java b/src/java/voldemort/store/bdb/BdbStorageConfiguration.java index f089dd757f..b20b55d538 100644 --- a/src/java/voldemort/store/bdb/BdbStorageConfiguration.java +++ b/src/java/voldemort/store/bdb/BdbStorageConfiguration.java @@ -37,6 +37,7 @@ import voldemort.utils.Time; import com.google.common.collect.Maps; +import com.sleepycat.je.CacheMode; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseException; @@ -107,8 +108,14 @@ public BdbStorageConfiguration(VoldemortConfig config) { Integer.toString(config.getBdbLogFaultReadSize())); environmentConfig.setConfigParam(EnvironmentConfig.LOG_ITERATOR_READ_SIZE, Integer.toString(config.getBdbLogIteratorReadSize())); + environmentConfig.setConfigParam(EnvironmentConfig.CLEANER_LAZY_MIGRATION, + Boolean.toString(config.getBdbCleanerLazyMigration())); environmentConfig.setLockTimeout(config.getBdbLockTimeoutMs(), TimeUnit.MILLISECONDS); + if(config.getBdbCacheModeEvictLN()) { + environmentConfig.setCacheMode(CacheMode.EVICT_LN); + } + databaseConfig = new DatabaseConfig(); databaseConfig.setAllowCreate(true); databaseConfig.setSortedDuplicates(false); diff --git a/src/java/voldemort/store/bdb/BdbStorageEngine.java b/src/java/voldemort/store/bdb/BdbStorageEngine.java index 679ea8ccb1..dbe8134443 100644 --- a/src/java/voldemort/store/bdb/BdbStorageEngine.java +++ b/src/java/voldemort/store/bdb/BdbStorageEngine.java @@ -51,6 +51,7 @@ import voldemort.versioning.Version; import voldemort.versioning.Versioned; +import com.sleepycat.je.CacheMode; import com.sleepycat.je.Cursor; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseEntry; @@ -78,6 +79,7 @@ public class BdbStorageEngine implements StorageEngine>> entries() { try { Cursor cursor = getBdbDatabase().openCursor(null, null); + // evict data brought in by the cursor walk right away + if(this.minimizeScanImpact) + cursor.setCacheMode(CacheMode.EVICT_BIN); return new BdbEntriesIterator(cursor); } catch(DatabaseException e) { logger.error(e); @@ -110,6 +116,9 @@ public ClosableIterator>> entries() { public ClosableIterator keys() { try { Cursor cursor = getBdbDatabase().openCursor(null, null); + // evict data brought in by the cursor walk right away + if(this.minimizeScanImpact) + cursor.setCacheMode(CacheMode.EVICT_BIN); return new BdbKeysIterator(cursor); } catch(DatabaseException e) { logger.error(e); diff --git a/src/java/voldemort/store/bdb/stats/BdbEnvironmentStats.java b/src/java/voldemort/store/bdb/stats/BdbEnvironmentStats.java index 1b97dbd5d3..6f37f7ec06 100644 --- a/src/java/voldemort/store/bdb/stats/BdbEnvironmentStats.java +++ b/src/java/voldemort/store/bdb/stats/BdbEnvironmentStats.java @@ -97,6 +97,60 @@ public long getEvictedLNs() { return getFastStats().getNEvictPasses(); } + @JmxGetter(name = "BINFetches") + public long getBINFetches() { + return getFastStats().getNBINsFetch(); + } + + @JmxGetter(name = "BINFetchMisses") + public long getBINFetchMisses() { + return getFastStats().getNBINsFetchMiss(); + } + + @JmxGetter(name = "INFetches") + public long getINFetches() { + return getFastStats().getNUpperINsFetch(); + } + + @JmxGetter(name = "INFetchMisses") + public long getINFetchMisses() { + return getFastStats().getNUpperINsFetchMiss(); + } + + @JmxGetter(name = "LNFetches") + public long getLNFetches() { + return getFastStats().getNLNsFetch(); + } + + @JmxGetter(name = "LNFetchMisses") + public long getLNFetchMisses() { + return getFastStats().getNLNsFetchMiss(); + } + + @JmxGetter(name = "CachedBINs") + public long getCachedBINs() { + return getFastStats().getNCachedBINs(); + } + + @JmxGetter(name = "CachedINs") + public long getCachedUpperINs() { + return getFastStats().getNCachedUpperINs(); + } + + @JmxGetter(name = "EvictedBINs") + public long getEvictedBINs() { + EnvironmentStats stats = getFastStats(); + return stats.getNBINsEvictedCacheMode() + stats.getNBINsEvictedCritical() + + stats.getNBINsEvictedDaemon() + stats.getNBINsEvictedManual(); + } + + @JmxGetter(name = "EvictedINs") + public long getEvictedINs() { + EnvironmentStats stats = getFastStats(); + return stats.getNUpperINsEvictedCacheMode() + stats.getNUpperINsEvictedCritical() + + stats.getNUpperINsEvictedDaemon() + stats.getNUpperINsEvictedManual(); + } + // 2. IO @JmxGetter(name = "NumRandomWrites") public long getNumRandomWrites() { @@ -299,6 +353,21 @@ public double getPercentageUtilization() { return safeGetPercentage(getTotalSpaceUtilized(), getTotalSpace()); } + @JmxGetter(name = "PercentageBINMiss") + public double getPercentageBINMiss() { + return safeGetPercentage(getBINFetchMisses(), getBINFetches()); + } + + @JmxGetter(name = "PercentageINMiss") + public double getPercentageINMiss() { + return safeGetPercentage(getINFetchMisses(), getINFetches()); + } + + @JmxGetter(name = "PercentageLNMiss") + public double getPercentageLNMiss() { + return safeGetPercentage(getLNFetchMisses(), getLNFetches()); + } + public static double safeGetPercentage(long rawNum, long total) { return total == 0 ? 0.0d : rawNum / (float) total; }