Bug #47181 random NUllPointerException sometimes after dashboard login
Submitted: 7 Sep 2009 18:50 Modified: 20 Apr 2010 15:28
Reporter: Shannon Wade Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Enterprise Monitor: Web Severity:S3 (Non-critical)
Version:2.1.0.1096, 2.2.0.1651 OS:Linux
Assigned to: Josh Sled CPU Architecture:Any

[7 Sep 2009 18:50] Shannon Wade
Description:
Customer reports sometimes immediately upon login to dashboard he will get NPE. Dashboard shows a stack trace error via the 'toggle stack trace' link. Examining the trace gives no 'caused by' messages and there is no additional information in mysql-monitor.log.

The trace shows:

com.mysql.etools.monitor.pom.hib.HibInventoryObject.saveAttribute(HibInventoryObject.java:225)
com.mysql.etools.monitor.pom.InvObj.saveAttribute(InvObj.java:207)
com.mysql.etools.monitor.pom.InvObj.save(InvObj.java:212)
com.mysql.etools.monitor.pom.InvObj.saveAttribute(InvObj.java:220)
com.mysql.etools.monitor.bo.Server.setCachedDisplayName(Server.java:1004)
com.mysql.etools.monitor.bo.Server.cacheDisplaynameIfHostnameValid(Server.java:464)
com.mysql.etools.monitor.bo.Server.getDisplayName(Server.java:422)
com.mysql.merlin.ui.containers.ServerContainer.<init>(ServerContainer.java:119)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:98)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:88)
com.mysql.merlin.ui.containers.GroupContainer.<init>(GroupContainer.java:69)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:109)
com.mysql.merlin.ui.actions.BaseAction.getDefaultGroup(BaseAction.java:967)
com.mysql.merlin.ui.actions.BaseAction.getSelectedGroup(BaseAction.java:1333)
com.mysql.merlin.ui.actions.monitor.dashboard.Dashboard.updateAlarms(Dashboard.java:203)
com.mysql.merlin.ui.actions.monitor.dashboard.Dashboard.executeInner(Dashboard.java:181)
com.mysql.merlin.ui.actions.BaseViewAction.timeLogExecInner(BaseViewAction.java:70)
com.mysql.merlin.ui.actions.BaseViewAction.access$000(BaseViewAction.java:29)
com.mysql.merlin.ui.actions.BaseViewAction$1.call(BaseViewAction.java:62)
com.mysql.merlin.ui.actions.BaseViewAction$1.call(BaseViewAction.java:61)
com.mysql.etools.monitor.pom.hib.HibernateExecutor$2.execute(HibernateExecutor.java:142)
com.mysql.etools.monitor.pom.hib.HibernateExecutor.asTransaction(HibernateExecutor.java:188)
com.mysql.etools.monitor.pom.hib.HibernateExecutor.asReadOnlyTransaction(HibernateExecutor.java:148)
com.mysql.etools.monitor.pom.hib.SchemaMaintenanceExecutor.asReadOnlyTransaction(SchemaMaintenanceExecutor.java:214)
com.mysql.etools.monitor.pom.hib.HibPersistence.asReadOnlyTransaction(HibPersistence.java:1397)
com.mysql.merlin.ui.actions.BaseViewAction.openSessionInViewTxn(BaseViewAction.java:60)
com.mysql.merlin.ui.actions.BaseViewAction.exec(BaseViewAction.java:46)
com.mysql.merlin.ui.actions.BaseAction$1.call(BaseAction.java:1915)
com.mysql.merlin.ui.actions.BaseAction$1.call(BaseAction.java:1914)
com.mysql.merlin.ui.actions.BaseAction.execute(BaseAction.java:1898)
com.mysql.merlin.ui.actions.BaseAction.execute(BaseAction.java:1913)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
com.mysql.merlin.ui.interceptors.InitializeInterceptor.intercept(InitializeInterceptor.java:82)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
com.mysql.merlin.ui.interceptors.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:118)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
net.sf.ehcache.constructs.web.filter.GzipFilter.doFilter(GzipFilter.java:81)
net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
com.mysql.util.RequestCounterFilter.doFilter(RequestCounterFilter.java:117)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
com.mysql.merlin.ui.filters.AccessLogFilter.doFilter(AccessLogFilter.java:56)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)

Clicking the monitor tab works ok afterwards so while non-critical it is a bit disconcerting. Reported on 2.1.0.1071 and 2.1.0.1096.

How to repeat:
It is random, can't consistently repeat, though customer has experienced on 2.1.0.1071 and 2.1.0.1096.

Suggested fix:
n/a
[16 Mar 2010 15:05] Enterprise Tools JIRA Robot
Josh Sled writes: 
See EM-4188 for more reproduction details.  Note the last few stack frames are slightly different, but I believe this is just the new form of the same problem we've been hitting for a long time.  Should probably work to fix this in 2.2 ... either 2.2.0 or a maint release.

