[infinispan-issues] [JBoss JIRA] Commented: (ISPN-809) CassandraCacheStore needs special handling of array type keys
Galder Zamarreño (JIRA)
jira-events at lists.jboss.org
Wed Dec 1 11:11:06 EST 2010
[ https://jira.jboss.org/browse/ISPN-809?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12566574#comment-12566574 ]
Galder Zamarreño commented on ISPN-809:
---------------------------------------
One thing worth noting here is that printing the hashcode is actually an optional thing. I can't remember whether why I made ByteArrayKey.toString() print the hashcode but most likely is due to debugging. At first glance I don't see the need to print the hashcode, but it's true as well depending on the output of ByteArrayKey.toString() is dangerous, cos if you really wanted to get full information and be able to differentiate between diff keys, you'd need to print the full byte array which might be several kb/mb/gb.
As agreed here, a separation between String and non String keys might be necessary to provide the right solution.
> CassandraCacheStore needs special handling of array type keys
> -------------------------------------------------------------
>
> Key: ISPN-809
> URL: https://jira.jboss.org/browse/ISPN-809
> Project: Infinispan
> Issue Type: Bug
> Components: Loaders and Stores
> Affects Versions: 4.2.0.CR2
> Reporter: Jonas Lasson
> Assignee: Tristan Tarrant
> Priority: Critical
> Fix For: 4.2.0.CR3
>
>
> Currently the Cassandra store is creating CassandraKeys based on the keys .toString method, see below:
> private String hashKey(Object key) {
> return entryKeyPrefix + key.toString();
> }
> When HotRod server is used the key will be a ByteArrayKey, which has a toString that is non deterministic and outputs (3 examples with the same byte array):
> ByteArrayKey{data=ByteArray{size=8, hashCode=33d626a4, array=[2, 62, 5, 74, 79, 78, 65, 83, ..]}}
> ByteArrayKey{data=ByteArray{size=8, hashCode=2ada52a1, array=[2, 62, 5, 74, 79, 78, 65, 83, ..]}}
> ByteArrayKey{data=ByteArray{size=8, hashCode=5576b9ea, array=[2, 62, 5, 74, 79, 78, 65, 83, ..]}}
> As you can see the hashCode is differing even though the byte array is the same.
> This is because ByteArrayKey.toString is using Util.printArray(byte[],true) where true means that a hashCode should be printed as well.
> Unfortenaly, the hashcode is calculated with byte[].hashCode() which is not considering the data in the byte array.
> There are several solutions to the problem:
> * Have another mechanism to export unique ids from the key instead of toString (with a possible toString fallback)
> * Fix so that ByteArrayKey.toString returns deterministic data. (Still bad solution as the keys will be very long and not make sense).
> * Special handling for ByteArrayKey to calculate the key based on the bytes in the byte array.
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the infinispan-issues
mailing list