[ 
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)

Reply via email to