[ https://issues.apache.org/jira/browse/HBASE-13254?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14364091#comment-14364091 ]
Andrey Stepachev commented on HBASE-13254: ------------------------------------------ lgtm, thanks Stephen. > EnableTableHandler#prepare would not throw TableNotFoundException during > recovery > --------------------------------------------------------------------------------- > > Key: HBASE-13254 > URL: https://issues.apache.org/jira/browse/HBASE-13254 > Project: HBase > Issue Type: Bug > Affects Versions: 2.0.0 > Reporter: Stephen Yuan Jiang > Assignee: Stephen Yuan Jiang > Priority: Minor > Attachments: HBASE-13254.v1-master.patch > > > During recovery, when EnableTableHandler#prepare() is called, If the table > does not exist, it marks the table as deleted and does NOT throw > TableNotFoundException. The result is that the table lock is released and > the caller has no knowledge that the table not exist or already deleted, it > would continue the next step. > {code} > public EnableTableHandler prepare() > throws TableNotFoundException, TableNotDisabledException, IOException { > ... > try { > // Check if table exists > if (!MetaTableAccessor.tableExists(this.server.getConnection(), > tableName)) { > // retainAssignment is true only during recovery. In normal case it > is false > if (!this.skipTableStateCheck) { > throw new TableNotFoundException(tableName); > } > > this.assignmentManager.getTableStateManager().setDeletedTable(tableName); > } > ... > } > {code} > However,look at the recovery code that calls the EnableTableHandler#prepare > function, AssignmentManager#recoverTableInEnablingState() expects > TableNotFoundException so that it can skip the table. > {code} > private void recoverTableInEnablingState() > throws KeeperException, IOException { > Set<TableName> enablingTables = tableStateManager. > getTablesInStates(TableState.State.ENABLING); > if (enablingTables.size() != 0) { > for (TableName tableName : enablingTables) { > // Recover by calling EnableTableHandler > LOG.info("The table " + tableName > + " is in ENABLING state. Hence recovering by moving the table" > + " to ENABLED state."); > // enableTable in sync way during master startup, > // no need to invoke coprocessor > EnableTableHandler eth = new EnableTableHandler(this.server, > tableName, > this, tableLockManager, true); > try { > eth.prepare(); > } catch (TableNotFoundException e) { > LOG.warn("Table " + tableName + " not found in hbase:meta to > recover."); > continue; > } > eth.process(); > } > } > } > {code} > The proposed fix is always throw TableNotFoundException in > EnableTableHandler#prepare if the table does not exist. > note: this bug only applies to master, a regression from HBASE-7767. > Branch-1 has the correct logic, after setting table state, it would throw the > exception. -- This message was sent by Atlassian JIRA (v6.3.4#6332)