Race condition on concurrent deployment with license-key

XMLWordPrintable

    • Type: Bug Report
    • Resolution: Unresolved
    • Priority: L3 - Default
    • None
    • Affects Version/s: None
    • Component/s: None
    • Environment:
      Camunda BPM 7.12.5-ee
      OpenJDK 11
      spring-boot 2.2.5

      Steps to reproduce

      1. Setup a Camunda Spring Boot Starter project
      2. Place a license file camunda-license.txt in the project so that Camunda automatically inserts the license into the DB when the application starts
      3. Build the project
      4. Start the application twice at the same time
      5. Concurrent deployment of the applications on 2 servers

      Expected behavior

      • Both instances of the applications start successfully.
      • The license key is persisted.

      Observed behavior

      • One application instance fails with SqlIntegrityConstraintViolationException:
        [SM002] [ERROR] [2020-06-16 06:35:00,451] [] [] [org.camunda.bpm.engine.context] [] [] [] [] [] ENGINE-16004 Exception while closing command context: ENGINE-03083 Unexpected exception while executing database operations with message '
        ### Error flushing statements.  Cause: java.sql.SQLException: null; SQL [[jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        sql=insert into PROZESSE.ACT_GE_PROPERTY (
                NAME_,
                VALUE_,
                REV_
              ) values (
                'camunda-license-key-id',
                'bd405993-af8a-11ea-94c1-005056a140dc',
                1
              )
        com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        State: null Errorcode: -4229
        Nachfolgend die Messages aller auslösenden Exceptions, und zwar sowohl 'Caused Exceptions
        als auch 'next Exceptions' bei SQLExceptions. Dies dient zur übersichtlichen Darstellung der
        Exception-Hierarchie und zur schnelleren Information bei verschachtelten SQLExceptions.
        -------------------------- Start der gesammelten Exception-Messages ------------------
          Next Exception: 
          com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #1: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;PROZESSE.ACT_GE_PROPERTY, DRIVER=4.23.42
          State: 23505 Errorcode: -803
        -------------------------- Ende der gesammelten Exception-Messages -------------------
        ]; [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        ### Cause: java.sql.SQLException: null; SQL [[jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        sql=insert into PROZESSE.ACT_GE_PROPERTY (
                NAME_,
                VALUE_,
                REV_
              ) values (
                'camunda-license-key-id',
                'bd405993-af8a-11ea-94c1-005056a140dc',
                1
              )
        com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        State: null Errorcode: -4229
        Nachfolgend die Messages aller auslösenden Exceptions, und zwar sowohl 'Caused Exceptions
        als auch 'next Exceptions' bei SQLExceptions. Dies dient zur übersichtlichen Darstellung der
        Exception-Hierarchie und zur schnelleren Information bei verschachtelten SQLExceptions.
        -------------------------- Start der gesammelten Exception-Messages ------------------
          Next Exception: 
          com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #1: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;PROZESSE.ACT_GE_PROPERTY, DRIVER=4.23.42
          State: 23505 Errorcode: -803
        -------------------------- Ende der gesammelten Exception-Messages -------------------
        ]; [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null'. Flush summary: 
         [
          INSERT PropertyEntity[camunda-license-key-id]
          INSERT ResourceEntity[bd405993-af8a-11ea-94c1-005056a140dc]
        ]
        org.camunda.bpm.engine.ProcessEngineException: ENGINE-03083 Unexpected exception while executing database operations with message '
        ### Error flushing statements.  Cause: java.sql.SQLException: null; SQL [[jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        sql=insert into PROZESSE.ACT_GE_PROPERTY (
                NAME_,
                VALUE_,
                REV_
              ) values (
                'camunda-license-key-id',
                'bd405993-af8a-11ea-94c1-005056a140dc',
                1
              )
        com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        State: null Errorcode: -4229
        Nachfolgend die Messages aller auslösenden Exceptions, und zwar sowohl 'Caused Exceptions
        als auch 'next Exceptions' bei SQLExceptions. Dies dient zur übersichtlichen Darstellung der
        Exception-Hierarchie und zur schnelleren Information bei verschachtelten SQLExceptions.
        -------------------------- Start der gesammelten Exception-Messages ------------------
          Next Exception: 
          com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #1: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;PROZESSE.ACT_GE_PROPERTY, DRIVER=4.23.42
          State: 23505 Errorcode: -803
        -------------------------- Ende der gesammelten Exception-Messages -------------------
        ]; [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        ### Cause: java.sql.SQLException: null; SQL [[jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        sql=insert into PROZESSE.ACT_GE_PROPERTY (
                NAME_,
                VALUE_,
                REV_
              ) values (
                'camunda-license-key-id',
                'bd405993-af8a-11ea-94c1-005056a140dc',
                1
              )
        com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
        State: null Errorcode: -4229
        Nachfolgend die Messages aller auslösenden Exceptions, und zwar sowohl 'Caused Exceptions
        als auch 'next Exceptions' bei SQLExceptions. Dies dient zur übersichtlichen Darstellung der
        Exception-Hierarchie und zur schnelleren Information bei verschachtelten SQLExceptions.
        -------------------------- Start der gesammelten Exception-Messages ------------------
          Next Exception: 
          com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #1: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;PROZESSE.ACT_GE_PROPERTY, DRIVER=4.23.42
          State: 23505 Errorcode: -803
        -------------------------- Ende der gesammelten Exception-Messages -------------------
        ]; [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.23.42] Batchfehler.  Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
        Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null'. Flush summary: 
         [
          INSERT PropertyEntity[camunda-license-key-id]
          INSERT ResourceEntity[bd405993-af8a-11ea-94c1-005056a140dc]
        ]
          at org.camunda.bpm.engine.impl.db.EnginePersistenceLogger.flushDbOperationsException(EnginePersistenceLogger.java:693)
          at org.camunda.bpm.engine.impl.db.entitymanager.DbEntityManager.flushDbOperations(DbEntityManager.java:341)
          at org.camunda.bpm.engine.impl.db.entitymanager.DbEntityManager.flushDbOperationManager(DbEntityManager.java:322)
          at org.camunda.bpm.engine.impl.db.entitymanager.DbEntityManager.flush(DbEntityManager.java:294)
          at org.camunda.bpm.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:263)
          at org.camunda.bpm.engine.impl.interceptor.CommandContext.close(CommandContext.java:186)
          at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:119)
          at org.camunda.bpm.engine.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:46)
          at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
          at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:44)
          at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:70)
          at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)
          at org.camunda.bpm.spring.boot.starter.configuration.impl.custom.EnterLicenseKeyConfiguration.postProcessEngineBuild(EnterLicenseKeyConfiguration.java:71)
          at org.camunda.bpm.engine.impl.cfg.CompositeProcessEnginePlugin.postProcessEngineBuild(CompositeProcessEnginePlugin.java:107)
          at org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl.invokePostProcessEngineBuild(ProcessEngineConfigurationImpl.java:1080)
          at org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:816)
          at org.camunda.bpm.engine.spring.SpringTransactionsProcessEngineConfiguration.buildProcessEngine(SpringTransactionsProcessEngineConfiguration.java:63)
          ...
        

      Hint:

      • The class EnterLicenseKeyConfiguration does not synchronize when inserting the license key

            Assignee:
            Unassigned
            Reporter:
            Michal Dytko
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: