Uploaded image for project: 'FishEye'
  1. FishEye
  2. FE-6465

Active object race condition in DB migration/restore (potentially to Oracle only)

    XMLWordPrintable

Details

    Description

      In com.atlassian.crucible.actions.admin.database.DBEditHelper#migrateToDB we start Active Objects in changeDB(). This eventually causes AO writing to the DB and creating tables/sequences should these not exist (in net.java.ao.EntityManager#migrate). Then we start restoring the backup.

      There is a race between the DB restore and AO starting. If AO creates an AO_* sequence by the time we try to restore it from the backup, we fail with the following message:

      2016-04-06 12:21:11,880 INFO  [ThreadPool1 ] fisheye DefaultDBControl-stop - Shutdown in progress...
      2016-04-06 12:21:11,888 INFO  [ThreadPool1 ] fisheye DefaultDBControl-start - Starting database...
      2016-04-06 12:21:11,924 DEBUG [ThreadPool1 ] fisheye HibernateUtil-setUp - Configuring db pools with (min/max connections): main(5,17), retriable(3,3).
      2016-04-06 12:21:12,112 INFO  [ThreadPool1 ] fisheye Config-setUpStatementTracking - BoneCP - tracking statements enabled for pool [mainPool]
      2016-04-06 12:21:12,688 INFO  [ThreadPool1 ] fisheye Config-setUpStatementTracking - BoneCP - tracking statements enabled for pool [retriablePool]
      2016-04-06 12:21:13,155 INFO  [ThreadPool1 ] fisheye DefaultDBControl-start - Database started.
      2016-04-06 12:21:17,051 ERROR [ThreadPool1 ] fisheye DBEditHelper-migrateToDB - Database migration failed
      com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with plugin Atlassian Navigation Links Plugin(com.atlassian.plugins.atlassian-nav-links-plugin) #3.3.21 (table AO_38321B_CUSTOM_CONTENT_LINK):Error executing update for SQL statement 'CREATE SEQUENCE "AO_38321B_CUSTOM_CO518521787" INCREMENT BY 1 START WITH 1 NOMAXVALUE MINVALUE 1'
      	at com.atlassian.activeobjects.backup.ImportExportErrorServiceImpl.newImportExportSqlException(ImportExportErrorServiceImpl.java:26) [?:?]
      	at com.atlassian.activeobjects.backup.SqlUtils.onSqlException(SqlUtils.java:46) [?:?]
      	at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:37) [?:?]
      	at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:73) [?:?]
      	at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:57) [?:?]
      	at com.atlassian.dbexporter.importer.TableDefinitionImporter.doImportNode(TableDefinitionImporter.java:50) [?:?]
      	at com.atlassian.dbexporter.importer.AbstractImporter.importNode(AbstractImporter.java:44) [?:?]
      	at com.atlassian.dbexporter.DbImporter.importData(DbImporter.java:69) [?:?]
      	at com.atlassian.activeobjects.backup.ActiveObjectsBackup.restore(ActiveObjectsBackup.java:151) [?:?]
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [?:1.8.0_60]
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [?:1.8.0_60]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [?:1.8.0_60]
      	at java.lang.reflect.Method.invoke(Method.java:497) [?:1.8.0_60]
      	at com.atlassian.applinks.host.OsgiServiceProxyFactory$DynamicServiceInvocationHandler.invoke(OsgiServiceProxyFactory.java:110) [applinks-host-5.1.0.jar:?]
      	at com.sun.proxy.$Proxy137.restore(Unknown Source) [?:?]
      	at com.atlassian.crucible.actions.admin.database.DBEditHelper.migrateToDB(DBEditHelper.java:339) [fisheye.jar:?]
      	at com.atlassian.crucible.actions.admin.database.MigrateDatabaseAction$AsynchronousMigrater.migrateToDB(MigrateDatabaseAction.java:83) [fisheye.jar:?]
      	at com.atlassian.crucible.actions.admin.database.MigrateDatabaseAction$1$1.perform(MigrateDatabaseAction.java:141) [fisheye.jar:?]
      	at com.atlassian.crucible.actions.admin.database.MigrateDatabaseAction$1$1.perform(MigrateDatabaseAction.java:139) [fisheye.jar:?]
      	at com.atlassian.crucible.maintenance.MaintenanceManager.doMaintenance(MaintenanceManager.java:111) [fisheye.jar:?]
      	at com.atlassian.crucible.actions.admin.database.MigrateDatabaseAction$1.run(MigrateDatabaseAction.java:139) [fisheye.jar:?]
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_60]
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_60]
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_60]
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_60]
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_60]
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_60]
      	at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
      Caused by: java.sql.SQLSyntaxErrorException: ORA-00955: name is already used by an existing object
          
      	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:30) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:931) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1150) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1707) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1670) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:310) [ojdbc7-12cR1.jar:12.1.0.2.0]
      	at com.jolbox.bonecp.StatementHandle.executeUpdate(StatementHandle.java:536) [bonecp-0.7.1.RELEASE.jar:0.7.1.RELEASE]
      	at sun.reflect.GeneratedMethodAccessor437.invoke(Unknown Source) [?:?]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [?:1.8.0_60]
      	at java.lang.reflect.Method.invoke(Method.java:497) [?:1.8.0_60]
      	at com.cenqua.crucible.hibernate.trackingstatements.TrackingStatementFactory$1.handleInvocation(TrackingStatementFactory.java:25) [fisheye.jar:?]
      	at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87) [guava-18.0.jar:?]
      	at com.sun.proxy.$Proxy901.executeUpdate(Unknown Source) [?:?]
      	at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:34) [?:?]
      	... 25 more
      

      This is potentially only related to the Oracle DB, where sequences are created immediately with tables. Threads taking part in the race are ThreadPool1 and active-objects-init-compatibility-tenant-0.

      This affects not only migration, but also restore from a backup file.

      Workaround

      If this occurs, the non ActiveObjects data is migrated already, and FishEye is already switched to using the DB. The user can manually finish the migration, by stopping the instance, and copying over the AO_* tables if needed.

      Attachments

        Issue Links

          Activity

            People

              kcichy Kamil Cichy
              kcichy Kamil Cichy
              Votes:
              3 Vote for this issue
              Watchers:
              8 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: