I think the configure pdx command also lets you configure persistence or read-serialized for pdx, right? So some people might not be using either of those auto-serializable-classes options.
-Dan On Wed, Mar 7, 2018 at 4:13 AM, Ju@N <jujora...@gmail.com> wrote: > Hello all, > > While working on a fix for GEODE-4771 > <https://issues.apache.org/jira/browse/GEODE-4771> I've came across a > non-reported bug: the configure pdx command fails when no parameters are > specified, even when we state in the User Guide > <http://geode.apache.org/docs/guide/14/tools_modules/gfsh/ > command-pages/configure.html> > that > no parameters are mandatory to execute the command. The source code doesn't > enforce any of the parameters and, as such, the resulting XmlEntity ends up > being empty, so a NullPointerException is thrown when the command tries to > persist the changes to the cluster configuration service: > > [error 2018/03/07 11:07:48.242 GMT locator1 <RMI TCP > Connection(2)-127.0.0.1> tid=0x55] error updating cluster > configuration for group cluster > java.lang.NullPointerException > at java.io.StringReader.<init>(StringReader.java:50) > at org.apache.geode.management.internal.configuration.utils. > XmlUtils.createNode(XmlUtils.java:242) > at org.apache.geode.management.internal.configuration.utils. > XmlUtils.addNewNode(XmlUtils.java:133) > at org.apache.geode.distributed.internal. > ClusterConfigurationService.addXmlEntity(ClusterConfigurationService. > java:204) > at org.apache.geode.management.internal.cli.commands. > ConfigurePDXCommand.lambda$configurePDX$0(ConfigurePDXCommand.java:131) > at org.apache.geode.management.internal.cli.commands.GfshCommand. > persistClusterConfiguration(GfshCommand.java:72) > at org.apache.geode.management.internal.cli.commands. > ConfigurePDXCommand.configurePDX(ConfigurePDXCommand.java:130) > 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 org.springframework.util.ReflectionUtils.invokeMethod( > ReflectionUtils.java:216) > at org.apache.geode.management.internal.cli.remote. > CommandExecutor.invokeCommand(CommandExecutor.java:97) > at org.apache.geode.management.internal.cli.remote. > CommandExecutor.execute(CommandExecutor.java:45) > at org.apache.geode.management.internal.cli.remote. > CommandExecutor.execute(CommandExecutor.java:39) > at org.apache.geode.management.internal.cli.remote. > OnlineCommandProcessor.executeCommand(OnlineCommandProcessor.java:133) > at org.apache.geode.management.internal.beans.MemberMBeanBridge. > processCommand(MemberMBeanBridge.java:1579) > at org.apache.geode.management.internal.beans.MemberMBean. > processCommand(MemberMBean.java:412) > 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 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) > at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke( > DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) > at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn( > ConvertingMethod.java:193) > at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn( > ConvertingMethod.java:175) > at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2( > MXBeanIntrospector.java:117) > at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2( > MXBeanIntrospector.java:54) > at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM( > MBeanIntrospector.java:237) > at com.sun.jmx.mbeanserver.PerInterface.invoke( > PerInterface.java:138) > at com.sun.jmx.mbeanserver.MBeanSupport.invoke( > MBeanSupport.java:252) > at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke( > DefaultMBeanServerInterceptor.java:819) > at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke( > JmxMBeanServer.java:801) > at javax.management.remote.rmi.RMIConnectionImpl.doOperation( > RMIConnectionImpl.java:1468) > at javax.management.remote.rmi.RMIConnectionImpl.access$300( > RMIConnectionImpl.java:76) > at javax.management.remote.rmi.RMIConnectionImpl$ > PrivilegedOperation.run(RMIConnectionImpl.java:1309) > at javax.management.remote.rmi.RMIConnectionImpl. > doPrivilegedOperation(RMIConnectionImpl.java:1401) > at javax.management.remote.rmi.RMIConnectionImpl.invoke( > RMIConnectionImpl.java:829) > 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 sun.rmi.server.UnicastServerRef.dispatch( > UnicastServerRef.java:357) > at sun.rmi.transport.Transport$1.run(Transport.java:200) > at sun.rmi.transport.Transport$1.run(Transport.java:197) > at java.security.AccessController.doPrivileged(Native Method) > at sun.rmi.transport.Transport.serviceCall(Transport.java:196) > at sun.rmi.transport.tcp.TCPTransport.handleMessages( > TCPTransport.java:568) > at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0( > TCPTransport.java:826) > at sun.rmi.transport.tcp.TCPTransport$ > ConnectionHandler.lambda$run$0(TCPTransport.java:683) > at java.security.AccessController.doPrivileged(Native Method) > at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run( > TCPTransport.java:682) > 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) > > Currently the configure pdx command only allows the user to configure the > ReflectionBasedAutoSerializer class, which requires a decision on whether > the check-portability flag is set as true or false. This, in turn, enforces > the usage of either the > portable-auto-serializable-classes(check-portability=true) or > auto-serializable-classes(check-portability=false) so that the command > knows exactly which of ReflectionBasedAutoSerializer should create. Within > the command we could easily create an empty ReflectionBasedAutoSerializer, > but it won't match any classes so it doesn't make any sense at all... > > The proposal is to make the flags portable-auto-serializable-classes and > auto-serializable-classes mandatory, mutually exclusive. > > Please let me know your thoughts. > > Best regards. > > -- > Ju@N >