This is an automated email from the ASF dual-hosted git repository.
hanicz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 098ad0d41 KNOX-3252: Handle duplicate object exception during postgres
table creation race condition (#1146)
098ad0d41 is described below
commit 098ad0d41e65c77d7e79344b182a9865e5e67485
Author: hanicz <[email protected]>
AuthorDate: Fri Feb 13 16:38:01 2026 +0100
KNOX-3252: Handle duplicate object exception during postgres table creation
race condition (#1146)
---
.../java/org/apache/knox/gateway/GatewayMessages.java | 3 +++
.../services/token/impl/TokenStateDatabase.java | 19 +++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git
a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
index 7e8240879..1942c1a3e 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
@@ -825,4 +825,7 @@ public interface GatewayMessages {
@Message(level = MessageLevel.ERROR, text = "LDAP service not found or not
properly registered")
void ldapServiceNotFound();
+
+ @Message( level = MessageLevel.WARN, text = "Postgres type already exists
exception caught. Tables already exist skipping creation." )
+ void typeAlreadyExistsCaught();
}
diff --git
a/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/TokenStateDatabase.java
b/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/TokenStateDatabase.java
index dbc89d695..4f5ec8604 100644
---
a/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/TokenStateDatabase.java
+++
b/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/TokenStateDatabase.java
@@ -18,10 +18,13 @@
package org.apache.knox.gateway.services.token.impl;
import org.apache.commons.codec.binary.Base64;
+import org.apache.knox.gateway.GatewayMessages;
import org.apache.knox.gateway.database.DatabaseType;
import org.apache.knox.gateway.database.JDBCUtils;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.token.KnoxToken;
import org.apache.knox.gateway.services.security.token.TokenMetadata;
+import org.postgresql.util.PSQLException;
import javax.sql.DataSource;
import java.sql.Connection;
@@ -38,6 +41,9 @@ import java.util.Set;
import static java.nio.charset.StandardCharsets.UTF_8;
public class TokenStateDatabase {
+
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+
static final String TOKENS_TABLE_NAME = "KNOX_TOKENS";
static final String TOKEN_METADATA_TABLE_NAME = "KNOX_TOKEN_METADATA";
private static final String ADD_TOKEN_SQL = "INSERT INTO " +
TOKENS_TABLE_NAME + "(token_id, issue_time, expiration, max_lifetime) VALUES(?,
?, ?, ?)";
@@ -60,11 +66,20 @@ public class TokenStateDatabase {
private final DataSource dataSource;
+ private static final String POSTGRES_DUPLICATE_OBJECT_STATE = "42710";
+
TokenStateDatabase(DataSource dataSource, String dbType) throws Exception {
this.dataSource = dataSource;
DatabaseType databaseType = DatabaseType.fromString(dbType);
- createTableIfNotExists(TOKENS_TABLE_NAME, databaseType.tokensTableSql());
- createTableIfNotExists(TOKEN_METADATA_TABLE_NAME,
databaseType.metadataTableSql());
+ try {
+ createTableIfNotExists(TOKENS_TABLE_NAME, databaseType.tokensTableSql());
+ createTableIfNotExists(TOKEN_METADATA_TABLE_NAME,
databaseType.metadataTableSql());
+ } catch (PSQLException psqlException) {
+ if
(!psqlException.getSQLState().equals(POSTGRES_DUPLICATE_OBJECT_STATE)) {
+ throw psqlException;
+ }
+ LOG.typeAlreadyExistsCaught();
+ }
}
private void createTableIfNotExists(String tableName, String
createSqlFileName) throws Exception {