Github user karanmehta93 commented on a diff in the pull request: https://github.com/apache/phoenix/pull/277#discussion_r146974246 --- Diff: phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java --- @@ -2526,8 +2541,14 @@ private void createOtherSystemTables(PhoenixConnection metaConnection) throws SQ try { metaConnection.createStatement().execute(QueryConstants.CREATE_FUNCTION_METADATA); } catch (TableAlreadyExistsException ignore) {} + // We catch TableExistsException in createSysMutexTable() and ignore it. Hence we will also ignore IOException here. + // SYSTEM.MUTEX table should not be exposed to user. Hence it is directly created and used via HBase API. + // Using 'CREATE TABLE' statement will add entries to SYSTEM.CATALOG table, which should not happen. + try { + createSysMutexTable(hBaseAdmin, ConnectionQueryServicesImpl.this.getProps()); + } catch (IOException ignore) {} --- End diff -- Yes, this is a serious case that we should discuss. The correct thing to do is to probably FAIL the connection itself or possibly have a retry logic for creating the table. This is because in the `acquireUpgradeMutex()` method we check if either SYSMUTEX exists or SYS:MUTEX table exists. The only possible case where both of those tables can be missing is when a client is trying to migrate the table, which disables the old table and creates the new one. There is a brief period of time when none of these table exists. Hence we throw `UpgradeInProgressException` exception in such a case. We have no way to determine if the table doesn't exist at well v/s the point that the table is in migration. Is there any other scenario in which this can affect?
---