Uploaded image for project: 'Jira Service Management Data Center'
  1. Jira Service Management Data Center
  2. JSDSERVER-2165

The JEPP mail plugin throws NullPointerExceptions (sometimes) during startup

    XMLWordPrintable

Details

    Description

      NOTE: This bug report is for JIRA Service Desk Server. Using JIRA Service Desk Cloud? See the corresponding bug report.

      The JEPP code base can throw NPEs during JIRA Service Desk startup, but only some times.

      The exception looks like this

      Failure simplicity.atlassian.net: JIRA is 503 Server Error: Service Unavailable
      com.atlassian.servicedesk:sd-general-health-check: The internal modules have failed to start : NullPointerException:
      java.lang.NullPointerException
      at com.atlassian.jira.internal.mail.processor.feature.channel.MailChannelStore.getMailChannelByKey(MailChannelStore.java:63)
      at com.atlassian.jira.internal.mail.processor.feature.channel.MailChannelManager.getMailChannelDefinitionByKey(MailChannelManager.java:270)
      at com.atlassian.jira.internal.mail.processor.feature.channel.DefaultChannelManager.getMailChannelByKey(DefaultChannelManager.java:46)
      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:497)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
      at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
      at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
      at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
      at com.sun.proxy.$Proxy2999.getMailChannelByKey(Unknown Source)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.JEPP.JEPPServiceImpl.getMailChannelByKey(JEPPServiceImpl.scala:26)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailChannelSettingTestValidator.validMailChannel(EmailChannelSettingTestValidator.scala:66)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailPlatformChannelManagerImpl.com$atlassian$servicedesk$internal$feature$emailchannel$emailplatform$EmailPlatformChannelManagerImpl$$isBrokenEmailChannelSetting(EmailPlatformChannelManagerImpl.scala:329)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailPlatformChannelManagerImpl$$anonfun$getValidOnDemandEmailChannels$1.apply(EmailPlatformChannelManagerImpl.scala:309)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailPlatformChannelManagerImpl$$anonfun$getValidOnDemandEmailChannels$1.apply(EmailPlatformChannelManagerImpl.scala:309)
      at scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:264)
      at scala.collection.immutable.List.foreach(List.scala:318)
      at scala.collection.TraversableLike$class.filter(TraversableLike.scala:263)
      at scala.collection.AbstractTraversable.filter(Traversable.scala:105)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailPlatformChannelManagerImpl.getValidOnDemandEmailChannels(EmailPlatformChannelManagerImpl.scala:309)
      at com.atlassian.servicedesk.internal.feature.emailchannel.emailplatform.EmailPlatformChannelManagerImpl.checkODEmailChannelConnectivityAndUpdateExpiredPasswords(EmailPlatformChannelManagerImpl.scala:113)
      at com.atlassian.servicedesk.internal.feature.emailchannel.EmailChannelManagerDelegator.checkODEmailChannelConnectivityAndUpdateExpiredPasswords(EmailChannelManagerDelegator.scala:44)
      at com.atlassian.servicedesk.internal.email.mailstore.ODMailStoreChecker.verifyAndUpdateODMailSettingsPassword(ODMailStoreChecker.java:20)
      at com.atlassian.servicedesk.bootstrap.lifecycle.TenantAwareneODMailInitialiser.initialize(TenantAwareneODMailInitialiser.java:59)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle.loadSuccessModules(PluginLifeCycle.java:424)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle.loadDynamicModules(PluginLifeCycle.java:378)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle.runPluginStartupSideEffectsImpl(PluginLifeCycle.java:341)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle.access$000(PluginLifeCycle.java:38)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle$1.run(PluginLifeCycle.java:272)
      at com.atlassian.servicedesk.bootstrap.lifecycle.LifecycleLock.writeImpl(LifecycleLock.java:115)
      at com.atlassian.servicedesk.bootstrap.lifecycle.LifecycleLock.runOnStartup(LifecycleLock.java:87)
      at com.atlassian.servicedesk.bootstrap.lifecycle.PluginLifeCycle.runPluginStartupSideEffects(PluginLifeCycle.java:267)

      The code is blowing up here

          Option<MailChannelDTO> getMailChannelByKey(final Option<TransactionContext> txnContext, ChannelKey key)
          {
              final SelectClauseProvider clauseProvider = SelectClauseProvider.builder()
                      .where(table.MAIL_CHANNEL_KEY.eq(key.getKey()))
                      .build();
      
      

      Its either the key variable is null or the table variable. I suspect its the table variable.

      Here is what I think is happening

      • the JEPP API is made available via OSGi and JSD starts calling on it
      • however the JEPP plugin has not started yet and has not run its init code
      • that init code makes sure the AO is present and then calls queryDslHelper.init();
      • this then inits the "table" variable above

      Normally this works because JEPP starts before JSD say and this is all done before the caller can invoke API services.

      The recent JIRA 7.x lifecycle changes have made this problem more likely but its always been present. We have a number of internal tickets reporting this problem.

      Attachments

        Issue Links

          Activity

            People

              bbaker ɹǝʞɐq pɐɹq
              bbaker ɹǝʞɐq pɐɹq
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Backbone Issue Sync