As I explained above, there is no way to 'cancel' a running scan at
the region server side, we will remove the scanner from the lease map
while we are scanning, so sending a close scanner request to the
region server can only get an unknown scanner exception.

You can configure 'hbase.client.scanner.timeout.period' at region
server side to control how long a scan could run, even if no entries
can be returned, the scan will stop and return a heartbeat message
back to client when reaching the time limit.

And you can also configure a smaller scan timeout at client side, the
time limit of a scan is determine by both the client scan timeout and
'hbase.client.scanner.timeout.period' config at region server side.

Thanks.

Frens Jan Rumph <frens....@web-iq.com.invalid> 于2025年5月16日周五 03:49写道:
>
> Hi Duo,
>
> Thanks for your explanation. This actually what currently is implemented; as 
> in the pseudo code below.
>
> This would be beneficial of course. E.g., if a scan would be a full-table 
> scan with e.g. a column name filter that doesn’t return any results, this 
> would waste a lot of effort in the HBase region server. More actively sending 
> a closeScanner request would prevent this. Right now, we need to wait for the 
> heartbeat interval.
>
> Would such behaviour be desirable from an HBase project/community point of 
> view?
>
> Best regards,
> Frens Jan
>
>
>
>
>
>
> class subscription:
>
>     closed = false
>
>     close():
>         close = true;
>
>     onNext(results, controller):
>         if(closed)
>             controller.terminate();
>         else
>             ...
>
>     onHeartbeat(controller):
>         if(closed)
>             controller.terminate();
>
>
>
>
>
>
> On 15 May 2025, at 17:24, 张铎(Duo Zhang) <palomino...@gmail.com> wrote:
>
> For asynchronous scan, we will send scan request to region server in
> background, and once there is a scan result returned from the region
> server, we can issue the next scan request.
> And in fact, we still do not have the ability to actually 'cancel' a
> scan request which is running at region server side, what we call a
> 'terminate', is to just stop issuing new scan request from client
> side.
>
> The terminate call in ScanController just tells the background task to
> stop sending new request to region server, and it is only valid when
> you have finished a scan request and get the result from region
> server.
>
> For actual implementation, since the scan request is in background,
> you can just use a flag to record that you want to terminate the scan,
> and then you are free to do anything you want. And in the next onNext
> call, you just call terminate to stop sending new scan requests.
>
> Thanks.
>
>

Reply via email to