Duplicate Key exception for atlassian whitelist-api plugin during upgrade of Jira Data Center

Still need help?

The Atlassian Community is here for you.

Ask the community


Platform Notice: Data Center - This article applies to Atlassian products on the Data Center platform.

Note that this knowledge base article was created for the Data Center version of the product. Data Center knowledge base articles for non-Data Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.

*Except Fisheye and Crucible

Summary

This article describes a scenario where Jira upgrade from version 9.4.8 to 9.4.11 fails with "java.lang.IllegalStateException: Duplicate key" exception for Atlassian whitelist-api plugin. Following error stack-trace is observed in atlassian-jira.log file.

2023-10-18 12:13:16,704+0000 main ERROR      [c.a.jira.startup.LauncherContextListener] Unable to start JIRA.
java.lang.IllegalStateException: Duplicate key com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6 (attempted merging values com.atlassian.jira.plugin.PluginVersionImpl@600b8c6d[id=14100,key=com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6,name=Atlassian Whitelist API Plugin,version=5.0.6,created=Mon Jul 19 20:39:21 UTC 2021] and com.atlassian.jira.plugin.PluginVersionImpl@6d14103e[id=14200,key=com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6,name=Atlassian Whitelist API Plugin,version=5.0.6,created=Mon Jul 19 20:39:21 UTC 2021])
    at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:133)
    at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:180)
    at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at com.atlassian.jira.plugin.startup.PluginVersionsChangeAnalyser.buildReport(PluginVersionsChangeAnalyser.java:38)
    at com.atlassian.jira.plugin.JiraPluginManager.processPluginSystemChanges(JiraPluginManager.java:349)
    at com.atlassian.jira.plugin.JiraPluginManager.lateStartup(JiraPluginManager.java:135)
    at com.atlassian.jira.component.pico.ComponentManager$PluginSystem.lateStartup(ComponentManager.java:694)
    at com.atlassian.jira.component.pico.ComponentManager.lateStartPluginSystem(ComponentManager.java:301)
    at com.atlassian.jira.upgrade.PluginSystemLauncher.lateStart(PluginSystemLauncher.java:66)
    at com.atlassian.jira.startup.DefaultJiraLauncher.postDBActivated(DefaultJiraLauncher.java:168)
    at com.atlassian.jira.startup.DefaultJiraLauncher.lambda$postDbLaunch$2(DefaultJiraLauncher.java:144)
    at com.atlassian.jira.config.database.DatabaseConfigurationManagerImpl.doNowOrEnqueue(DatabaseConfigurationManagerImpl.java:307)
    at com.atlassian.jira.config.database.DatabaseConfigurationManagerImpl.doNowOrWhenDatabaseActivated(DatabaseConfigurationManagerImpl.java:202)
    at com.atlassian.jira.startup.DefaultJiraLauncher.postDbLaunch(DefaultJiraLauncher.java:135)
    at com.atlassian.jira.startup.DefaultJiraLauncher.lambda$start$0(DefaultJiraLauncher.java:102)
    at com.atlassian.jira.util.devspeed.JiraDevSpeedTimer.run(JiraDevSpeedTimer.java:31)
    at com.atlassian.jira.startup.DefaultJiraLauncher.start(DefaultJiraLauncher.java:100)
    at com.atlassian.jira.startup.LauncherContextListener.initSlowStuff(LauncherContextListener.java:154)
    at com.atlassian.jira.startup.LauncherContextListener.initSlowStuffInBackground(LauncherContextListener.java:139)
    at com.atlassian.jira.startup.LauncherContextListener.contextInitialized(LauncherContextListener.java:101)
    ... 5 filtered
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    ... 5 filtered
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    ... 8 filtered
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    ... 2 filtered


Environment

9.x

Diagnosis

  • Looking at the error message in the exception, we can find that there are two entries in the PluginVersion table, one with id=14200 and other with id=14100. One of them is duplicate:

    Duplicate key com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6 (attempted merging values com.atlassian.jira.plugin.PluginVersionImpl@600b8c6d[id=14100,key=com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6,name=Atlassian Whitelist API Plugin,version=5.0.6,created=Mon Jul 19 20:39:21 UTC 2021] and com.atlassian.jira.plugin.PluginVersionImpl@6d14103e[id=14200,key=com.atlassian.plugins.atlassian-whitelist-api-plugin-5.0.6,name=Atlassian Whitelist API Plugin,version=5.0.6,created=Mon Jul 19 20:39:21 UTC 2021])

Solution

  • Run the following query in the database to find the duplicate entries in pluginversion table:

    # check if there are duplicates
    select * from pluginversion p2 where pluginkey like '%whitelist-api%'; 
    
    SELECT PLUGINKEY, COUNT(PLUGINKEY) FROM PLUGINVERSION GROUP BY PLUGINKEY HAVING COUNT(PLUGINKEY) > 1 ORDER BY PLUGINKEY; 
  • If query returns more than one entry, then delete the duplicate entries using following query:

    DELETE FROM PLUGINVERSION A USING PLUGINVERSION B WHERE A.ID < B.ID AND A.PLUGINKEY = B.PLUGINKEY;




Last modified on Dec 5, 2024

Was this helpful?

Yes
No
Provide feedback about this article
Powered by Confluence and Scroll Viewport.