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

Hiroshi Ikeda commented on HBASE-7437:
--------------------------------------

An instance of Calendar automatically update its internal time only just after 
its creation.

That means, without explicitly updating the internal time, a static field of 
Calendar always returns the same hour when the nesting class was loaded.

Moreover, since Calendar is not thread safe and the static field is intended to 
called by multiple threads, some synchronization is required while updating the 
internal time and getting the corresponding hour. (I think it is safe to get 
the hour without synchronization if we never update the time, even though it is 
useless.)

Contention between threads causes context switches, which are quite huge 
overhead that we should give priority to remove, and the most simple way to 
remove the worry is creating an instance for each call. But, as you mentioned, 
the implementation logic of GregorianCalendar is complex and it is possible 
that we cannot ignore both of overheads of creating an instance and updating 
its time.

For this reason, I created the independent class CurrentHourProvider in order 
to encapsulate its implementation details, and tried to reduce the above 
overheads without blocking threads. Of course it is overkill if the current 
hour is not so frequently required that it is acceptable to create an instance 
of Calendar for each call.


                
> Improve CompactSelection
> ------------------------
>
>                 Key: HBASE-7437
>                 URL: https://issues.apache.org/jira/browse/HBASE-7437
>             Project: HBase
>          Issue Type: Improvement
>          Components: Compaction
>            Reporter: Hiroshi Ikeda
>            Assignee: Hiroshi Ikeda
>            Priority: Minor
>         Attachments: HBASE-7437.patch, HBASE-7437-V2.patch, 
> HBASE-7437-V3.patch, HBASE-7437-V4.patch
>
>
> 1. Using AtomicLong makes CompactSelection simple and improve its performance.
> 2. There are unused fields and methods.
> 3. The fields should be private.
> 4. Assertion in the method finishRequest seems wrong:
> {code}
>   public void finishRequest() {
>     if (isOffPeakCompaction) {
>       long newValueToLog = -1;
>       synchronized(compactionCountLock) {
>         assert !isOffPeakCompaction : "Double-counting off-peak count for 
> compaction";
> {code}
> The above assertion seems almost always false.

--
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

Reply via email to