[
https://issues.apache.org/jira/browse/PHOENIX-6129?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17215386#comment-17215386
]
ASF GitHub Bot commented on PHOENIX-6129:
-----------------------------------------
virajjasani commented on pull request #920:
URL: https://github.com/apache/phoenix/pull/920#issuecomment-710038097
@ChinmaySKulkarni IMHO we can not live without `tableExists()` call because
`Connection.getTable()` has no guarantee that it will throw
`TableNotFoundException` if table doesn't exist. What happens during namespace
upgrade is that even if `SYSTEM.MUTEX` has been deleted (removed entry from
meta), `Connection.getTable()` still returns us an instance of `Table`,
however, we can't perform actions on it.
Admin.tableExists is the only thread safe way to identify if table already
exists:
```
/**
* @param tableName Table to check.
* @return <code>true</code> if table exists already.
* @throws IOException if a remote or network exception occurs
*/
boolean tableExists(TableName tableName) throws IOException;
```
&
```
/**
* Retrieve a Table implementation for accessing a table.
* The returned Table is not thread safe, a new instance should be created
for each using thread.
* This is a lightweight operation, pooling or caching of the returned
Table
* is neither required nor desired.
* <p>
* The caller is responsible for calling {@link Table#close()} on the
returned
* table instance.
* <p>
* Since 0.98.1 this method no longer checks table existence. An exception
* will be thrown if the table does not exist only when the first
operation is
* attempted.
* @param tableName the name of the table
* @return a Table to use for interactions with this table
*/
default Table getTable(TableName tableName) throws IOException {
return getTable(tableName, null);
}
```
I checked implementation also, and getTable() internally uses
`getTableBuilder()` which just provides a builder instance for just creating
`Table` object to access actual table, but there is no guarantee that a table
exists while accessing it. Only existsTable() goes to meta table and checks for
the existing entry of Table.
We can do one improvement though, we can utilize same connection to perform
both: tableExists() and getTable().
If we don't have `tableExists()`, test cases
`MigrateSystemTablesToSystemNamespaceIT` are guaranteed to fail.
Updating the PR accordingly.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Remove unnecessary HBase admin API calls when writing and deleting mutex cells
> ------------------------------------------------------------------------------
>
> Key: PHOENIX-6129
> URL: https://issues.apache.org/jira/browse/PHOENIX-6129
> Project: Phoenix
> Issue Type: Improvement
> Affects Versions: 5.0.0, 4.15.0
> Reporter: Chinmay Kulkarni
> Assignee: Viraj Jasani
> Priority: Major
> Labels: phoenix-hardening, quality-improvement
> Fix For: 5.1.0, 4.16.0
>
>
> Inside CQSI.writeMutexCell(), we call
> [getSysMutexPhysicalTableNameBytes()|https://github.com/apache/phoenix/blob/e3c7b4bdce2524eb4fd1e7eb0ccd3454fcca81ce/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java#L4244]
> which in turn calls HBase Admin APIs to check the existence of
> SYSTEM.MUTEX/SYSTEM:MUTEX
> [here|https://github.com/apache/phoenix/blob/e3c7b4bdce2524eb4fd1e7eb0ccd3454fcca81ce/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java#L4309-L4312].
> Later, we anyways try to get the HTable both inside
> [writeMutexCell()|https://github.com/apache/phoenix/blob/e3c7b4bdce2524eb4fd1e7eb0ccd3454fcca81ce/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java#L4245]
> and
> [deleteMutexCell()|https://github.com/apache/phoenix/blob/e3c7b4bdce2524eb4fd1e7eb0ccd3454fcca81ce/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java#L4289].
> Instead, we can lazily fail this getTable() call (by catching the HBase
> TableNotFoundException) to avoid additional HBase Admin API calls.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)