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

Gearman Plugin should not access extensions from SaveableListener during startup

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Major Major
    • gearman-plugin
    • None

      Gearman Plugin has a SaveableListener that can result in access to ExtensionLists while extensions are still being loaded, similar to JCH in JENKINS-53998.

       

      WARNING: Failed to instantiate Key[type=hudson.plugins.openid.OpenIdLoginService$GlobalConfigurationImpl, annotation=[none]]; skipping this component
      com.google.inject.ProvisionException: Unable to provision, see the following errors:1) Tried proxying hudson.plugins.openid.OpenIdLoginService$GlobalConfigurationImpl 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.internal.SingletonScope$1.get(SingletonScope.java:145)
      	at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:432)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
      	at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
      	at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
      	at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:394)
      	at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:385)
      	at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:493)
      	at hudson.ExtensionList.load(ExtensionList.java:380)
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318)
      	at hudson.ExtensionList.getComponents(ExtensionList.java:183)
      	at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:192)
      	at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318)
      	at hudson.ExtensionList.iterator(ExtensionList.java:172)
      	at hudson.ExtensionList.get(ExtensionList.java:149)
      	at hudson.plugins.gearman.GearmanPluginConfig.get(GearmanPluginConfig.java:63)
      	at hudson.plugins.gearman.SaveableListenerImpl.onChange(SaveableListenerImpl.java:48)
      	at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:81)
      	at hudson.model.Descriptor.save(Descriptor.java:874)
      	at hudson.plugins.openid.OpenIdLoginService$GlobalConfigurationImpl.setEnabled(OpenIdLoginService.java:234)
      	at hudson.plugins.openid.OpenIdLoginService$GlobalConfigurationImpl.<init>(OpenIdLoginService.java:217)
       

          [JENKINS-54888] Gearman Plugin should not access extensions from SaveableListener during startup

          Antoine Musso added a comment -

          I tried upgrading the plugin Jenkins version in the pom from 2.277.1 to 2.319.1 and there is a very similar error albeit with jenkins.telemetry.Correlator :
          {{
          0.226 [id=227] WARNING h.ExtensionFinder$GuiceFinder$FaultTolerantScope$1#error: Failed to instantiate Key[type=jenkins.telemetry.Correlator, annotation=[none]]; skipping this component
          com.google.inject.ProvisionException: Unable to provision, see the following errors:
          1) Tried proxying jenkins.telemetry.Correlator 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.internal.SingletonScope$1.get(SingletonScope.java:145)
          at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:441)
          at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
          at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
          at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
          at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
          at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:401)
          at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:392)
          at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:352)
          at hudson.ExtensionList.load(ExtensionList.java:382)
          at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318)
          at hudson.ExtensionList.getComponents(ExtensionList.java:182)
          at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:212)
          at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318)
          at hudson.ExtensionList.iterator(ExtensionList.java:170)
          at hudson.ExtensionList.get(ExtensionList.java:147)
          at hudson.plugins.gearman.GearmanPluginConfig.get(GearmanPluginConfig.java:63)
          at hudson.plugins.gearman.SaveableListenerImpl.onChange(SaveableListenerImpl.java:49)
          at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:81)
          at hudson.model.Descriptor.save(Descriptor.java:900)
          at jenkins.telemetry.Correlator.<init>(Correlator.java:51)
          at jenkins.telemetry.Correlator$$FastClassByGuice$$5678e8d6.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:105)
          at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:32)
          at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:89)
          at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:115)
          at hudson.ExtensionFinder$GuiceFinder$SezpozModule.onProvision(ExtensionFinder.java:563)
          at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:126)
          at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:68)
          at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:87)
          at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
          at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
          at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
          at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
          at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
          at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:441)
          at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
          at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
          at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
          at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
          at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:401)
          at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:392)
          at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:352)
          at hudson.ExtensionList.load(ExtensionList.java:382)
          at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318)
          at hudson.ExtensionList.iterator(ExtensionList.java:170)
          at hudson.diagnosis.NullIdDescriptorMonitor.verify(NullIdDescriptorMonitor.java:71)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:498)
          at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
          at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:180)
          at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
          at jenkins.model.Jenkins$5.runTask(Jenkins.java:1151)
          at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
          at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
          at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
          at java.lang.Thread.run(Thread.java:748)
          1.179 [id=229] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
          1.188 [id=233] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted
          1.188 [id=232] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
          1.188 [id=233] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
          1.192 [id=231] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
          }}

          When the plugin configuration is loaded, the telemetry kicks in and save a file which would retriggered the {{ SaveableListener.onChange }} again. Maybe it is sufficient to have the {{ onChange() }} method to not do anything until {{ InitMilestone.COMPLETED }} is reached.

          Antoine Musso added a comment - I tried upgrading the plugin Jenkins version in the pom from 2.277.1 to 2.319.1 and there is a very similar error albeit with jenkins.telemetry.Correlator : {{ 0.226 [id=227] WARNING h.ExtensionFinder$GuiceFinder$FaultTolerantScope$1#error: Failed to instantiate Key[type=jenkins.telemetry.Correlator, annotation= [none] ]; skipping this component com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Tried proxying jenkins.telemetry.Correlator 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.internal.SingletonScope$1.get(SingletonScope.java:145) at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:441) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103) at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012) at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:401) at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:392) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:352) at hudson.ExtensionList.load(ExtensionList.java:382) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318) at hudson.ExtensionList.getComponents(ExtensionList.java:182) at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:212) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318) at hudson.ExtensionList.iterator(ExtensionList.java:170) at hudson.ExtensionList.get(ExtensionList.java:147) at hudson.plugins.gearman.GearmanPluginConfig.get(GearmanPluginConfig.java:63) at hudson.plugins.gearman.SaveableListenerImpl.onChange(SaveableListenerImpl.java:49) at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:81) at hudson.model.Descriptor.save(Descriptor.java:900) at jenkins.telemetry.Correlator.<init>(Correlator.java:51) at jenkins.telemetry.Correlator$$FastClassByGuice$$5678e8d6.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:105) at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:32) at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:89) at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:115) at hudson.ExtensionFinder$GuiceFinder$SezpozModule.onProvision(ExtensionFinder.java:563) at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:126) at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:68) at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:87) at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267) at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145) at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:441) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092) at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012) at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:401) at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:392) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:352) at hudson.ExtensionList.load(ExtensionList.java:382) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:318) at hudson.ExtensionList.iterator(ExtensionList.java:170) at hudson.diagnosis.NullIdDescriptorMonitor.verify(NullIdDescriptorMonitor.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104) at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:180) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296) at jenkins.model.Jenkins$5.runTask(Jenkins.java:1151) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117) at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 1.179 [id=229] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded 1.188 [id=233] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted 1.188 [id=232] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs 1.188 [id=233] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated 1.192 [id=231] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization }} When the plugin configuration is loaded, the telemetry kicks in and save a file which would retriggered the {{ SaveableListener.onChange }} again. Maybe it is sufficient to have the {{ onChange() }} method to not do anything until {{ InitMilestone.COMPLETED }} is reached.

          Antoine Musso added a comment -

          I went doing in src/main/java/hudson/plugins/gearman/SaveableListenerImpl.java:
          {{
          public void onChange(Saveable o, XmlFile file) {
          + if (Jenkins.get().getInitLevel() != InitMilestone.COMPLETED)

          { + logger.info("Plugins not fully loaded, ignoring change to " + file); + return; + }

          }}

          That seems to workaround the issue I have encountered with Jenkins 2.139.1 and might fix the original issue (I haven't tried with the OpenId plugin)

          Antoine Musso added a comment - I went doing in src/main/java/hudson/plugins/gearman/SaveableListenerImpl.java: {{ public void onChange(Saveable o, XmlFile file) { + if (Jenkins.get().getInitLevel() != InitMilestone.COMPLETED) { + logger.info("Plugins not fully loaded, ignoring change to " + file); + return; + } }} That seems to workaround the issue I have encountered with Jenkins 2.139.1 and might fix the original issue (I haven't tried with the OpenId plugin)

            Unassigned Unassigned
            danielbeck Daniel Beck
            Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: