-
Bug
-
Resolution: Fixed
-
Low
-
7.8.5, 7.7.5, 7.9.3, 7.11.0, 7.6.7, 8.5.4, 8.20.2
-
7.06
-
65
-
Severity 3 - Minor
-
8
-
Summary
NotSerializableException can be seen in log when loading external gadget. Encountering this is considered harmless.
Steps to reproduce
- Setup Jira DC with enables async caches (jira.cache.replication.localq.disabled property set to false as Java property)
- Create new dashboard
- Open "Add gadget" window and go to "Manage gadgets" administration panel
- Under "Gadgets" tab paste link to some external gadget xml (e.g. https://www.komoroske.com/sudoku/sudoku.xml)
- Click "Add gadget" button
- Go back to dashboard and add the external gadget.
- After loading it wait 5 minutes for gadget cache entry to expire.
- Access the dashboard with external gadget.
Expected result
No problems logged
Actual result
Exception is logged
2018-07-26 15:38:17,478 http-nio-8080-exec-4 ERROR admin 929x452x1 u9hvni 62.87.203.114,10.0.0.158 /secure/Dashboard.jspa [c.a.j.c.distribution.localq.LocalQCacheManager] Critical state of local cache replication queue - cannot add: LocalQCacheOp{cacheName='com.atlassian.gadgets.renderer.internal.cache.gadgetSpecs', action=REMOVE, key=com.atlassian.jira.cache.ehcache.customserialization.CustomSerializedValue@f2dd38a0, value=null, creationTimeInMillis=1532619473154} to queue: [queueId=queue_node0_2_6466f056d2e2a8e6eeea9e6bf34735ff, queuePath=/home/ubuntu/jirahome/localq/queue_node0_2_6466f056d2e2a8e6eeea9e6bf34735ff], error: Failed to add entry. com.squareup.tape.FileException: Failed to add entry. at com.squareup.tape.FileObjectQueue.add(FileObjectQueue.java:49) at com.atlassian.jira.cluster.distribution.localq.tape.TapeLocalQCacheOpQueue.add(TapeLocalQCacheOpQueue.java:151) at com.atlassian.jira.cluster.distribution.localq.LocalQCacheOpQueueWithStats.add(LocalQCacheOpQueueWithStats.java:115) at com.atlassian.jira.cluster.distribution.localq.LocalQCacheManager.addToQueue(LocalQCacheManager.java:344) at com.atlassian.jira.cluster.distribution.localq.LocalQCacheManager.addToAllQueues(LocalQCacheManager.java:328) at com.atlassian.jira.cluster.distribution.localq.LocalQCacheReplicator.replicateToQueue(LocalQCacheReplicator.java:85) at com.atlassian.jira.cluster.distribution.localq.LocalQCacheReplicator.replicateRemovalNotification(LocalQCacheReplicator.java:71) at com.atlassian.jira.cluster.cache.ehcache.AbstractJiraCacheReplicator.notifyElementUpdated(AbstractJiraCacheReplicator.java:116) at net.sf.ehcache.event.RegisteredEventListeners.internalNotifyElementUpdated(RegisteredEventListeners.java:228) at net.sf.ehcache.event.RegisteredEventListeners.notifyElementUpdated(RegisteredEventListeners.java:206) at net.sf.ehcache.Cache.notifyPutInternalListeners(Cache.java:1646) at net.sf.ehcache.Cache.putInternal(Cache.java:1618) at net.sf.ehcache.Cache.put(Cache.java:1543) at net.sf.ehcache.Cache.put(Cache.java:1508) at com.atlassian.cache.ehcache.DelegatingCache.put(DelegatingCache.java:93) at com.atlassian.jira.cache.DeferredReplicationCache.lambda$put$0(DeferredReplicationCache.java:60) at com.atlassian.jira.cluster.cache.ehcache.BlockingParallelCacheReplicator.runDeferred(BlockingParallelCacheReplicator.java:172) at com.atlassian.jira.cache.DeferredReplicationCache.put(DeferredReplicationCache.java:59) at com.atlassian.gadgets.renderer.internal.cache.AtlassianCache.addElement(AtlassianCache.java:22) at org.apache.shindig.common.cache.SoftExpiringCache.addElement(SoftExpiringCache.java:89) at org.apache.shindig.gadgets.DefaultGadgetSpecFactory.fetchObjectAndCache(DefaultGadgetSpecFactory.java:137) at org.apache.shindig.gadgets.DefaultGadgetSpecFactory.getGadgetSpec(DefaultGadgetSpecFactory.java:91) at com.atlassian.gadgets.renderer.internal.local.LocalGadgetSpecFactory.getGadgetSpec(LocalGadgetSpecFactory.java:80) at com.atlassian.gadgets.renderer.internal.local.LocalGadgetSpecFactory.getGadgetSpec(LocalGadgetSpecFactory.java:59) at com.atlassian.gadgets.renderer.internal.GadgetSpecFactoryImpl.getGadgetSpec(GadgetSpecFactoryImpl.java:128) at com.atlassian.gadgets.renderer.internal.GadgetSpecFactoryImpl.getGadgetSpec(GadgetSpecFactoryImpl.java:83) ... 2 filtered at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) 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:208) at com.sun.proxy.$Proxy1774.getGadgetSpec(Unknown Source) at com.atlassian.gadgets.embedded.internal.GadgetUrlBuilder.buildUserPrefsParams(GadgetUrlBuilder.java:98) at com.atlassian.gadgets.embedded.internal.GadgetUrlBuilder.build(GadgetUrlBuilder.java:86) ... 3 filtered at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) 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:208) at com.sun.proxy.$Proxy1797.build(Unknown Source) at com.atlassian.gadgets.dashboard.internal.rest.representations.RenderedGadgetUriProviderImpl.getRenderedGadgetUri(RenderedGadgetUriProviderImpl.java:33) at com.atlassian.gadgets.dashboard.internal.rest.representations.GadgetUrlContainer.<init>(GadgetUrlContainer.java:36) at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl.gadgetUrlsForGadget(RepresentationFactoryImpl.java:133) at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl.createGadgetRepresentation(RepresentationFactoryImpl.java:73) at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl$1$1.apply(RepresentationFactoryImpl.java:54) at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl$1$1.apply(RepresentationFactoryImpl.java:51) at com.google.common.collect.Iterators$8.transform(Iterators.java:799) at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48) at com.google.common.collect.Iterators$7.computeNext(Iterators.java:651) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at com.google.common.collect.Iterators$7.computeNext(Iterators.java:650) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at com.google.common.collect.TransformedIterator.hasNext(TransformedIterator.java:43) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:268) at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:226) at com.atlassian.gadgets.dashboard.internal.rest.representations.RepresentationFactoryImpl.createDashboardRepresentation(RepresentationFactoryImpl.java:48) at com.atlassian.gadgets.dashboard.internal.velocity.DashboardEmbedder.dashboardToJsonObject(DashboardEmbedder.java:47) at com.atlassian.gadgets.dashboard.internal.velocity.DashboardView.getLayoutsJson(DashboardView.java:158) at com.atlassian.gadgets.dashboard.internal.velocity.DashboardView.writeTo(DashboardView.java:77) at com.atlassian.jira.web.action.Dashboard.getDashboardHtml(Dashboard.java:235) at com.atlassian.jira.web.action.Dashboard.getContextParams(Dashboard.java:616) ... 2 filtered at java.lang.reflect.Method.invoke(Method.java:498) ... 3 filtered at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:527) ... 7 filtered at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ... 48 filtered at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:62) ... 12 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 70 filtered at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66) ... 1 filtered at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64) ... 39 filtered at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30) ... 20 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 4 filtered at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36) ... 26 filtered at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25) ... 23 filtered at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: java.io.NotSerializableException: org.apache.shindig.common.uri.Uri at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at com.atlassian.jira.cache.ehcache.customserialization.CustomSerializedValue.writeObject(CustomSerializedValue.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.lang.reflect.Method.invoke(Method.java:498) at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at com.atlassian.jira.cluster.distribution.localq.tape.TapeLocalQCacheOpConverter.toStream(TapeLocalQCacheOpConverter.java:33) at com.atlassian.jira.cluster.distribution.localq.tape.TapeLocalQCacheOpConverter.toStream(TapeLocalQCacheOpConverter.java:16) at com.squareup.tape.FileObjectQueue.add(FileObjectQueue.java:45) ... 362 more
Notes
The exception log entry is a regression introduced in 7.6.7 and 7.11.0, however it didn't change previous functional behaviour. Before same thing could be seen as WARN log enrty:
2018-07-26 13:10:43,118 http-nio-8080-exec-8 WARN admin 790x419x1 img4x3 62.87.203.114,10.0.0.249 /secure/Dashboard.jspa [c.a.j.c.cache.ehcache.AbstractJiraCacheReplicator] Key https://www.komoroske.com/sudoku/sudoku.xml is not Serializable and update cannot be replicated. Cache: com.atlassian.gadgets.renderer.internal.cache.gadgetSpecs
It is important to note that the exception can be ignored as it is meant to be a warning only .
Diagnostic steps
The external gadgets can be identified exist in Jira by checking the
- /plugins/servlet/gadgets/admin page as Jira Administrator
- Query the database for select * from externalgadget;
Deleted external gadgets or those that are available from Application links can cause this as well. To check:
- Query the database for select * from portletconfiguration where gadget_xml like '%http%';
- is caused by
-
JRASERVER-65246 Plugin caches in Data Center throw ClassNotFoundException on invalidation if custom classes are used as keys
- Closed
- mentioned in
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
-
Page Loading...
- relates to
-
MNSTR-7400 Loading...