You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "James Taylor (JIRA)" <ji...@apache.org> on 2016/02/18 23:45:18 UTC

[jira] [Assigned] (PHOENIX-2691) Exception while unpacking resultset containing VARCHAR ARRAY of unspecified length

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

James Taylor reassigned PHOENIX-2691:
-------------------------------------

    Assignee: James Taylor

> Exception while unpacking resultset containing VARCHAR ARRAY of unspecified length
> ----------------------------------------------------------------------------------
>
>                 Key: PHOENIX-2691
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-2691
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.6.0, 4.7.0
>            Reporter: Nick Dimiduk
>            Assignee: James Taylor
>         Attachments: 2691.00.patch
>
>
> I have an aggregation query that consistently throws with either an IllegalArgumentException or an OutOfMemoryException, at the same place. Either way, the stack trace is nearly identical:
> {noformat}
> java.lang.IllegalArgumentException                                                                                                 
>         at java.nio.Buffer.position(Buffer.java:244)                                                                               
>         at org.apache.phoenix.schema.types.PArrayDataType.createPhoenixArray(PArrayDataType.java:1098)                             
>         at org.apache.phoenix.schema.types.PArrayDataType.toObject(PArrayDataType.java:339)                                        
>         at org.apache.phoenix.schema.types.PVarcharArray.toObject(PVarcharArray.java:65)                                           
>         at org.apache.phoenix.schema.types.PDataType.toObject(PDataType.java:985)                                                  
>         at org.apache.phoenix.compile.ExpressionProjector.getValue(ExpressionProjector.java:75)                                    
>         at org.apache.phoenix.jdbc.PhoenixResultSet.getString(PhoenixResultSet.java:601)                                           
>         at sqlline.Rows$Row.<init>(Rows.java:183)                                                                                  
>         at sqlline.BufferedRows.<init>(BufferedRows.java:38)                                                                       
>         at sqlline.SqlLine.print(SqlLine.java:1650)                                                                                
>         at sqlline.Commands.execute(Commands.java:833)                                                                             
>         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}
> or
> {noformat}
> java.lang.OutOfMemoryError: Java heap space
>         at java.lang.reflect.Array.newArray(Native Method)
>         at java.lang.reflect.Array.newInstance(Array.java:75)
>         at org.apache.phoenix.schema.types.PArrayDataType.createPhoenixArray(PArrayDataType.java:1091)
>         at org.apache.phoenix.schema.types.PArrayDataType.toObject(PArrayDataType.java:339)
>         at org.apache.phoenix.schema.types.PVarcharArray.toObject(PVarcharArray.java:65)
>         at org.apache.phoenix.schema.types.PDataType.toObject(PDataType.java:985)
>         at org.apache.phoenix.compile.ExpressionProjector.getValue(ExpressionProjector.java:75)
>         at org.apache.phoenix.jdbc.PhoenixResultSet.getString(PhoenixResultSet.java:601)
>         at sqlline.Rows$Row.<init>(Rows.java:183)
>         at sqlline.BufferedRows.<init>(BufferedRows.java:38)
>         at sqlline.SqlLine.print(SqlLine.java:1650)
>         at sqlline.Commands.execute(Commands.java:833)
>         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}
> Stepping through with the debugger, it appears the {{VARCHAR ARRAY}} value is not parsed correctly. The special case of two nulls is not accounted for in {{RowKeyValueAccessor#getLength()}}. This results in the offsets being slightly wrong and then the value cannot be materialized correctly. Depending on what's in the adjacent bytes either an invalid {{position}} call is made, resulting in the {{IllegalArgumentException}}, or {{PArrayDataType.createPhoenixArray}} attempts to allocate an array of ridiculous size, resulting in the OOM.
> It appears the types of the columns returned in the {{KeyValue}} in the {{Tuple currentRow}} are ordered {{VARCHAR}}, {{VARCHAR ARRAY}}, {{INTEGER}}. I can share the KeyValue bytes with you offline if that will help in debugging.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)