[
https://issues.apache.org/jira/browse/PHOENIX-1213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14129928#comment-14129928
]
Karel Vervaeke commented on PHOENIX-1213:
-----------------------------------------
For now I'm using the following workaround:
In MutationState.validate() replace this line:
{code}
table = connection.getMetaDataCache().getTable(new PTableKey(tenantId,
table.getName().getString()))
{code}
With this:
{code}
try {
table = connection.getMetaDataCache().getTable(new
PTableKey(tenantId, table.getName().getString()));
} catch (TableNotFoundException tnfe) {
if (tenantId == null) {
throw tnfe;
} else {
table =
connection.getMetaDataCache().getTable(new PTableKey(null,
table.getName().getString()));
}
}
{code}
The problem is obviously that the metadatacache doesn't contain the table using
the actual tenantId in the key.
[~elilevine] Is the cache supposed to have an entry to the 'multi_tenant=true'
table for each tenantId or is the workaround actually the right solution here?
> Upsert and delete do not work for multi-tenant tables using tenant-specific
> connections
> ---------------------------------------------------------------------------------------
>
> Key: PHOENIX-1213
> URL: https://issues.apache.org/jira/browse/PHOENIX-1213
> Project: Phoenix
> Issue Type: Bug
> Reporter: Eli Levine
> Assignee: Eli Levine
> Attachments: csvloader_multitenancy_test.patch
>
>
> Reported by [[email protected]] on user mailing list:
> Here is a first testcase which triggers what
> looks like a bug to me. I would expect this to work, but the last
> statement fails (upsert and commit) with
> org.apache.phoenix.schema.TableNotFoundException: ERROR 1012 (42M03):
> Table undefined. tableName=TEST
> Note that just before, I execute a select query on the same table.
> Thanks for looking into this,
> Jan
> {code}
> @Test
> public void phoenixMultiTenancyTest() throws Exception {
> HBaseTestingUtility testUtil = new HBaseTestingUtility();
> testUtil.startMiniCluster();
> String globalUrl = "jdbc:phoenix:localhost:" +
> testUtil.getConfiguration().get("hbase.zookeeper.property.clientPort");
> Connection globalConn = DriverManager.getConnection(globalUrl);
> Statement stmt = globalConn.createStatement();
> stmt.execute("CREATE TABLE test (tenant_id VARCHAR not null, id
> bigint not null, " +
> "first_name varchar constraint pk primary key(tenant_id, id))
> MULTI_TENANT=true");
> stmt.execute("upsert into test values('jan', 1, 'a')");
> stmt.execute("upsert into test values('bruno', 1, 'b')");
> globalConn.commit();
> String tenantUrl = globalUrl + ";TenantId=jan";
> Connection tenantConn = DriverManager.getConnection(tenantUrl);
> Statement tenantStmt = tenantConn.createStatement();
> // this works and is correctly limited to only data for tenant "jan"
> ResultSet rs = tenantStmt.executeQuery("select id, first_name from
> test");
> Assert.assertTrue(rs.next());
> Assert.assertEquals("1", rs.getString(1));
> Assert.assertEquals("a", rs.getString(2));
> Assert.assertFalse(rs.next());
> // this fails with TableNotFoundException
> tenantStmt.execute("upsert into test values (2, 'b')");
> tenantConn.commit();
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)