summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHector Oswaldo Caballero <hector.caballero@ericsson.com>2016-11-21 16:00:26 -0500
committerHector Oswaldo Caballero <hector.caballero@ericsson.com>2016-11-25 07:38:31 -0500
commit96bbab3bb2045a758efc36b212bb3e907c748807 (patch)
treea3736fe77ec643758c11dfd5cbb48d87f4bb2695
parent5602a31d8175cfd0e82c50b3eee7adb1879c6411 (diff)
Fix DB connection pool verification
So far, given no validation query was specified, a broken connection could be returned from the connection pool and this caused a 500 error when trying, for example, to read a change from the database. Specify a default validation query that works for several of the DBMS supported by Gerrit (H2, PostgreSQL, MySQL), and specific validation queries for other supported databases (Apache Derby, DB2, Oracle). Validation queries were verified for open source databases (H2, MySQL, PostgreSQL and Derby). Change-Id: Ia215288d70b11893b7d1403611e109a5a951f090
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java6
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java5
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java3
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java2
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java5
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java5
6 files changed, 26 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java
index fd1502d173..bf87ee0670 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
public abstract class BaseDataSourceType implements DataSourceType {
+ private static final String DEFAULT_VALIDATION_QUERY = "select 1";
private final String driver;
protected BaseDataSourceType(String driver) {
@@ -38,6 +39,11 @@ public abstract class BaseDataSourceType implements DataSourceType {
}
@Override
+ public String getValidationQuery() {
+ return DEFAULT_VALIDATION_QUERY;
+ }
+
+ @Override
public ScriptRunner getIndexScript() throws IOException {
return getScriptRunner("index_generic.sql");
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java
index 4ad8e2f107..4f0b63fcd6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java
@@ -43,4 +43,9 @@ public class DB2 extends BaseDataSourceType {
b.append(dbc.required("database"));
return b.toString();
}
+
+ @Override
+ public String getValidationQuery() {
+ return "SELECT 1 FROM SYSIBM.SYSDUMMY1";
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
index 30ebaa72fe..ad6744fff2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
@@ -126,6 +126,9 @@ public class DataSourceProvider implements Provider<DataSource>,
ds.setMaxWait(ConfigUtil.getTimeUnit(cfg, "database", null,
"poolmaxwait", MILLISECONDS.convert(30, SECONDS), MILLISECONDS));
ds.setInitialSize(ds.getMinIdle());
+ ds.setValidationQuery(dst.getValidationQuery());
+ ds.setValidationQueryTimeout(5);
+
return intercept(interceptor, ds);
} else {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java
index ecaaf5e796..2651ee2053 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java
@@ -24,6 +24,8 @@ public interface DataSourceType {
public String getUrl();
+ public String getValidationQuery();
+
public boolean usePool();
/**
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java
index dd300c6ce9..f98e83b57b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java
@@ -41,4 +41,9 @@ class Derby extends BaseDataSourceType {
}
return "jdbc:derby:" + site.resolve(database).toString() + ";create=true";
}
+
+ @Override
+ public String getValidationQuery() {
+ return "values 1";
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java
index bb4c477009..e7d3390874 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java
@@ -43,4 +43,9 @@ public class Oracle extends BaseDataSourceType {
b.append(dbc.required("instance"));
return b.toString();
}
+
+ @Override
+ public String getValidationQuery() {
+ return "select 1 from dual";
+ }
}