memcached-session-manager icon indicating copy to clipboard operation
memcached-session-manager copied to clipboard

NullPointerException while requesting tomcat default manager app using kryo

Open yamingwa opened this issue 9 years ago • 4 comments

Hi, I got the following exception message when I request default tomcat manager app with kryo serialization. de.javakaffee.web.msm.TranscoderDeserializationException: com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException Serialization trace: cache (org.apache.catalina.filters.CsrfPreventionFilter$LruCache) at de.javakaffee.web.msm.serializer.kryo.KryoTranscoder.deserializeAttributes(KryoTranscoder.java:222) at de.javakaffee.web.msm.TranscoderService.deserializeAttributes(TranscoderService.java:171) at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:128) at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:54) at de.javakaffee.web.msm.BackupSessionService$SynchronousExecutorService.submit(BackupSessionService.java:347) at de.javakaffee.web.msm.BackupSessionService.backupSession(BackupSessionService.java:206) at de.javakaffee.web.msm.MemcachedSessionService.backupSession(MemcachedSessionService.java:1092) at de.javakaffee.web.msm.RequestTrackingHostValve.backupSession(RequestTrackingHostValve.java:230) at de.javakaffee.web.msm.RequestTrackingHostValve.invoke(RequestTrackingHostValve.java:159) at de.javakaffee.web.msm.RequestTrackingHostValve.invoke(RequestTrackingHostValve.java:124) at de.javakaffee.web.msm.RequestTrackingHostValve.invoke(RequestTrackingHostValve.java:124) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2454) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException Serialization trace: cache (org.apache.catalina.filters.CsrfPreventionFilter$LruCache) at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:144) at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:110) at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:790) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:161) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:39) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:686) at de.javakaffee.web.msm.serializer.kryo.KryoTranscoder.deserializeAttributes(KryoTranscoder.java:219) ... 21 more Caused by: java.lang.NullPointerException at java.util.HashMap.put(HashMap.java:493) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:162) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:39) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:708) at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125) ... 27 more

The jars I used are: kryo-3.0.3.jar kryo-serializers-0.38.jar memcached-session-manager-1.9.7.jar msm-kryo-serializer-1.9.7.jar ... It looks like something is wrong when using hashmap, but I do add a customConverter in context.xml and place the jar in lib. I register hashmap and concurrentHashmap in customConverter like this: `import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap;

import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.serializers.MapSerializer;

import de.javakaffee.web.msm.serializer.kryo.KryoCustomization;

public class CustomKryoRegistration implements KryoCustomization { public void customize(Kryo kryo) { kryo.register(ConcurrentHashMap.class, new MapSerializer()); kryo.register(HashMap.class, new MapSerializer()); } } ` but the exception remains. Could anyone please help me with this issue? Thanks.

yamingwa avatar Jan 13 '17 01:01 yamingwa

Not sure why the CsrfPreventionFilter is serialized,and if this is expected or wrong. But you could write a test for serialization of this CsrfPreventionFilter and see how serialization can be fixed.

magro avatar Jan 13 '17 05:01 magro

Thanks for the reply. After some investigation, I found if I use java serialization, everything worked perfectly. And I also found CsrfPreventionFilter here is inside the value field of session attributes, because java serialization had the following logs: Jan 10, 2017 9:54:34 AM de.javakaffee.web.msm.JavaSerializationTranscoder deserializeAttributes FINE: loading attribute 'org.apache.catalina.filters.CSRF_NONCE' with value 'org.apache.catalina.filters.CsrfPreventionFilter$LruCache@7468776f' Jan 10, 2017 9:54:34 AM de.javakaffee.web.msm.JavaSerializationTranscoder deserializeAttributes FINE: loading attribute 'org.apache.catalina.filters.CSRF_NONCE' with value 'org.apache.catalina.filters.CsrfPreventionFilter$LruCache@7679541d'

So maybe it's not the CsrfPreventionFilter issue here?

yamingwa avatar Jan 13 '17 08:01 yamingwa

Ok. It seems the lrucache in fact should be stored in the session. I had a look at it in https://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java and probably you need a dedicated/custom kryo serializer for the lrucache. Because it's protected you'd have to use reflection a bit. I can provide some guidance if you want to give it a try.

magro avatar Jan 13 '17 21:01 magro

Sorry for the late reply, can you show me the guidance then? I really need it. Thank you so much.

yamingwa avatar Jan 17 '17 07:01 yamingwa