Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-20988

Deadlock inPluginUtils.getHistoryDao

    XMLWordPrintable

Details

    Description

      During a functional test in which the jobConfigHistory (2.5) was loaded, I observed a deadlock:

      "Trigger.init":
        waiting to lock monitor 0x6ed0f06c (object 0xa2a5c080, a hudson.DescriptorExtensionList),
        which is held by "UpdateCenter.init"
      "UpdateCenter.init":
        waiting to lock monitor 0x69e32098 (object 0xb2602558, a hudson.ExtensionList$Lock),
        which is held by "Trigger.init"
      "Trigger.init":
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:246)
      	- waiting to lock <0xa2a5c080> (a hudson.DescriptorExtensionList)
      	at hudson.ExtensionList.iterator(ExtensionList.java:138)
      	at hudson.model.User.load(User.java:150)
      	- locked <0xa2b26450> (a hudson.model.User)
      	at hudson.model.User.<init>(User.java:121)
      	at hudson.model.User.getOrCreate(User.java:342)
      	at hudson.model.User.get(User.java:331)
      	at hudson.model.User.get(User.java:299)
      	at hudson.model.User.get(User.java:354)
      	at hudson.model.User.current(User.java:366)
      	at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:78)
      	at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:62)
      	at hudson.plugins.jobConfigHistory.JobConfigHistoryPurger.<init>(JobConfigHistoryPurger.java:48)
      	at hudson.plugins.jobConfigHistory.JobConfigHistoryPurger$$FastClassByGuice$$737d44b4.newInstance(<generated>)
      	at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
      	at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
      	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108)
      	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:87)
      	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:259)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1018)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
      	at com.google.inject.Scopes$1$1.get(Scopes.java:59)
      	- locked <0xb26c2c38> (a com.google.inject.Scopes$1$1)
      	at hudson.ExtensionFinder$GuiceFinder$4$1.get(ExtensionFinder.java:422)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
      	at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:965)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1011)
      	at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:961)
      	at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:391)
      	at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:382)
      	at hudson.ExtensionFinder._find(ExtensionFinder.java:151)
      	at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:308)
      	at hudson.ExtensionList.load(ExtensionList.java:295)
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:248)
      	- locked <0xb2602558> (a hudson.ExtensionList$Lock)
      	at hudson.ExtensionList.iterator(ExtensionList.java:138)
      	at hudson.triggers.Trigger.init(Trigger.java:293)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at hudson.init.InitializerFinder.invoke(InitializerFinder.java:120)
      	at hudson.init.InitializerFinder$TaskImpl.run(InitializerFinder.java:184)
      	at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
      	at jenkins.model.Jenkins$7.runTask(Jenkins.java:893)
      	at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
      	at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:744)
      "UpdateCenter.init":
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:246)
      	- waiting to lock <0xb2602558> (a hudson.ExtensionList$Lock)
      	at hudson.ExtensionList.getComponents(ExtensionList.java:149)
      	at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182)
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:248)
      	- locked <0xa2a5c080> (a hudson.DescriptorExtensionList)
      	at hudson.ExtensionList.iterator(ExtensionList.java:138)
      	at hudson.model.User.load(User.java:150)
      	- locked <0xa2a5bcd0> (a hudson.model.User)
      	at hudson.model.User.<init>(User.java:121)
      	at hudson.model.User.getOrCreate(User.java:342)
      	at hudson.model.User.get(User.java:331)
      	at hudson.model.User.get(User.java:299)
      	at hudson.model.User.get(User.java:354)
      	at hudson.model.User.current(User.java:366)
      	at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:78)
      	at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:62)
      	at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.getHistoryDao(JobConfigHistorySaveableListener.java:49)
      	at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.onChange(JobConfigHistorySaveableListener.java:28)
      	at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:78)
      	at hudson.model.UpdateCenter.save(UpdateCenter.java:514)
      	- locked <0xb269fbd8> (a hudson.model.UpdateCenter)
      	at hudson.util.PersistedList.onModified(PersistedList.java:173)
      	at hudson.util.PersistedList._onModified(PersistedList.java:181)
      	at hudson.util.PersistedList.add(PersistedList.java:72)
      	at hudson.model.UpdateCenter.load(UpdateCenter.java:544)
      	- locked <0xb269fbd8> (a hudson.model.UpdateCenter)
      	at hudson.model.UpdateCenter.init(UpdateCenter.java:1538)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at hudson.init.InitializerFinder.invoke(InitializerFinder.java:120)
      	at hudson.init.InitializerFinder$TaskImpl.run(InitializerFinder.java:184)
      	at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
      	at jenkins.model.Jenkins$7.runTask(Jenkins.java:893)
      	at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
      	at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:744)
      

      Attachments

        Issue Links

          Activity

            Code changed in jenkins
            User: Jesse Glick
            Path:
            src/main/java/hudson/plugins/jobConfigHistory/JobConfigHistoryPurger.java
            src/main/java/hudson/plugins/jobConfigHistory/PluginUtils.java
            http://jenkins-ci.org/commit/jobConfigHistory-plugin/55b2b3cf6ff42c1610a3462e50528b993764d089
            Log:
            [FIXED JENKINS-20988] Avoid making potentially expensive or locking calls like User.current() from inside an extension constructor.
            Anyway the “current user” is simply ACL.SYSTEM in this case, which we ought to treat like anonymous.

            scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Jesse Glick Path: src/main/java/hudson/plugins/jobConfigHistory/JobConfigHistoryPurger.java src/main/java/hudson/plugins/jobConfigHistory/PluginUtils.java http://jenkins-ci.org/commit/jobConfigHistory-plugin/55b2b3cf6ff42c1610a3462e50528b993764d089 Log: [FIXED JENKINS-20988] Avoid making potentially expensive or locking calls like User.current() from inside an extension constructor. Anyway the “current user” is simply ACL.SYSTEM in this case, which we ought to treat like anonymous.

            Code changed in jenkins
            User: Thomas de Grenier de Latour
            Path:
            src/main/java/hudson/plugins/jobConfigHistory/JobConfigHistorySaveableListener.java
            src/main/java/hudson/plugins/jobConfigHistory/PluginUtils.java
            src/test/java/hudson/plugins/jobConfigHistory/JobConfigHistorySaveableListenerTest.java
            http://jenkins-ci.org/commit/jobConfigHistory-plugin/6358945f3dfdc56a81edecfb7567992140714e3a
            Log:
            Avoid calling `User.current()` from `JobConfigHistorySaveableListener` during Jenkins initialization

            When `jobConfigHistory` is used used together with the `sonar` (2.2) plugin, we get the following stack:

            ```
            hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1 error
            WARNING: Failed to instantiate Key[type=hudson.plugins.sonar.SonarPublisher$DescriptorImpl, annotation=[none]]; skipping this component
            com.google.inject.ProvisionException: Guice provision errors:

            1) Tried proxying hudson.plugins.sonar.SonarPublisher$DescriptorImpl to support a circular dependency, but it is not an interface.

            1 error
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:52)
            at com.google.inject.Scopes$1$1.get(Scopes.java:65)
            at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:427)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058)
            at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001)
            at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:389)
            at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:380)
            at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:370)
            at hudson.ExtensionList.load(ExtensionList.java:300)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
            at hudson.ExtensionList.getComponents(ExtensionList.java:154)
            at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
            at hudson.ExtensionList.iterator(ExtensionList.java:143)
            at hudson.model.User.load(User.java:192)
            at hudson.model.User.<init>(User.java:143)
            at hudson.model.User.getOrCreate(User.java:443)
            at hudson.model.User.current(User.java:487)
            at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:71)
            at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:62)
            at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.getHistoryDao(JobConfigHistorySaveableListener.java:49)
            at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.onChange(JobConfigHistorySaveableListener.java:28)
            at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:80)
            at hudson.model.Descriptor.save(Descriptor.java:760)
            at hudson.plugins.sonar.SonarPublisher$DescriptorImpl.<init>(SonarPublisher.java:420)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
            at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:86)
            at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108)
            at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88)
            at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
            at com.google.inject.Scopes$1$1.get(Scopes.java:65)
            at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:427)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
            at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005)
            at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051)
            at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001)
            at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:389)
            at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:380)
            at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:370)
            at hudson.ExtensionList.load(ExtensionList.java:300)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
            at hudson.ExtensionList.getComponents(ExtensionList.java:154)
            at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
            at hudson.ExtensionList.iterator(ExtensionList.java:143)
            at org.jenkinsci.plugins.xunit.AliasInitializer.addAliases(AliasInitializer.java:47)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:606)
            at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:105)
            at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:169)
            at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:282)
            at jenkins.model.Jenkins$7.runTask(Jenkins.java:903)
            at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:210)
            at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:745)
            ```

            When writing the `SonarPublisher` config, `JobConfigHistorySaveableListener` is triggered, leading to a `User.current()` call, and ultimately to a Guice error (circular dependency).
            Since config changes occuring during this startup phase are not linked to any user request, we can avoid the `User.current()` call, and keep the config history entry anonymous.
            Note this is kind if similar to JENKINS-20988.

            scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Thomas de Grenier de Latour Path: src/main/java/hudson/plugins/jobConfigHistory/JobConfigHistorySaveableListener.java src/main/java/hudson/plugins/jobConfigHistory/PluginUtils.java src/test/java/hudson/plugins/jobConfigHistory/JobConfigHistorySaveableListenerTest.java http://jenkins-ci.org/commit/jobConfigHistory-plugin/6358945f3dfdc56a81edecfb7567992140714e3a Log: Avoid calling `User.current()` from `JobConfigHistorySaveableListener` during Jenkins initialization When `jobConfigHistory` is used used together with the `sonar` (2.2) plugin, we get the following stack: ``` hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1 error WARNING: Failed to instantiate Key[type=hudson.plugins.sonar.SonarPublisher$DescriptorImpl, annotation= [none] ]; skipping this component com.google.inject.ProvisionException: Guice provision errors: 1) Tried proxying hudson.plugins.sonar.SonarPublisher$DescriptorImpl to support a circular dependency, but it is not an interface. 1 error at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:52) at com.google.inject.Scopes$1$1.get(Scopes.java:65) at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:427) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001) at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:389) at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:380) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:370) at hudson.ExtensionList.load(ExtensionList.java:300) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253) at hudson.ExtensionList.getComponents(ExtensionList.java:154) at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253) at hudson.ExtensionList.iterator(ExtensionList.java:143) at hudson.model.User.load(User.java:192) at hudson.model.User.<init>(User.java:143) at hudson.model.User.getOrCreate(User.java:443) at hudson.model.User.current(User.java:487) at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:71) at hudson.plugins.jobConfigHistory.PluginUtils.getHistoryDao(PluginUtils.java:62) at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.getHistoryDao(JobConfigHistorySaveableListener.java:49) at hudson.plugins.jobConfigHistory.JobConfigHistorySaveableListener.onChange(JobConfigHistorySaveableListener.java:28) at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:80) at hudson.model.Descriptor.save(Descriptor.java:760) at hudson.plugins.sonar.SonarPublisher$DescriptorImpl.<init>(SonarPublisher.java:420) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:86) at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108) at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) at com.google.inject.Scopes$1$1.get(Scopes.java:65) at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:427) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051) at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001) at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:389) at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:380) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:370) at hudson.ExtensionList.load(ExtensionList.java:300) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253) at hudson.ExtensionList.getComponents(ExtensionList.java:154) at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253) at hudson.ExtensionList.iterator(ExtensionList.java:143) at org.jenkinsci.plugins.xunit.AliasInitializer.addAliases(AliasInitializer.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:105) at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:169) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:282) at jenkins.model.Jenkins$7.runTask(Jenkins.java:903) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:210) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) ``` When writing the `SonarPublisher` config, `JobConfigHistorySaveableListener` is triggered, leading to a `User.current()` call, and ultimately to a Guice error (circular dependency). Since config changes occuring during this startup phase are not linked to any user request, we can avoid the `User.current()` call, and keep the config history entry anonymous. Note this is kind if similar to JENKINS-20988 .

            People

              mfriedenhagen Mirko Friedenhagen
              jglick Jesse Glick
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: