-
Type:
Bug
-
Resolution: Fixed
-
Priority:
High
-
Affects Version/s: 10.2.14
-
Component/s: Universal Plugin Manager / Manage apps
-
4
-
Severity 2 - Major
-
2
Issue Summary
In Confluence 10, apps and modules enabled status are persisted in PLUGIN_SETTING.
Updating apps in Confluence Administration » Manage Apps in a multi-node Cluster can revert apps and modules back to their default state.
Example:
- Without an entry in PLUGIN_SETTING for namespace=plugin.manager.state.Map:
- Apps revert to Enabled
- Some internal modules such as confluence.macros.html:html-include revert to disabled
Steps to Reproduce
- Install Confluence Data Center with at least 3 nodes (the more nodes, the more likely the issue will occur)
- Install several Apps that are older than the latest (so that the Update button appears). e.g.
- https://marketplace.atlassian.com/download/app/com.gliffy.integration.confluence/9003001007761/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/nl.avisi.confluence.plugins.numberedheadings/300002270/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/de.scandio.confluence.plugins.hideelements-macro/500100100/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/com.onresolve.confluence.groovy.groovyrunner/400300108460/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/com.mxgraph.confluence.plugins.diagramly/1600000100/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/biz.artemissoftware.confluence.multiexcerpt.MultiExcerptMacro/5002003210/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/com.adaptavist.confluence.contentFormattingMacros/900002301/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/com.simplenia.confluence.plugins.polls/400000080/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/de.scandio.confluence.plugins.task-reminder/400000000/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/tableau-plugin/734/DATACENTER/artifact
- https://marketplace.atlassian.com/download/app/de.griffel.confluence.plugins.plant-uml/90202601011/DATACENTER/artifact
- Once installed, disable all the Apps in Manage Apps screen
- Once all the apps are disabled, pick any outdated app (such as Confluence Cloud Migration Assistant) and press Update
- Perform a rolling restart of Confluence
- Check the app status in Confluence Administration » Manage Apps
Expected Results
All the installed third party apps (that were disabled) should remain as disabled
Actual Results
- Once an app is updated, it will broadcast for other nodes to update the app on their local nodes.
- This occurs simultaneously across the cluster, leading to conflicts when nodes read from or write to PLUGIN_SETTING
with random rows inadvertently removed
- This occurs simultaneously across the cluster, leading to conflicts when nodes read from or write to PLUGIN_SETTING
- Random apps are inadvertently re-enabled
- Checking atlassian-confluence.log will show either of these errors:
2026-09-04 06:55:23,766 WARN [nc.confluence.event-1] [confluence.impl.hibernate.ConfluenceHibernateTransactionManager] doCommit Commit failed. Rolling back. Error: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: delete from PLUGIN_SETTING where NAMESPACE=? and SETTING_KEY=? 2026-09-04 06:55:23,772 WARN [nc.confluence.event-1] [confluence.impl.hibernate.ConfluenceHibernateTransactionManager] doRollback Performing rollback. Transactions:\n ->[org.springframework.data.jpa.repository.support.SimpleJpaRepository.deleteById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT (Session #2140378009) 2026-09-04 06:55:23,796 ERROR [nc.confluence.event-1] [confluence.impl.plugin.PluginSettingsPluginStateStore] save Exception when saving plugins state to the database. Saving to in memory state. org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: delete from PLUGIN_SETTING where NAMESPACE=? and SETTING_KEY=? at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:247) at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:788) at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:658) .. at jdk.proxy4/jdk.proxy4.$Proxy239.deleteById(Unknown Source) at com.atlassian.confluence.impl.settings.ConfluencePluginSettings.removeActual(ConfluencePluginSettings.java:202) at com.atlassian.sal.core.pluginsettings.AbstractStringPluginSettings.remove(AbstractStringPluginSettings.java:166) at com.atlassian.confluence.impl.settings.ConfluencePluginSettings.remove(ConfluencePluginSettings.java:192) .. at com.atlassian.plugin.manager.store.DelegatingPluginPersistentStateStore.save(DelegatingPluginPersistentStateStore.java:21) at com.atlassian.confluence.impl.plugin.CachingPluginPersistentStateStore.save(CachingPluginPersistentStateStore.java:32) .. at com.atlassian.confluence.impl.plugin.ConfluencePluginManager.processClusteredInstallEvent(ConfluencePluginManager.java:225) at com.atlassian.confluence.impl.plugin.ConfluencePluginManager.processPluginEvent(ConfluencePluginManager.java:187) at com.atlassian.confluence.impl.plugin.ConfluencePluginManager.onClusterEvent(ConfluencePluginManager.java:152)
2026-09-04 08:27:59,366 WARN [nc.confluence.event-1] [confluence.impl.plugin.PluginSettingsPluginStateStore] lambda$load$1 Unable to deserialize plugin state entry for key hash d18349d2ec626b530312c5ee7a3039ca. Skipping entry. Error: Cannot invoke \"com.atlassian.confluence.impl.plugin.PluginSettingsPluginStateStore$PluginStateStoreEntry.getKey()\" because \"stateEntry\" is null
Workaround
- Scale the Cluster down to one node before updating Apps.
- Once all the required apps are updated, scale Confluence back to the required number of nodes