phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Soldatov (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (PHOENIX-4608) Concurrent modification of bitset in ProjectedColumnExpression
Date Thu, 15 Feb 2018 05:51:00 GMT

     [ https://issues.apache.org/jira/browse/PHOENIX-4608?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Sergey Soldatov updated PHOENIX-4608:
-------------------------------------
    Attachment: PHOENIX-4608-v1.patch

> Concurrent modification of bitset in ProjectedColumnExpression
> --------------------------------------------------------------
>
>                 Key: PHOENIX-4608
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-4608
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.14.0
>            Reporter: Sergey Soldatov
>            Assignee: Sergey Soldatov
>            Priority: Major
>             Fix For: 4.14.0
>
>         Attachments: PHOENIX-4608-v1.patch
>
>
> in ProjectedColumnExpression we are using an instance of ValueBitSet to track nulls during
evaluate calls. We are using a single instance of ProjectedColumnExpression per column across
all threads running in parallel, so it may happen that one thread call bitSet.clear() and
another thread is using it in isNull at the same time, making a wrong assumption that the
value is null.  We saw that problem when query like 
> {noformat}
> upsert into C select trim (A.ID), B.B From (select ID, SUM(1) as B from T1 group by ID)
as B join T2 as A on A.ID = B.ID;  
> {noformat}
> During the execution earlier mentioned condition happen and we don't advance from the
char column (A.ID)  to int (B.B) and get an exception like
> {noformat}
> Error: ERROR 201 (22000): Illegal data. BIGINT value -6908486506036322272 cannot be cast
to Integer without changing its value (state=22000,code=201) 
> java.sql.SQLException: ERROR 201 (22000): Illegal data. BIGINT value -6908486506036322272
cannot be cast to Integer without changing its value 
> at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:442)

> at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:150)

> at org.apache.phoenix.util.ServerUtil.parseRemoteException(ServerUtil.java:129) 
> at org.apache.phoenix.util.ServerUtil.parseServerExceptionOrNull(ServerUtil.java:118)

> at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:107) 
> at org.apache.phoenix.iterate.BaseResultIterators.getIterators(BaseResultIterators.java:771)

> at org.apache.phoenix.iterate.BaseResultIterators.getIterators(BaseResultIterators.java:714)

> at org.apache.phoenix.iterate.RoundRobinResultIterator.getIterators(RoundRobinResultIterator.java:176)

> at org.apache.phoenix.iterate.RoundRobinResultIterator.next(RoundRobinResultIterator.java:91)

> at org.apache.phoenix.iterate.DelegateResultIterator.next(DelegateResultIterator.java:44)

> at org.apache.phoenix.compile.UpsertCompiler$2.execute(UpsertCompiler.java:797) 
> at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:343) 
> at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:331) 
> at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53) 
> at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:329)

> at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1440) 
> at sqlline.Commands.execute(Commands.java:822) 
> at sqlline.Commands.sql(Commands.java:732) 
> at sqlline.SqlLine.dispatch(SqlLine.java:808) 
> at sqlline.SqlLine.begin(SqlLine.java:681) 
> at sqlline.SqlLine.start(SqlLine.java:398) 
> at sqlline.SqlLine.main(SqlLine.java:292)
> {noformat}
> Fortunately, bitSet is the only field we continuously modify in that class, so we may
fix this problem by making it ThreadLocal. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message