[ 
https://issues.apache.org/jira/browse/HBASE-2269?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12842341#action_12842341
 ] 

Tatsuya Kawano commented on HBASE-2269:
---------------------------------------

@Stack At least Sun JDK, yes, we can expect {{super.hashCode() 
(java.lang.Object#hashCode() )}} to return different integers per instance of 
Test.

Quote from JDK 6 Javadoc: 
http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode()

{quote}
As much as is reasonably practical, the hashCode method defined by class Object 
does return distinct integers for distinct objects. (This is typically 
implemented by converting the internal address of the object into an integer, 
but this implementation technique is not required by the Java programming 
language.)
{quote}

There is no chance of different objects on the same Java VM getting the same 
internal address. 
There will be a very little chance of different objects on different Java VMs 
getting the same internal address. 


Or, if you'd like to avoid this implementation specific behavior, we could do 
something like: 

{code:title=In Test class}
private static final Random randomSeed = new Random(System.currentTimeMillis());
private static long nextRandomSeed() { return randomSeed.nextLong(); }
protected final Random rand = new Random(nextRandomSeed());
{code}

We can expect different map tasks to get different currentTimeMillis() and 
different threads to get different nextLong() values. 


Also, {{java.security.SecureRandom}} has {{getSeed(int numBytes)}} method, and 
Linux version will return perfectly random values based on environmental noise 
collected by OS. However, I don't recommend this because it uses Linux 
{{/dev/random}} as the source and gets blocked when {{/dev/random}} runs out 
the data in its entropy pool. ( http://en.wikipedia.org/wiki//dev/random )   We 
don't need this level of strength anyway. 

Thanks, 


> PerformanceEvaluation "--nomapred" may assign duplicate random seed over 
> multiple testing threads
> -------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-2269
>                 URL: https://issues.apache.org/jira/browse/HBASE-2269
>             Project: Hadoop HBase
>          Issue Type: Bug
>          Components: test
>    Affects Versions: 0.20.3
>         Environment: Any operating system
>            Reporter: Tatsuya Kawano
>            Priority: Minor
>
> When you use PerformanceEvaluation with "--nomapred" option, you will end up 
> having the same random seeds assigned over multiple testing threads. So 
> you'll get inaccurate results from "random~~" tests.
> {code:title=PerformanceEvaluation.java}
> 542:  abstract class Test {
> 543:     protected final Random rand = new Random(System.currentTimeMillis());
> {code}
> Milliseconds won't be sufficient; today's JVM is much faster to create 
> multiple Test objects in one millisecond. You might want to use something 
> like "{{super.hashCode()}}" instead. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to