You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hbase.apache.org by "Anoop Sam John (JIRA)" <ji...@apache.org> on 2016/12/20 06:33:58 UTC

[jira] [Reopened] (HBASE-17302) The region flush request disappeared from flushQueue

     [ https://issues.apache.org/jira/browse/HBASE-17302?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Anoop Sam John reopened HBASE-17302:
------------------------------------

> The region flush request disappeared from flushQueue
> ----------------------------------------------------
>
>                 Key: HBASE-17302
>                 URL: https://issues.apache.org/jira/browse/HBASE-17302
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 2.0.0, 0.98.23, 1.2.4
>            Reporter: Guangxu Cheng
>            Assignee: Guangxu Cheng
>             Fix For: 2.0.0, 1.4.0
>
>         Attachments: HBASE-17302-branch-1-addendum-v1.patch, HBASE-17302-branch-1-addendum.patch, HBASE-17302-branch-1.2-v1.patch, HBASE-17302-branch-master-v1.patch, HBASE-17302-master-addendum-v1.patch, HBASE-17302-master-addendum.patch
>
>
> Region has too many store files delaying flush up to blockingWaitTime ms, and the region flush request is requeued into the flushQueue.
> When the region flush request is requeued into the flushQueue frequently, the request is inexplicably disappeared sometimes. 
> But regionsInQueue still contains the information of the region request, which leads to new flush request can not be inserted into the flushQueue.
> Then, the region will not do flush anymore.
> In order to locate the problem, I added a lot of log in the code.
> {code:title=MemStoreFlusher.java|borderStyle=solid}
> private boolean flushRegion(final HRegion region, final boolean emergencyFlush) {
> long startTime = 0;
> synchronized (this.regionsInQueue) {
>   FlushRegionEntry fqe = this.regionsInQueue.remove(region);
>   // Use the start time of the FlushRegionEntry if available
>   if (fqe != null) {
> 	startTime = fqe.createTime;
>   }
>   if (fqe != null && emergencyFlush) {
> 	// Need to remove from region from delay queue.  When NOT an
> 	// emergencyFlush, then item was removed via a flushQueue.poll.
> 	flushQueue.remove(fqe);
>  }
> }
> {code}
> When encountered emergencyFlush, the region flusher will be removed from the flushQueue.
> By comparing the flushQueue content before and after remove, RegionA should have been removed, it is possible to remove RegionB.
> {code:title=MemStoreFlusher.java|borderStyle=solid}
> public boolean equals(Object obj) {
>   if (this == obj) {
> 	return true;
>   }
>   if (obj == null || getClass() != obj.getClass()) {
> 	return false;
>   }
>   Delayed other = (Delayed) obj;
>   return compareTo(other) == 0;
> }
> {code}
> FlushRegionEntry in achieving the equals function, only comparison of the delay time, if different regions of the same delay time, it is possible that A wrong B.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)