GUACAMOLE-919: Merge implement PostgreSQL defaultStatementTimeout and socketTimeout

This commit is contained in:
Virtually Nick
2020-07-29 08:17:02 -04:00
committed by GitHub
4 changed files with 101 additions and 0 deletions

View File

@@ -70,6 +70,15 @@ public class PostgreSQLAuthenticationProviderModule implements Module {
myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true");
myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1");
// Only set if > 0. Underlying backend does not take 0 as not-set.
int defaultStatementTimeout = environment.getPostgreSQLDefaultStatementTimeout();
if (defaultStatementTimeout > 0) {
myBatisProperties.setProperty(
"mybatis.configuration.defaultStatementTimeout",
String.valueOf(defaultStatementTimeout)
);
}
// Use UTF-8 in database
driverProperties.setProperty("characterEncoding", "UTF-8");
@@ -110,6 +119,12 @@ public class PostgreSQLAuthenticationProviderModule implements Module {
}
// Handle case where TCP connection to database is silently dropped
driverProperties.setProperty(
"socketTimeout",
String.valueOf(environment.getPostgreSQLSocketTimeout())
);
}
@Override

View File

@@ -48,6 +48,19 @@ public class PostgreSQLEnvironment extends JDBCEnvironment {
*/
private static final int DEFAULT_PORT = 5432;
/**
* The default number of seconds the driver will wait for a response from
* the database, before aborting the query.
* A value of 0 (the default) means the timeout is disabled.
*/
private static final int DEFAULT_STATEMENT_TIMEOUT = 0;
/**
* The default number of seconds to wait for socket read operations.
* A value of 0 (the default) means the timeout is disabled.
*/
private static final int DEFAULT_SOCKET_TIMEOUT = 0;
/**
* Whether a database user account is required by default for authentication
* to succeed.
@@ -249,6 +262,41 @@ public class PostgreSQLEnvironment extends JDBCEnvironment {
public String getPostgreSQLPassword() throws GuacamoleException {
return getRequiredProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_PASSWORD);
}
/**
* Returns the defaultStatementTimeout set for PostgreSQL connections.
* If unspecified, this will default to 0,
* and should not be passed through to the backend.
*
* @return
* The statement timeout (in seconds)
*
* @throws GuacamoleException
* If an error occurs while retrieving the property value.
*/
public int getPostgreSQLDefaultStatementTimeout() throws GuacamoleException {
return getProperty(
PostgreSQLGuacamoleProperties.POSTGRESQL_DEFAULT_STATEMENT_TIMEOUT,
DEFAULT_STATEMENT_TIMEOUT
);
}
/**
* Returns the socketTimeout property to set on PostgreSQL connections.
* If unspecified, this will default to 0 (no timeout)
*
* @return
* The socketTimeout to use when waiting on read operations (in seconds)
*
* @throws GuacamoleException
* If an error occurs while retrieving the property value.
*/
public int getPostgreSQLSocketTimeout() throws GuacamoleException {
return getProperty(
PostgreSQLGuacamoleProperties.POSTGRESQL_SOCKET_TIMEOUT,
DEFAULT_SOCKET_TIMEOUT
);
}
@Override
public boolean isRecursiveQuerySupported(SqlSession session) {

View File

@@ -94,6 +94,36 @@ public class PostgreSQLGuacamoleProperties {
};
/**
* The number of seconds the driver will wait for a response from
* the database, before aborting the query.
* A value of 0 (the default) means the timeout is disabled.
*/
public static final IntegerGuacamoleProperty
POSTGRESQL_DEFAULT_STATEMENT_TIMEOUT = new IntegerGuacamoleProperty() {
@Override
public String getName() { return "postgresql-default-statement-timeout"; }
};
/**
* The number of seconds to wait for socket read operations.
* If reading from the server takes longer than this value, the
* connection will be closed. This can be used to handle network problems
* such as a dropped connection to the database. Similar to
* postgresql-default-statement-timeout, it will have the effect of
* aborting queries that take too long.
* A value of 0 (the default) means the timeout is disabled.
*/
public static final IntegerGuacamoleProperty
POSTGRESQL_SOCKET_TIMEOUT = new IntegerGuacamoleProperty() {
@Override
public String getName() { return "postgresql-socket-timeout"; }
};
/**
* Whether a user account within the database is required for authentication
* to succeed, even if the user has been authenticated via another