Hiroshi Ikeda commented on HBASE-10656:

- The Counter is not intended to be frequently created and discarded into 
garbage. There seems many abuses :P

- The javadoc of sun.misc.Contended in Java 8 says: "The effects of this 
annotation will nearly always add significant space overhead to objects." It 
seems VM implementations will automatically add pads for you and abusing 
LongAdder will still cause the same memory issue.

- As I wrote in HBASE-16616, it would be good to change indexHolderThreadLocal 
to be static, not only to avoid frequently calling 
ThreadLocalMap.expungeStaleEntry, also to avoid frequently calling 
ThreadLocalMap.getEntryAfterMiss, which seems the cause of HBASE-16146 
according to comments, but still counters require memory overhead and should 
not be abused.

- Revert HBASE-16146 or it would be better to replace all counters with 
AtomicLong. Cache line contention is difficult to be detected on the language 
level and we should stretch a net to catch the sign by chance through many 
cache line contentions occur, even though the degradation is visible, and it 
wastes to use the sign just once, throw away, and continue to suffer further 

- I don't like to remove pads and pray :P

>  high-scale-lib's Counter depends on Oracle (Sun) JRE, and also has some bug
> ----------------------------------------------------------------------------
>                 Key: HBASE-10656
>                 URL: https://issues.apache.org/jira/browse/HBASE-10656
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Hiroshi Ikeda
>            Assignee: Hiroshi Ikeda
>            Priority: Minor
>             Fix For: 0.96.2, 0.98.1, 0.99.0
>         Attachments: 10656-098.v2.txt, 10656-trunk.v2.patch, 10656.096v2.txt, 
> HBASE-10656-0.96.patch, HBASE-10656-addition.patch, HBASE-10656-trunk.patch, 
> MyCounter.java, MyCounter2.java, MyCounter3.java, MyCounterTest.java, 
> MyCounterTest.java, PerformanceTestApp.java, PerformanceTestApp2.java, 
> output.pdf, output.txt, output2.pdf, output2.txt
> Cliff's high-scale-lib's Counter is used in important classes (for example, 
> HRegion) in HBase, but Counter uses sun.misc.Unsafe, that is implementation 
> detail of the Java standard library and belongs to Oracle (Sun). That 
> consequently makes HBase depend on the specific JRE Implementation.
> To make matters worse, Counter has a bug and you may get wrong result if you 
> mix a reading method into your logic calling writing methods.
> In more detail, I think the bug is caused by reading an internal array field 
> without resolving memory caching, which is intentional the comment says, but 
> storing the read result into a volatile field. That field may be not changed 
> after you can see the true values of the array field, and also may be not 
> changed after updating the "next" CAT instance's values in some race 
> condition when extending CAT instance chain.
> Anyway, it is possible that you create a new alternative class which only 
> depends on the standard library. I know Java8 provides its alternative, but 
> HBase should support Java6 and Java7 for some time.

This message was sent by Atlassian JIRA

Reply via email to