Merge "Add advanced H2 option handling"

This commit is contained in:
Edwin Kempin 2016-07-11 12:50:20 +00:00 committed by Gerrit Code Review
commit 93d1d753fa
4 changed files with 71 additions and 19 deletions

View File

@ -539,24 +539,31 @@ Default is unset, no disk cache.
[[cache.h2CacheSize]]cache.h2CacheSize::
+
The size of the in-memory cache for each opened H2 database, in bytes.
The size of the in-memory cache for each opened H2 cache database, in bytes.
+
Some caches of Gerrit are persistent and are backed by an H2 database.
H2 uses memory to cache its database content. The parameter `h2CacheSize`
allows to limit the memory used by H2 and thus prevent out-of-memory
caused by the H2 database using too much memory.
+
Technically the H2 cache size is configured using the CACHE_SIZE parameter in
the H2 JDBC connection URL, as described
link:http://www.h2database.com/html/features.html#cache_settings[here]
See <<database.h2.cachesize,database.h2.cachesize>> for a detailed discussion.
+
Gerrit uses H2 for storing reviewed flags on changes and for persistent
caches. The configured cache size is used for each of these local H2
databases.
+
Default is unset, no cache size limit.
Default is unset, using up to half of the available memory.
H2 will persist this value in the database, so to unset explicitly specify 0.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
[[cache.h2AutoServer]]cache.h2AutoServer::
+
If set to true, enable H2 autoserver mode for the H2-backed persistent cache
databases.
+
See link:http://www.h2database.com/html/features.html#auto_mixed_mode[here]
for detail.
+
Default is false.
[[cache.name.maxAge]]cache.<name>.maxAge::
+
Maximum age to keep an entry in the cache. Entries are removed from
@ -1542,6 +1549,42 @@ This class must have default constructor and be available on Gerrit's bootstrap
classpath, e. g. in `$gerrit_site/lib` directory. Example implementation of
SQL monitoring can be found in javamelody-plugin.
[[database.h2]]database.h2::
+
The settings in this section are used for the reviewdb if the
<<database.type,database.type>> is H2.
+
Additionally gerrit uses H2 for storing reviewed flags on changes.
[[database.h2.cacheSize]]database.h2.cacheSize::
+
The size of the H2 internal database cache, in bytes. The H2 internal cache for
persistent H2-backed caches is controlled by
<<cache.h2CacheSize,cache.h2CacheSize>>.
+
H2 uses memory to cache its database content. The parameter `cacheSize`
allows to limit the memory used by H2 and thus prevent out-of-memory
caused by the H2 database using too much memory.
+
Technically the H2 cache size is configured using the CACHE_SIZE parameter in
the H2 JDBC connection URL, as described
link:http://www.h2database.com/html/features.html#cache_settings[here]
+
Default is unset, using up to half of the available memory.
H2 will persist this value in the database, so to unset explicitly specify 0.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
[[database.h2.autoServer]]database.h2.autoServer::
+
If `true` enable the automatic mixed mode
(see link:http://www.h2database.com/html/features.html#auto_mixed_mode[Automatic Mixed Mode]).
This enables concurrent access to the embedded H2 database from command line
utils (e.g. RebuildNoteDb).
+
Default is `false`.
[[download]]
=== Section download

View File

@ -60,6 +60,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
private final ExecutorService executor;
private final ScheduledExecutorService cleanup;
private final long h2CacheSize;
private final boolean h2AutoServer;
@Inject
H2CacheFactory(
@ -71,6 +72,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
config = cfg;
cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
h2CacheSize = cfg.getLong("cache", null, "h2CacheSize", -1);
h2AutoServer = cfg.getBoolean("cache", null, "h2AutoServer", false);
caches = new LinkedList<>();
this.cacheMap = cacheMap;
@ -230,6 +232,9 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
// H2 CACHE_SIZE is always given in KB
url.append(h2CacheSize / 1024);
}
if (h2AutoServer) {
url.append(";AUTO_SERVER=TRUE");
}
return new SqlStore<>(url.toString(), keyType, maxSize,
expireAfterWrite == null ? 0 : expireAfterWrite.longValue());
}

View File

@ -40,7 +40,7 @@ class H2 extends BaseDataSourceType {
if (database == null || database.isEmpty()) {
database = "db/ReviewDB";
}
return createUrl(site.resolve(database));
return appendUrlOptions(cfg, createUrl(site.resolve(database)));
}
public static String createUrl(Path path) {
@ -50,16 +50,20 @@ class H2 extends BaseDataSourceType {
.toString();
}
public static String appendCacheSize(Config cfg, String url) {
long h2CacheSize = cfg.getLong("cache", null, "h2CacheSize", -1);
public static String appendUrlOptions(Config cfg, String url) {
long h2CacheSize = cfg.getLong("database", "h2", "cacheSize", -1);
boolean h2AutoServer = cfg.getBoolean("database", "h2", "autoServer", false);
StringBuilder urlBuilder = new StringBuilder().append(url);
if (h2CacheSize >= 0) {
// H2 CACHE_SIZE is always given in KB
return new StringBuilder()
.append(url)
.append(";CACHE_SIZE=")
.append(h2CacheSize / 1024)
.toString();
urlBuilder.append(";CACHE_SIZE=")
.append(h2CacheSize / 1024);
}
return url;
if (h2AutoServer) {
urlBuilder.append(";AUTO_SERVER=TRUE");
}
return urlBuilder.toString();
}
}

View File

@ -75,7 +75,7 @@ public class H2AccountPatchReviewStore
@Inject
H2AccountPatchReviewStore(@GerritServerConfig Config cfg,
SitePaths sitePaths) {
this.url = H2.appendCacheSize(cfg, getUrl(sitePaths));
this.url = H2.appendUrlOptions(cfg, getUrl(sitePaths));
}
public static String getUrl(SitePaths sitePaths) {