You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "JeongMin Ju (Jira)" <ji...@apache.org> on 2026/03/27 01:34:00 UTC
[jira] [Created] (HBASE-30033) Scan.setBatch() validation can be bypassed by calling setBatch() before setFilter()
JeongMin Ju created HBASE-30033:
-----------------------------------
Summary: Scan.setBatch() validation can be bypassed by calling setBatch() before setFilter()
Key: HBASE-30033
URL: https://issues.apache.org/jira/browse/HBASE-30033
Project: HBase
Issue Type: Bug
Components: Client
Affects Versions: 2.5.11
Reporter: JeongMin Ju
Scan.setBatch(int) validates that the scan does not have a filter with hasFilterRow() == true, throwing IncompatibleFilterException if it does. However, Scan.setFilter(Filter) does not perform the reverse check against an existing batch setting.
This means calling setBatch() before setFilter() silently creates an invalid Scan configuration that setBatch() was designed to prevent:
{code:java}
// This correctly throws IncompatibleFilterException
Scan scan = new Scan();
scan.setFilter(new PageFilter(10));
scan.setBatch(5); // throws IncompatibleFilterException
// This silently creates the same invalid combination
Scan scan = new Scan();
scan.setBatch(5); // succeeds - no filter yet
scan.setFilter(new PageFilter(10)); // succeeds - no batch check
// scan now has both batch and hasFilterRow()=true filter
{code}
When this invalid Scan is executed, setBatch splits rows into partial results, but filterRow() operates on partial data instead of the full row, producing incorrect results.
Fix suggestion: Add validation in setFilter(Filter) to check if batch is already set:
{code:java}
public Scan setFilter(Filter filter) {
super.setFilter(filter);
if (this.batch > 0 && filter != null && filter.hasFilterRow()) {
throw new IncompatibleFilterException(
"Cannot set a filter that returns true for hasFilterRow on a scan with batch set");
}
return this;
}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)