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;
}