com.mysql.etools.monitor.rest.InventoryCollaborator$InstanceAttributeTimestamp.<init>(InventoryCollaborator.java:355)
...rest.MapCacheInstAttrStrategy.get(MapCacheInstAttrStrategy.java:87)
...rest.InventoryCollaborator.getInstanceAttribute(InventoryCollaborator.java:215)
...rest.InventoryCollaborator.asList(InventoryCollaborator.java:231)
...rest.InventoryCollaborator.saveValues(InventoryCollaborator.java:207)
...pom.hib.GenericInvObj.save(GenericInvObj.java:48)
...pom.InvObj.save(InvObj.java:214)
...pom.InvObj.save(InvObj.java:219)
...pom.InvObj.saveAttribute(InvObj.java:227)
...bo.Server.setCachedDisplayName(Server.java:1053)
...bo.Server.cacheDisplaynameIfHostnameValid(Server.java:477)
...bo.Server.getDisplayName(Server.java:435)
com.mysql.merlin.ui.containers.ServerContainer.<init>(ServerContainer.java:119)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:106)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:96)
com.mysql.merlin.ui.containers.GroupContainer.<init>(GroupContainer.java:84)
com.mysql.merlin.ui.containers.GroupContainer.<init>(GroupContainer.java:63)
com.mysql.merlin.ui.containers.GroupContainer.<init>(GroupContainer.java:59)
com.mysql.merlin.ui.helper.UiManager.fromCache(UiManager.java:117)
com.mysql.merlin.ui.actions.BaseAction.getSortedGroups(BaseAction.java:683)
com.mysql.merlin.ui.actions.monitor.dashboard.HeatChart.executeInner(HeatChart.java:53)
com.mysql.merlin.ui.actions.BaseViewAction.timeLogExecInner(BaseViewAction.java:80)
com.mysql.merlin.ui.actions.BaseViewAction.access$000(BaseViewAction.java:29)
com.mysql.merlin.ui.actions.BaseViewAction$1.call(BaseViewAction.java:72)
com.mysql.merlin.ui.actions.BaseViewAction$1.call(BaseViewAction.java:68)
com.mysql.etools.monitor.pom.hib.HibernateExecutor$2.execute(HibernateExecutor.java:160)
...pom.hib.HibernateExecutor.asTransaction(HibernateExecutor.java:224)
...asTransaction(HibernateExecutor.java:180)
...asReadOnlyTransaction(HibernateExecutor.java:166)
...pom.hib.SchemaMaintenanceExecutor.asReadOnlyTransaction(SchemaMaintenanceExecutor.java:221)
...pom.hib.HibPersistence.asReadOnlyTransaction(HibPersistence.java:1559)
com.mysql.merlin.ui.actions.BaseViewAction.openSessionInViewTxn(BaseViewAction.java:67)
com.mysql.merlin.ui.actions.BaseViewAction.exec(BaseViewAction.java:50)
com.mysql.merlin.ui.actions.BaseAction$1.call(BaseAction.java:2031)
com.mysql.merlin.ui.actions.BaseAction$1.call(BaseAction.java:2030)
com.mysql.merlin.ui.actions.BaseAction.execute(BaseAction.java:2014)
com.mysql.merlin.ui.actions.BaseAction.execute(BaseAction.java:2029)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
com.mysql.merlin.ui.interceptors.InitializeInterceptor.intercept(InitializeInterceptor.java:82)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
...DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
...interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
...DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
...DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
com.mysql.merlin.ui.interceptors.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:113)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
...DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:1)
...util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
...DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
net.sf.ehcache.constructs.web.filter.GzipFilter.doFilter(GzipFilter.java:81)
net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
com.mysql.merlin.server.RequestCounterFilter.doFilter(RequestCounterFilter.java:117)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
com.mysql.merlin.ui.filters.AccessLogFilter.doFilter(AccessLogFilter.java:56)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
...ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
...StandardWrapperValve.invoke(StandardWrapperValve.java:233)
...StandardContextValve.invoke(StandardContextValve.java:175)
...StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
....Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)
[16 Mar 2010 23:24] Enterprise Tools JIRA Robot
Carsten Segieth writes: 
after reading Shannon's comment about *displayname* changes I thought it might be 'interesting information' that in my tests the "displayname = ..." in the agent-instance.ini is set for all agents, so there are 'a lot of' such changes pretty fast after another.
[17 Mar 2010 12:35] Enterprise Tools JIRA Robot
Carsten Segieth writes: 
Just got the NPE a 2nd time in the 2nd attempt of setting up the 'usual' agents platform tests with build 2.2.0.1651.
[17 Mar 2010 20:21] Enterprise Tools JIRA Robot
Josh Sled writes: 
revno: 7981
revision-id: jsled@asynchronous.org-20100317201720-tk4qcm1l6pdeuqh5
parent: merlin@dl380-g5-a.mysql.com-20100315203154-yrvbnd8ql23x6u0b
committer: Josh Sled <jsled@asynchronous.org>
branch nick: local
timestamp: Wed 2010-03-17 16:17:20 -0400
message:
  EM-3580: Make the inability for a [Hib]InventoryObject to ensure an attribute is supported an exceptional condition.  Catch this condition in the one observed and "exp
ected" race condition where the lazily-generated server display name is potentially generated and "saved" in a read-only page view context.
[20 Apr 2010 15:28] MC Brown
A note has been added to the 2.2.0 changelog: 

        Occasional Null Pointer Exception errors could be raised after                                                                                    
        an initial login to the dashboard due to problems determining                                                                                     
        the correct name to use for displaying the list of servers.