[infinispan-issues] [JBoss JIRA] (ISPN-4125) ClassCastException if cache.keyset() is invoked for a string-keyed-jdbc-store in C/S mode

Adrian Nistor (JIRA) issues at jboss.org
Wed Mar 26 08:11:13 EDT 2014


    [ https://issues.jboss.org/browse/ISPN-4125?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12955932#comment-12955932 ] 

Adrian Nistor edited comment on ISPN-4125 at 3/26/14 8:10 AM:
--------------------------------------------------------------

It finally turns out I can reproduce this only on mysql. Strangely, it works fine with H2, which is used in the test suite. 

The root cause is DefaultTwoWayKey2StringMapper using an unsafe way of encoding a byte[] into a String. It uses a special unicode character (0xFEFF) as prefix for all strings which were mapped and need unmapping when fetched later. Unicode character 0xFEFF is a silent character used for detecting the byte order of the string. Using it for our purpose seems like a neat trick. Unfortunately when the database actually sees this string it is free to interpret the byte ordering instruction and convert the string to native byte order and then discard the marker as no longer necessary. This leaves us with no clue the string was 'marked'  by us. Mysql is such a database, while H2 seems to not interfere here.

After isolating this problem to DefaultTwoWayKey2StringMapper I propose to close this issue and open a new one.
                
      was (Author: anistor):
    It finally turns out I can reproduce this only on mysql. Strangely, it works fine with H2, which is used in the test suite.
                  
> ClassCastException if cache.keyset() is invoked for a string-keyed-jdbc-store in C/S mode
> -----------------------------------------------------------------------------------------
>
>                 Key: ISPN-4125
>                 URL: https://issues.jboss.org/browse/ISPN-4125
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Remote Querying
>    Affects Versions: 6.0.0.Final
>            Reporter: Wolf-Dieter Fink
>            Assignee: Adrian Nistor
>              Labels: 621, 630
>             Fix For: 7.0.0.Alpha2, 7.0.0.Final
>
>         Attachments: reproducer.zip
>
>
> If the cache is empty cache.keyset() invocation returns an empty set.
> If it is invoked after entities are added it failes with the Exception below.
> The same test work if a binary-keyed-jdbc-store is used!
> The HotRod client is based on the hot-rod C/S quickstart.
> The configuration is:
>         <subsystem xmlns="urn:infinispan:server:core:6.0" default-cache-container="clustered">
>             <cache-container name="clustered" default-cache="string" statistics="true">
>                 <transport executor="infinispan-transport" lock-timeout="60000"/>
>                 <replicated-cache name="string" mode="ASYNC" start="EAGER">
>                     <locking isolation="READ_COMMITTED" acquire-timeout="20000" concurrency-level="500" striping="false"/>
>                     <transaction mode="NONE"/>
>                     <string-keyed-jdbc-store datasource="java:jboss/datasources/JDGDatasource" passivation="false" preload="true" purge="false" shared="false">
>                         <!-- property name="databaseType">ORACLE</property -->
>                         <string-keyed-table prefix="qs">
>                             <id-column name="id" type="VARCHAR(255)"/>
>                             <data-column name="datum" type="BLOB(2000)"/>
>                             <timestamp-column name="version" type="BIGINT"/>
>                         </string-keyed-table>
>                         <write-behind modification-queue-size="1024" shutdown-timeout="25000" flush-lock-timeout="15000" thread-pool-size="5" />
>                     </string-keyed-jdbc-store>
>                     <expiration interval="10000" />
>                 </replicated-cache>
> ERROR [org.infinispan.server.hotrod.HotRodDecoder:76] (HotRodServerWorker-88) ISPN005009: Unexpected error before any request parameters read: java.lang.ClassCastException: java.lang.String cannot be cast to [B
> 	at org.infinispan.server.hotrod.AbstractEncoder1x$$anonfun$writeResponse$5.apply(AbstractEncoder1x.scala:113) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at scala.collection.Iterator$class.foreach(Iterator.scala:727)
> 	at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
> 	at org.infinispan.server.hotrod.AbstractEncoder1x.writeResponse(AbstractEncoder1x.scala:113) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.infinispan.server.hotrod.HotRodEncoder.encode(HotRodEncoder.scala:48) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:66) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.Channels.write(Channels.java:704) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.Channels.write(Channels.java:671) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:248) [netty-3.6.6.Final.jar:]
> 	at org.infinispan.server.core.AbstractProtocolDecoder.writeResponse(AbstractProtocolDecoder.scala:163) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.infinispan.server.hotrod.HotRodDecoder.customDecodeKey(HotRodDecoder.scala:138) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.infinispan.server.core.AbstractProtocolDecoder.decodeKey(AbstractProtocolDecoder.scala:105) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.infinispan.server.core.AbstractProtocolDecoder.decode(AbstractProtocolDecoder.scala:53) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.infinispan.server.core.AbstractProtocolDecoder.decode(AbstractProtocolDecoder.scala:29) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:500) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) [netty-3.6.6.Final.jar:]
> 	at org.infinispan.server.core.AbstractProtocolDecoder.messageReceived(AbstractProtocolDecoder.scala:377) [infinispan.jar:7.0.0-SNAPSHOT]
> 	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90) [netty-3.6.6.Final.jar:]
> 	at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [netty-3.6.6.Final.jar:]
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
> 	at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the infinispan-issues mailing list