From 4719e8ad6cfb8f230436534b66e90ea117c0830a Mon Sep 17 00:00:00 2001 From: Karel Vervaeke Date: Fri, 12 Sep 2014 11:20:08 +0200 Subject: [PATCH] PHOENIX-1213 Avoid TableNotFoundException on update/delete to multi-tenant tables Added test case + solution --- .../phoenix/end2end/CSVCommonsLoaderIT.java | 51 ++++++++++++++++++- .../apache/phoenix/execute/MutationState.java | 3 +- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CSVCommonsLoaderIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CSVCommonsLoaderIT.java index b280be4edf8..9f36b93287f 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CSVCommonsLoaderIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CSVCommonsLoaderIT.java @@ -41,7 +41,6 @@ import org.apache.phoenix.util.PhoenixRuntime; import org.junit.Test; import org.junit.experimental.categories.Category; - @Category(HBaseManagedTimeTest.class) public class CSVCommonsLoaderIT extends BaseHBaseManagedTimeIT { @@ -50,6 +49,7 @@ public class CSVCommonsLoaderIT extends BaseHBaseManagedTimeIT { + "KEY1,A,2147483647,1.1,0,TRUE,9223372036854775807,0,1990-12-31 10:59:59,1999-12-31 23:59:59\n" + "KEY2,B,-2147483648,-1.1,2147483647,FALSE,-9223372036854775808,9223372036854775807,2000-01-01 00:00:01,2012-02-29 23:59:59\n"; private static final String STOCK_TABLE = "STOCK_SYMBOL"; + private static final String STOCK_TABLE_MULTI = "STOCK_SYMBOL_MULTI"; private static final String STOCK_CSV_VALUES = "AAPL,APPLE Inc.\n" + "CRM,SALESFORCE\n" + "GOOG,Google\n" + "HOG,Harlet-Davidson Inc.\n" + "HPQ,Hewlett Packard\n" @@ -139,6 +139,55 @@ public void testCSVCommonsUpsert() throws Exception { } } + @Test + public void testCSVCommonsUpsert_MultiTenant() throws Exception { + CSVParser parser = null; + PhoenixConnection globalConn = null; + PhoenixConnection tenantConn = null; + try { + + // Create table using the global connection + String statements = "CREATE TABLE IF NOT EXISTS " + STOCK_TABLE_MULTI + + "(TENANT_ID VARCHAR NOT NULL, SYMBOL VARCHAR NOT NULL, COMPANY VARCHAR," + + " CONSTRAINT PK PRIMARY KEY(TENANT_ID,SYMBOL)) MULTI_TENANT = true;"; + globalConn = DriverManager.getConnection(getUrl()).unwrap( + PhoenixConnection.class); + PhoenixRuntime.executeStatements(globalConn, + new StringReader(statements), null); + globalConn.close(); + + tenantConn = DriverManager.getConnection(getUrl() + ";TenantId=acme").unwrap( + PhoenixConnection.class); + + // Upsert CSV file + CSVCommonsLoader csvUtil = new CSVCommonsLoader(tenantConn, STOCK_TABLE_MULTI, + Collections. emptyList(), true); + csvUtil.upsert(new StringReader(STOCK_CSV_VALUES_WITH_HEADER)); + + // Compare Phoenix ResultSet with CSV file content + PreparedStatement statement = tenantConn + .prepareStatement("SELECT SYMBOL, COMPANY FROM " + + STOCK_TABLE_MULTI); + ResultSet phoenixResultSet = statement.executeQuery(); + parser = new CSVParser(new StringReader( + STOCK_CSV_VALUES_WITH_HEADER), csvUtil.getFormat()); + for (CSVRecord record : parser) { + assertTrue(phoenixResultSet.next()); + int i = 0; + for (String value : record) { + assertEquals(value, phoenixResultSet.getString(i + 1)); + i++; + } + } + assertFalse(phoenixResultSet.next()); + } finally { + if (parser != null) + parser.close(); + if (tenantConn != null) + tenantConn.close(); + } + } + @Test public void testTDVCommonsUpsert() throws Exception { CSVParser parser = null; diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java index 564e1507145..8972650f60d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java @@ -47,7 +47,6 @@ import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PRow; import org.apache.phoenix.schema.PTable; -import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.TableRef; import org.apache.phoenix.trace.util.Tracing; import org.apache.phoenix.util.ByteUtil; @@ -292,7 +291,7 @@ private long[] validate() throws SQLException { serverTimeStamp = timestamp; if (result.wasUpdated()) { // TODO: use bitset? - table = connection.getMetaDataCache().getTable(new PTableKey(tenantId, table.getName().getString())); + table = result.getTable(); PColumn[] columns = new PColumn[table.getColumns().size()]; for (Map.Entry> rowEntry : entry.getValue().entrySet()) { Map valueEntry = rowEntry.getValue();