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