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 {

Reply via email to