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.pingEnabled", "true");
myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1"); 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 // Use UTF-8 in database
driverProperties.setProperty("characterEncoding", "UTF-8"); 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 @Override

View File

@@ -48,6 +48,19 @@ public class PostgreSQLEnvironment extends JDBCEnvironment {
*/ */
private static final int DEFAULT_PORT = 5432; 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 * Whether a database user account is required by default for authentication
* to succeed. * to succeed.
@@ -250,6 +263,41 @@ public class PostgreSQLEnvironment extends JDBCEnvironment {
return getRequiredProperty(PostgreSQLGuacamoleProperties.POSTGRESQL_PASSWORD); 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 @Override
public boolean isRecursiveQuerySupported(SqlSession session) { public boolean isRecursiveQuerySupported(SqlSession session) {
return true; // All versions of PostgreSQL support recursive queries through CTEs return true; // All versions of PostgreSQL support recursive queries through CTEs

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 * Whether a user account within the database is required for authentication
* to succeed, even if the user has been authenticated via another * to succeed, even if the user has been authenticated via another

View File

@@ -354,10 +354,18 @@ END
"postgresql-default-max-group-connections-per-user" \ "postgresql-default-max-group-connections-per-user" \
"$POSTGRES_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER" "$POSTGRES_DEFAULT_MAX_GROUP_CONNECTIONS_PER_USER"
set_optional_property \
"postgresql-default-statement-timeout" \
"$POSTGRES_DEFAULT_STATEMENT_TIMEOUT"
set_optional_property \ set_optional_property \
"postgresql-user-required" \ "postgresql-user-required" \
"$POSTGRES_USER_REQUIRED" "$POSTGRES_USER_REQUIRED"
set_optional_property \
"postgresql-socket-timeout" \
"$POSTGRES_SOCKET_TIMEOUT"
set_optional_property \ set_optional_property \
"postgresql-ssl-mode" \ "postgresql-ssl-mode" \
"$POSTGRESQL_SSL_MODE" "$POSTGRESQL_SSL_MODE"