IMPALA-5579: Fix IndexOutOfBoundsException in GetTables metadata request Issue: GetTables metadata request may result in an IndexOutOfBoundsException while accessing table comments fields if one or more tables can't be retrieved from the catalog cache.
Fix: Only add tables that can be retrieved from the catalog cache (i.e. no TableLoadingException is thrown) in the result of a GetTables request. Change-Id: Ic933b9950d58e6f880d4078faf1a69ee7c6adbf1 Reviewed-on: http://gerrit.cloudera.org:8080/7296 Reviewed-by: Dimitris Tsirogiannis <[email protected]> Tested-by: Impala Public Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/466808ae Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/466808ae Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/466808ae Branch: refs/heads/master Commit: 466808aede88df3bb6b6f8faff39ab5db8103955 Parents: 91dbeb3 Author: Dimitris Tsirogiannis <[email protected]> Authored: Mon Jun 26 11:12:43 2017 -0700 Committer: Impala Public Jenkins <[email protected]> Committed: Tue Jun 27 02:36:46 2017 +0000 ---------------------------------------------------------------------- .../main/java/org/apache/impala/service/MetadataOp.java | 2 +- .../test/java/org/apache/impala/service/FrontendTest.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/466808ae/fe/src/main/java/org/apache/impala/service/MetadataOp.java ---------------------------------------------------------------------- diff --git a/fe/src/main/java/org/apache/impala/service/MetadataOp.java b/fe/src/main/java/org/apache/impala/service/MetadataOp.java index 3bf7534..6883bac 100644 --- a/fe/src/main/java/org/apache/impala/service/MetadataOp.java +++ b/fe/src/main/java/org/apache/impala/service/MetadataOp.java @@ -272,7 +272,6 @@ public class MetadataOp { List<List<Column>> tablesColumnsList = Lists.newArrayList(); List<String> tableComments = Lists.newArrayList(); for (String tabName: fe.getTableNames(db.getName(), tablePatternMatcher, user)) { - tableList.add(tabName); Table table = null; try { table = catalog.getTable(db.getName(), tabName); @@ -291,6 +290,7 @@ public class MetadataOp { comment = table.getMetaStoreTable().getParameters().get("comment"); columns.addAll(fe.getColumns(table, columnPatternMatcher, user)); } + tableList.add(tabName); tablesColumnsList.add(columns); tableComments.add(Strings.nullToEmpty(comment)); } http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/466808ae/fe/src/test/java/org/apache/impala/service/FrontendTest.java ---------------------------------------------------------------------- diff --git a/fe/src/test/java/org/apache/impala/service/FrontendTest.java b/fe/src/test/java/org/apache/impala/service/FrontendTest.java index c3faa0a..d303315 100644 --- a/fe/src/test/java/org/apache/impala/service/FrontendTest.java +++ b/fe/src/test/java/org/apache/impala/service/FrontendTest.java @@ -207,6 +207,16 @@ public class FrontendTest extends FrontendTestBase { assertEquals("", row.colVals.get(4).string_val); } } + + // Make sure tables that can't be loaded don't result in errors in the GetTables + // request (see IMPALA-5579) + req = new TMetadataOpRequest(); + req.opcode = TMetadataOpcode.GET_TABLES; + req.get_tables_req = new TGetTablesReq(); + req.get_tables_req.setSchemaName("functional"); + req.get_tables_req.setTableName("hive_index_tbl"); + resp = execMetadataOp(req); + assertEquals(0, resp.rows.size()); } @Test
