hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guangxu Cheng (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (HBASE-17302) the region flush request disappeared from flushQueue
Date Tue, 13 Dec 2016 12:03:58 GMT

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

Guangxu Cheng updated HBASE-17302:
----------------------------------
    Attachment: HBASE-17302-branch-master-v1.patch

> 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
>         Attachments: HBASE-17302-branch-1.2-v1.patch, HBASE-17302-branch-master-v1.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)

Mime
View raw message