-
Bug
-
Resolution: Unresolved
-
Highest
-
None
-
9.2.9
-
Severity 2 - Major
-
Version info
- Upgrading to Confluence 9.2.9 from any prior version
Description
Issue Summary
When upgrading to Confluence 9.2.9, if the SMTP mail server configuration in Bandana includes the lastSuccessful field, the upgrade will fail with the error message "Deep copy failed for mail server config", preventing Confluence from starting.
Steps to Reproduce
- Install Confluence version X (e.g., 8.5.x).
- Run the following against Confluence's database:
INSERT INTO bandana (bandanaid, bandanacontext, bandanakey, bandanavalue) VALUES ( 9076763, '_GLOBAL', 'atlassian.confluence.smtp.mail.accounts', '<linked-hash-map> <entry> <long>1705372565455</long> <com.atlassian.confluence.jmx.JmxSMTPMailServer serialization="custom"> <com.atlassian.mail.server.AbstractMailServer> <default> <connectionTimeout>10000</connectionTimeout> <debug>false</debug> <isAuthenticating>true</isAuthenticating> <timeout>10000</timeout> <tlsRequired>false</tlsRequired> <hostname>localhost</hostname> <id>1705372565455</id> <mailProtocol>SMTP</mailProtocol> <name>localhost</name> <password>password123</password> <port>25</port> <props> <property name="mail.debug" value="false"/> <property name="mail.transport.protocol" value="smtp"/> <property name="mail.smtp.port" value="25"/> <property name="mail.smtp.quitwait" value="false"/> <property name="mail.smtp.timeout" value="10000"/> <property name="mail.smtp.auth" value="true"/> <property name="mail.smtp.host" value="localhost"/> <property name="mail.smtp.connectiontimeout" value="10000"/> </props> <username>admin@localhost.local</username> </default> </com.atlassian.mail.server.AbstractMailServer> <com.atlassian.mail.server.impl.SMTPMailServerImpl> <default> <isSessionServer>false</isSessionServer> <removePrecedence>false</removePrecedence> <tlsHostnameCheckRequired>true</tlsHostnameCheckRequired> <defaultFrom>admin@localhost.local</defaultFrom> <prefix>Confluenceserver</prefix> </default> </com.atlassian.mail.server.impl.SMTPMailServerImpl> <com.atlassian.confluence.jmx.JmxSMTPMailServer> <default> <emailsAttempted> <value>1541</value> </emailsAttempted> <emailsSent> <value>1</value> </emailsSent> <fromName>Confluence</fromName> <lastSuccessful>2024-01-23 06:49:13.18 UTC</lastSuccessful> </default> </com.atlassian.confluence.jmx.JmxSMTPMailServer> </com.atlassian.confluence.jmx.JmxSMTPMailServer> </entry> </linked-hash-map>' );
- Upgrade Confluence to version 9.2.9
Expected Results
Confluence upgrades successfully to version 9.2.9 without errors (and starts up as expected).
Actual Results
Confluence fails to start after the upgrade with the below error:
atlassian-confluence.log
2025-10-27 12:40:28,034 ERROR [Catalina-utility-1] [atlassian.confluence.plugin.PluginFrameworkContextListener] launchUpgrades Upgrade failed, application will not start: java.lang.RuntimeException: Deep copy failed for mail server config. com.atlassian.confluence.upgrade.UpgradeException: java.lang.RuntimeException: Deep copy failed for mail server config. at com.atlassian.confluence.upgrade.impl.DefaultUpgradeFinalizationManager.finalizeIfNeeded(DefaultUpgradeFinalizationManager.java:130) at com.atlassian.confluence.upgrade.impl.DefaultUpgradeFinalizationManager.finalizeIfNeeded(DefaultUpgradeFinalizationManager.java:104) at com.atlassian.confluence.upgrade.impl.DefaultUpgradeManager.finalizeIfNeeded(DefaultUpgradeManager.java:109) at com.atlassian.confluence.upgrade.AbstractUpgradeManager.runAllUpgradeTasks(AbstractUpgradeManager.java:185) at com.atlassian.confluence.upgrade.AbstractUpgradeManager.upgrade(AbstractUpgradeManager.java:140) at com.atlassian.confluence.plugin.PluginFrameworkContextListener.launchUpgrades(PluginFrameworkContextListener.java:127) at com.atlassian.confluence.plugin.PluginFrameworkContextListener.contextInitialized(PluginFrameworkContextListener.java:83) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4057) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4501) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: java.lang.RuntimeException: Deep copy failed for mail server config. at com.atlassian.confluence.mail.MailServerSerializationService.deepCopy(MailServerSerializationService.java:38) at com.atlassian.confluence.mail.ConfluenceMailServerManager.deepCopyUsingSerialisation(ConfluenceMailServerManager.java:381) at com.atlassian.confluence.mail.ConfluenceMailServerManager.saveServerMap(ConfluenceMailServerManager.java:250) at com.atlassian.confluence.upgrade.upgradetask.SecureMailServerSecretUpgradeTask.doUpgrade(SecureMailServerSecretUpgradeTask.java:66) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) at jdk.proxy4/jdk.proxy4.$Proxy294.doUpgrade(Unknown Source) at com.atlassian.confluence.upgrade.impl.DefaultUpgradeFinalizationManager.actionOnUpgradeTask(DefaultUpgradeFinalizationManager.java:156) at com.atlassian.confluence.upgrade.impl.DefaultUpgradeFinalizationManager.finalizeIfNeeded(DefaultUpgradeFinalizationManager.java:122) ... 17 more Caused by: com.atlassian.confluence.impl.util.serialize.exception.DisallowedClassException: Unexpected class in serialized data: java.util.Date at com.atlassian.confluence.impl.util.serialize.SecureClassLoaderAwareObjectInputStream.resolveClass(SecureClassLoaderAwareObjectInputStream.java:30) at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2061) at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1927) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2252) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1762) at java.base/java.io.ObjectInputStream$FieldValues.<init>(ObjectInputStream.java:2618) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2469) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2284) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1762) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:540) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:498) at java.base/java.util.HashMap.readObject(HashMap.java:1560) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1102) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2444) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2284) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1762) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:540) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:498) at com.atlassian.confluence.impl.util.serialize.SecureObjectSerializer.deserialize(SecureObjectSerializer.java:35) at com.atlassian.confluence.mail.MailServerSerializationService.deepCopy(MailServerSerializationService.java:35) ... 32 more
Workaround
- Shut down Confluence
Take a full database backup- Run the following against Confluence's Postgres database:
UPDATE bandana SET bandanavalue = REGEXP_REPLACE( bandanavalue, '<lastSuccessful>[^<]*</lastSuccessful>', '', 'g') WHERE bandanacontext = '_GLOBAL' AND bandanakey = 'atlassian.confluence.smtp.mail.accounts';
- For other databases, work with your DBA to remove the lastSuccessful entry in atlassian.confluence.smtp.mail.accounts:
select * from bandana WHERE BANDANAKEY = 'atlassian.confluence.smtp.mail.accounts';
- For other databases, work with your DBA to remove the lastSuccessful entry in atlassian.confluence.smtp.mail.accounts:
- Start Confluence again