[ 
https://issues.apache.org/jira/browse/KNOX-3252?focusedWorklogId=1005086&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-1005086
 ]

ASF GitHub Bot logged work on KNOX-3252:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 13/Feb/26 14:10
            Start Date: 13/Feb/26 14:10
    Worklog Time Spent: 10m 
      Work Description: hanicz opened a new pull request, #1146:
URL: https://github.com/apache/knox/pull/1146

   …eation race condition
   
   [KNOX-3252](https://issues.apache.org/jira/browse/KNOX-3252) - Intermittent 
Postgres type already exists exception
   
   ## What changes were proposed in this pull request?
   
   The issue is a race condition during table creation when multiple Knox 
instances are starting up simultaneously. At the initial "isTableExists" check 
the tables are not yet created. So Knox-instance-0 and Knox-instance-1 will 
both go ahead with the creation. Postgres will create a record in pg_class and 
pg_type as well. However the process that gets there later will get the 
exception due to the record that was created by the other process in pg_type. 
   
   `2026-02-10 21:19:44,825  ERROR knox.gateway 
(TokenStateServiceFactory.java:createService(63)) - Error while initiatalizing 
org.apache.knox.gateway.services.token.impl.JDBCTokenStateService: Error while 
initiating JDBCTokenStateService: org.postgresql.util.PSQLException: ERROR: 
type "knox_tokens" already exists`
   
   This change catches the duplicate object SQL state and skips the table 
creation.
   
   ## How was this patch tested?
   
   Manually tested with a local setup. I had postgres running in docker desktop 
and a local Knox instance.
   
   ```
       <property>
           <name>gateway.service.tokenstate.impl</name>
           
<value>org.apache.knox.gateway.services.token.impl.JDBCTokenStateService</value>
       </property>
       <property>
           <name>gateway.database.type</name>
           <value>postgresql</value>
       </property>
       <property>
           <name>gateway.database.port</name>
           <value>5432</value>
       </property>
       <property>
           <name>gateway.database.host</name>
           <value>localhost</value>
       </property>
       <property>
           <name>gateway.database.name</name>
           <value>mydb</value>
       </property>
   ```
   
   I created the below type in the Knox DB to simulate the race condition
   
   `CREATE TYPE knox_tokens AS ENUM ('active', 'expired', 'revoked');`
   
   ## Integration Tests
   N/A
   
   ## UI changes
   N/A
   




Issue Time Tracking
-------------------

            Worklog Id:     (was: 1005086)
    Remaining Estimate: 0h
            Time Spent: 10m

> Intermittent Postgres type already exists exception
> ---------------------------------------------------
>
>                 Key: KNOX-3252
>                 URL: https://issues.apache.org/jira/browse/KNOX-3252
>             Project: Apache Knox
>          Issue Type: Bug
>          Components: Server
>    Affects Versions: 2.1.0
>            Reporter: Tamás Hanicz
>            Assignee: Tamás Hanicz
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> The issue is a race condition during table creation when multiple Knox 
> instances are starting up simultaneously. At the initial "isTableExists" 
> check the tables are not yet created. So Knox-instance-0 and Knox-instance-1 
> will both go ahead with the creation. Postgres will create a record in 
> pg_class and pg_type as well. However the process that gets there later will 
> get the exception due to the record that was created by the other process in 
> pg_type.
> I was able to reproduce it locally. I started up a local Knox instance and I 
> had a Postgres db running on my docker desktop. I added a breakpoint to the 
> table creation and created a new type called "knox_tokens" manually.
> {code:java}
> CREATE TYPE knox_tokens AS ENUM ('active', 'expired', 'revoked');{code}
> After this proceeding with the Knox process I got the exception. Solution is 
> catching this exception validating the SQL state and skip table creation 
> entirely in that Knox instance.
> {code:java}
> 2026-02-10 21:19:44,825  ERROR knox.gateway 
> (TokenStateServiceFactory.java:createService(63)) - Error while 
> initiatalizing 
> org.apache.knox.gateway.services.token.impl.JDBCTokenStateService: Error 
> while initiating JDBCTokenStateService: org.postgresql.util.PSQLException: 
> ERROR: type "knox_tokens" already exists{code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to