[
https://issues.apache.org/jira/browse/PHOENIX-1213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14130393#comment-14130393
]
James Taylor commented on PHOENIX-1213:
---------------------------------------
Thanks for looking into this, [[email protected]]. Prior to the call
to connection.getMetaDataCache().getTable(), we make the following call in
MutationState.validate():
{code}
MetaDataMutationResult result =
client.updateCache(table.getSchemaName().getString(),
table.getTableName().getString());
{code}
This call first looks for the table in the cache and if not found, asks the
server for it. If the server doesn't find it with the tenantId, then it tries
again with a null tenantId. The root cause would be here and figuring out why
this doesn't work in your case. Are you on 3.1/4.1, as if not, this issue is
likely already fixed (and I'd recommend you upgrade as the new release has many
bug fixes).
> 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)