Github user ChinmaySKulkarni commented on a diff in the pull request: https://github.com/apache/phoenix/pull/295#discussion_r176801550 --- Diff: phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java --- @@ -2405,16 +2413,26 @@ public Void call() throws Exception { openConnection(); hConnectionEstablished = true; boolean isDoNotUpgradePropSet = UpgradeUtil.isNoUpgradeSet(props); + boolean doesSystemCatalogAlreadyExist = false; --- End diff -- @JamesRTaylor that could be a possible solution, but then we would always go through executeUpdate-> ... -> _MetaDataClient.createTable_ -> _MetaDataClient.createTableInternal_ -> _CQSI.creataTable_ before finally calling ensureTableCreated and a lot of unnecessary steps would be taken till that point. If we were to disallow the user to proceed in creating/upgrading SYSTEM.CATALOG inside ensureTableCreated, then this would lead to a lot of unnecessary intermediary steps. Instead, can we put all the necessary conditions inside that try block in a separate method which is always only called inside init? This method would also call _checkClientServerCompatibility_ and thus would fail fast in case an upgrade is required, avoiding other unnecessary steps like updating the cache, etc.
---