Description
Issue Summary
This is reproducible on Data Center: (yes)
Crowd 5.2 is supporting the datasource type of database configuration as it is displayed on a newly installed 5.2.1 instance.
There is no mention of depreciation of the datasource configuration in the Release Notes either.
While upgrading Crowd which is configured with datasource, to the 5.2.x version it gave an error on one of the upgrade tasks and caused upgrade failure.
Steps to Reproduce
- Spin up a Crowd with a version lower than 5.2 and integrate it with the database using a datasource connection.
- Try to upgrade Crowd to the 5.2.x version. (I used 5.2.1 in my test, as it is the latest version released)
Expected Results
Crowd upgraded successfully.
Actual Results
Upgrade gets failed and the below message is shown in the UI:
The below exception is thrown in the atlassian-crowd.log file:
2023-11-30 15:29:47,430 main INFO [crowd.manager.upgrade.UpgradeManagerImpl] Upgrading Crowd to version: 5.2.1 (Build:#1942 - 2023-11-13) 2023-11-30 15:29:47,432 main INFO [crowd.manager.upgrade.UpgradeManagerImpl] Running upgrade task for build - 1939: Adds default User Added notification email template if no such template is present 2023-11-30 15:29:47,563 main INFO [crowd.manager.upgrade.UpgradeManagerImpl] Running upgrade task for build - 1940: Migrates HSQL related configuration properties (if used) to be compatible with HSQL 2.x 2023-11-30 15:29:47,566 main ERROR [crowd.manager.upgrade.UpgradeManagerImpl] java.lang.NullPointerException java.lang.RuntimeException: java.lang.NullPointerException at com.atlassian.crowd.manager.upgrade.UpgradeManagerImpl.lambda$doUpgrade$0(UpgradeManagerImpl.java:129) ~[crowd-server-5.2.1.jar:?] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.3.28.jar:5.3.28] at com.atlassian.crowd.manager.upgrade.UpgradeManagerImpl.doUpgrade(UpgradeManagerImpl.java:124) ~[crowd-server-5.2.1.jar:?] at com.atlassian.crowd.console.listener.StartupListener.migrateAndUpgradeCrowd(StartupListener.java:231) ~[classes/:?] at com.atlassian.crowd.console.listener.StartupListener.checkLicenseAndPerformUpgrade(StartupListener.java:132) ~[classes/:?] at com.atlassian.crowd.console.listener.StartupListener.contextInitialized(StartupListener.java:74) ~[classes/:?] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4462) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4914) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ~[catalina.jar:9.0.82] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) ~[catalina.jar:9.0.82] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:661) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:689) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1888) ~[catalina.jar:9.0.82] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?] at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-util.jar:9.0.82] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) ~[?:?] at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:582) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:472) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1617) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345) ~[catalina.jar:9.0.82] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:794) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ~[catalina.jar:9.0.82] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) ~[catalina.jar:9.0.82] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) ~[catalina.jar:9.0.82] at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-util.jar:9.0.82] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[?:?] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:248) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ~[catalina.jar:9.0.82] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:921) ~[catalina.jar:9.0.82] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) ~[catalina.jar:9.0.82] at org.apache.catalina.startup.Catalina.start(Catalina.java:772) ~[catalina.jar:9.0.82] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) ~[bootstrap.jar:9.0.82] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) ~[bootstrap.jar:9.0.82] Caused by: java.lang.NullPointerException at com.atlassian.crowd.upgrade.tasks.UpgradeTask1940UpdateHsqlHibernateProperties.isHsqlJdbcUrl(UpgradeTask1940UpdateHsqlHibernateProperties.java:71) ~[crowd-server-5.2.1.jar:?] at com.atlassian.crowd.upgrade.tasks.UpgradeTask1940UpdateHsqlHibernateProperties.upgradeHibernateConnectionUrl(UpgradeTask1940UpdateHsqlHibernateProperties.java:64) ~[crowd-server-5.2.1.jar:?] at com.atlassian.crowd.upgrade.tasks.UpgradeTask1940UpdateHsqlHibernateProperties.doUpgrade(UpgradeTask1940UpdateHsqlHibernateProperties.java:42) ~[crowd-server-5.2.1.jar:?] at com.atlassian.crowd.manager.upgrade.UpgradeManagerImpl.lambda$doUpgrade$0(UpgradeManagerImpl.java:126) ~[crowd-server-5.2.1.jar:?] ... 46 more [...] 2023-11-30 15:29:47,604 main ERROR [crowd.console.listener.StartupListener] Errors experienced during the Crowd upgrade process: [Upgrade task for build 1940 failed with exception: java.lang.NullPointerException] [...] 2023-11-30 15:29:47,608 main ERROR [crowd.console.listener.StartupListener] Stopping Crowd startup due to earlier errors
Workaround
Changing the datasource type connection to the JDBC type connection solves the issue and unlocks the upgrade. After the upgrade gets finished and the Crowd gets back to its up-and-running state, you can stop the instance and revert back to datasource based on your preference.