[infinispan-dev] Infinispan 5.1.x Object marshalling with and without a class table in use and unmarshalling smacking its head against the wall...
Scott Marlow
smarlow at redhat.com
Fri Oct 12 09:47:43 EDT 2012
ReplicableCommandExternalizer.writeCommandParameters() can marshall an
instance of class org.infinispan.util.ImmutableListCopy (as a
ID_EXTERNALIZABLE_CLASS) fine. If the classtable doesn't know about the
org.infinispan.util.ImmutableListCopy class, we also marshall the AS7
module name (org.infinispan) and module slot name (main). The
marshalled byte output looks something like the following (this is the
successful case). I apologize for the crappy hex/character dump :).
Each hex value is preceded by '0x' and followed by an extra space separator.
*class table does not have ImmutableListCopy class case*
0x03 0x01 0xFE 0x03 J0x00 0x00 0x11 0x00 0x00 0x00 0x1A
default-host/distributable0xAE 0x01 0x03 0x01 0xFE 0x06 I0x02 0x03 '0x02
])0xDE +?>0x85 0xBF 0xEC 0xCD P0xCB 0x8E 20x9E 0xD0 K0x00 0x00 0x00 0x07
0x04 0x0A 0x00 0x00 0x00 %org.infinispan.util.ImmutableListCopy0x00 0x00
0x09 0xF0 0xBD 0x13 q0x06 >0x0E org.infinispan>0x04 main20x04 0x00 0x00
0x00 0x02 0x03 '0x02 ])0xDE +?>0x85 0xBF 0xEC 0xCD P0xCB 0x8E 20x9E 0xD0
0x03 '0x02 0xB4 0x0D 00x8C 0x98 0xCF M0x89 0xF1 d|}0x0A 0x0B 0xA3 0xCD
5K0x00 0x00 0x00 0x06 0x03 0x04 0x03 '0x02 ])0xDE +?>0x85 0xBF 0xEC 0xCD
P0xCB 0x8E 20x9E 0xD0
Notice that the "org.infinispan.util.ImmutableListCopy" (on middle of
fourth line) is followed by about 10 separator bytes (of some importance
I'm sure :). After the 10 separator bytes, is the module name
(org.infinispan) and that is followed by more separator bytes and then
the module slot name (main). Again, this is the *working case*.
If the classtable does have an entry for the
org.infinispan.util.ImmutableListCopy class,
ReplicableCommandExternalizer.writeCommandParameters() appears to
instead write out some binary values that unmarshalling won't know how
to deal with later. The hexdump for the *failing case* looks like:
*class table does have ImmutableListCopy class case*
0x03 0x01 0xFE 0x03 J0x00 0x00 0x11 0x00 0x00 0x00
Dorg.jboss.as.test.clustering.cluster.ejb3.stateful.bean.StatefulBean0x98 0x01
0x03 0x01 0xFE 0x06 I0x02 0x03 '0x02 0xD5 0xFD 0xCC 0xC7 0xFD 0x10 0xCC
Q70xF7 0x9C %lZ5K0x00 0x00 0x00 0x14 0x04 0x0A 0x00 0x00 0x00
%org.infinispan.util.ImmutableListCopy0x00 0x00 0x09 0xF0 0xBD 0x13
q0x06 20x04 0x00 0x00 0x00 0x02 0x03 '0x02 H0xC6 0xD0 w0xEA 10xEA 0x97
U0xDC 0xE6 0x1C B0x99 s0xF1 0x03 '0x02 0xD5 0xFD 0xCC 0xC7 0xFD 0x10
0xCC Q70xF7 0x9C %lZ55K0x00 0x00 0x00 0x13 0x03 0x04 0x03 '0x02 H0xC6
0xD0 w0xEA 10xEA 0x97 U0xDC 0xE6 0x1C B0x99 s0xF1
In the above, the "org.infinispan.util.ImmutableListCopy" field is
followed by various bytes but no module name.
Later during when unmarshalling this payload, we reach code that doesn't
understand how to unmarshall. http://pastie.org/5043963 shows the
failing callstack (partially below for your convenience). It seems to
me, that somewhere in unmarshalling (Object) code, we need to check if a
class table was used and use the marshalled form instead.
org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:751)
org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209)
org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:37)
org.jboss.marshalling.ModularClassResolver.resolveClass(ModularClassResolver.java:101)
org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:938)
org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1210)
org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:272)
org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209)
org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:37)
org.infinispan.marshall.exts.ReplicableCommandExternalizer.readParameters(ReplicableCommandExternalizer.java:158)
This is recreating on the AS 7.1 branch, with jboss-marshalling 1.3.17.x
and Infinispan 5.1.x.
I'll get closer to understanding the problem, but I need to hear from
the Infinispan champion of marshalling and class table handling. So, I
can coordinate effort with him/her. I also wanted to share what we are
seeing as well with the team. :)
Scott
More information about the infinispan-dev
mailing list