[
https://issues.apache.org/jira/browse/PHOENIX-2613?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
chenglei updated PHOENIX-2613:
------------------------------
Description:
In pheonix 4.6,any column of multi-part primary key can be null.If a table has
one row which has a column of multi-part primary key is null, and the java
assert is disable, when we do a query,the Skip Scan may cause RegionServer scan
indefinite loop,just as the follow unit test:
{code:borderStyle=solid}
@Test
public void testNullInfiniteLoop() throws Exception
{
this.jdbcTemplate.update("drop table if exists NULL_TEST ");
this.jdbcTemplate.update(
"create table NULL_TEST"+
"("+
"CREATETIME VARCHAR,"+
"ACCOUNTID VARCHAR,"+
"SERVICENAME VARCHAR,"+
"SPAN.APPID VARCHAR,"+
"CONSTRAINT pk PRIMARY KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+
")");
this.jdbcTemplate.update("upsert into
NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID)
values('20160116141006','servlet','android')");
this.jdbcTemplate.update("upsert into
NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID)
values('20160116151006','2404787','jdbc','ios')");
this.jdbcTemplate.queryForList("select * from NULL_TEST where
CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and
ACCOUNTID='2404787'");
}
{code}
As above unit test explained,we create a NULL_TEST table, and insert a row
which ACCOUNT column is null, When we do a query which condition is CREATETIME
column and ACCOUNTID column, Phoenix will use SkipScanFilter to scan the table.
Unfortunately,the query will run forever,can not return result.
If we construct a SkipScanFilter using the above query condition,and we can
see after the SkipScanFilter's filterKeyValue method is called on the KeyValue
which rowKey is
{{"20160116141006\\x00\\x00servlet"}}(the ACCOUNT column is null),
the SkipScanFilter will return a erroneous NextHintCell value
"20160116141006\\x00\\x002404787",which should be "20160116141006\\x002404787"
{noformat}
was:
In pheonix 4.6,any column of multi-part primary key can be null.If a table has
one row which has a column of multi-part primary key is null, and the java
assert is disable, when we do a query,the Skip Scan may cause RegionServer scan
indefinite loop,just as the follow unit test:
{code:borderStyle=solid}
@Test
public void testNullInfiniteLoop() throws Exception
{
this.jdbcTemplate.update("drop table if exists NULL_TEST ");
this.jdbcTemplate.update(
"create table NULL_TEST"+
"("+
"CREATETIME VARCHAR,"+
"ACCOUNTID VARCHAR,"+
"SERVICENAME VARCHAR,"+
"SPAN.APPID VARCHAR,"+
"CONSTRAINT pk PRIMARY KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+
")");
this.jdbcTemplate.update("upsert into
NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID)
values('20160116141006','servlet','android')");
this.jdbcTemplate.update("upsert into
NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID)
values('20160116151006','2404787','jdbc','ios')");
this.jdbcTemplate.queryForList("select * from NULL_TEST where
CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and
ACCOUNTID='2404787'");
}
{code}
As above unit test explained,we create a NULL_TEST table, and insert a row
which ACCOUNT column is null, When we do a query which condition is CREATETIME
column and ACCOUNTID column, Phoenix will use SkipScanFilter to scan the table.
Unfortunately,the query will run forever,can not return result.
{noformat}
If we construct a SkipScanFilter using the above query condition,and we can
see after the SkipScanFilter's filterKeyValue method is called on the KeyValue
which rowKey is
"20160116141006\\x00\\x00servlet"(the ACCOUNT column is null),
the SkipScanFilter will return a erroneous NextHintCell value
"20160116141006\\x00\\x002404787",which should be "20160116141006\\x002404787"
{noformat}
> if any column of multi-part primary key is null, the Skip Scan may cause
> RegionServer scan indefinite loop
> ----------------------------------------------------------------------------------------------------------
>
> Key: PHOENIX-2613
> URL: https://issues.apache.org/jira/browse/PHOENIX-2613
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.6.0
> Environment: HBase 0.98.6-cdh5.3.2, Phoenix 4.6.0-HBase-0.98
> Reporter: chenglei
>
> In pheonix 4.6,any column of multi-part primary key can be null.If a table
> has one row which has a column of multi-part primary key is null, and the
> java assert is disable, when we do a query,the Skip Scan may cause
> RegionServer scan indefinite loop,just as the follow unit test:
> {code:borderStyle=solid}
> @Test
> public void testNullInfiniteLoop() throws Exception
> {
> this.jdbcTemplate.update("drop table if exists NULL_TEST ");
>
> this.jdbcTemplate.update(
> "create table NULL_TEST"+
> "("+
> "CREATETIME VARCHAR,"+
> "ACCOUNTID VARCHAR,"+
> "SERVICENAME VARCHAR,"+
> "SPAN.APPID VARCHAR,"+
> "CONSTRAINT pk PRIMARY
> KEY(CREATETIME,ACCOUNTID,SERVICENAME)"+
> ")");
>
> this.jdbcTemplate.update("upsert into
> NULL_TEST(CREATETIME,SERVICENAME,SPAN.APPID)
> values('20160116141006','servlet','android')");
> this.jdbcTemplate.update("upsert into
> NULL_TEST(CREATETIME,ACCOUNTID,SERVICENAME,SPAN.APPID)
> values('20160116151006','2404787','jdbc','ios')");
> this.jdbcTemplate.queryForList("select * from NULL_TEST where
> CREATETIME>='20160116121006' and CREATETIME<='20160116181006' and
> ACCOUNTID='2404787'");
>
> }
> {code}
> As above unit test explained,we create a NULL_TEST table, and insert a row
> which ACCOUNT column is null, When we do a query which condition is
> CREATETIME column and ACCOUNTID column, Phoenix will use SkipScanFilter to
> scan the table. Unfortunately,the query will run forever,can not return
> result.
> If we construct a SkipScanFilter using the above query condition,and we can
> see after the SkipScanFilter's filterKeyValue method is called on the
> KeyValue which rowKey is
> {{"20160116141006\\x00\\x00servlet"}}(the ACCOUNT column is null),
> the SkipScanFilter will return a erroneous NextHintCell value
> "20160116141006\\x00\\x002404787",which should be
> "20160116141006\\x002404787"
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)