You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Feng Honghua (JIRA)" <ji...@apache.org> on 2014/03/04 11:06:20 UTC

[jira] [Commented] (HBASE-10662) RegionScanner should be closed and according lease should be cancelled in regionserver immediately if we find the related region has been re-opened during performing scan request

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

Feng Honghua commented on HBASE-10662:
--------------------------------------

When we find the region has been re-opened during serving scan request from client in regionserver, if we only remove RegionScannerHolder  from scanners but don't close the related scanner. The related lease will be cancelled when it expires, but the related region scanner won't be closed in leaseExpired as expected:
{code}
  public void leaseExpired() {
      RegionScannerHolder rsh = scanners.remove(this.scannerName);
      if (rsh != null) {
        RegionScanner s = rsh.s;
        LOG.info("Scanner " + this.scannerName + " lease expired on region "
            + s.getRegionInfo().getRegionNameAsString());
        try {
          HRegion region = getRegion(s.getRegionInfo().getRegionName());
          if (region != null && region.getCoprocessorHost() != null) {
            region.getCoprocessorHost().preScannerClose(s);
          }

          s.close();
          if (region != null && region.getCoprocessorHost() != null) {
            region.getCoprocessorHost().postScannerClose(s);
          }
        } catch (IOException e) {
          LOG.error("Closing scanner for "
              + s.getRegionInfo().getRegionNameAsString(), e);
        }
      } else {
        LOG.info("Scanner " + this.scannerName + " lease expired");
      }
    }
{code}
In above code, scanners.remove(this.scannerName) will return a null rsh since it has been removed earlier, so the region scanner can't be closed here, which means the related region scanner doesn't have a chance to be closed ever.

> RegionScanner should be closed and according lease should be cancelled in regionserver immediately if we find the related region has been re-opened during performing scan request
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-10662
>                 URL: https://issues.apache.org/jira/browse/HBASE-10662
>             Project: HBase
>          Issue Type: Bug
>          Components: regionserver
>            Reporter: Feng Honghua
>            Assignee: Feng Honghua
>         Attachments: HBASE-10662-trunk_v1.patch
>
>
> During regionserver processes scan request from client, it fails the request by throwing a wrapped NotServingRegionException to client if it finds the region related to the passed-in scanner-id has been re-opened, and it also removes the RegionScannerHolder from the scanners. In fact under this case, the old and invalid RegionScanner related to the passed-in scanner-id should be closed and the related lease should be cancelled at the mean time as well.
> Currently region's related scanners aren't closed when closing the region, a region scanner is closed only when requested explicitly by client, or by expiration of the related lease, in this sense the close of region scanners is quite passive and lag.
> Sounds reasonable to cleanup all related scanners and cancel these scanners' leases after closing a region?



--
This message was sent by Atlassian JIRA
(v6.2#6252)