[ https://issues.apache.org/jira/browse/HBASE-20771?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16522024#comment-16522024 ]
Pankaj Kumar commented on HBASE-20771: -------------------------------------- ProcedureFuture should have a option to wait for operation result irrespective of procedure state. Attached the patch based on above solution, please review. > PUT operation fail with "No server address listed in hbase:meta for region > xxxxx" > --------------------------------------------------------------------------------- > > Key: HBASE-20771 > URL: https://issues.apache.org/jira/browse/HBASE-20771 > Project: HBase > Issue Type: Bug > Components: Client > Affects Versions: 1.5.0 > Reporter: Pankaj Kumar > Assignee: Pankaj Kumar > Priority: Major > Fix For: 1.5.0 > > Attachments: HBASE-20771-branch-1.001.patch > > > 1) Create a table with 1 region > 2) AM send RPC to RS to open the region, > {code} > // invoke assignment (async) > ArrayList<HRegionInfo> userRegionSet = new ArrayList<HRegionInfo>(regions); > for (Map.Entry<ServerName, List<HRegionInfo>> plan: bulkPlan.entrySet()) { > if (!assign(plan.getKey(), plan.getValue())) { > for (HRegionInfo region: plan.getValue()) { > if (!regionStates.isRegionOnline(region)) { > invokeAssign(region); > if (!region.getTable().isSystemTable()) { > userRegionSet.add(region); > } > } > } > } > } > {code} > In above code if assignment fails (due to some problem) then AM will sumbit > the assign request to the thread pool and wait for some duration (here it > will wait for 20sec, region count is 1). > 3) After 20sec, CreateTableProcedure will set table state as ENABLED in ZK > and finish the procedure. > {code} > // Mark the table as Enabling > assignmentManager.getTableStateManager().setTableState(tableName, > ZooKeeperProtos.Table.State.ENABLING); > // Trigger immediate assignment of the regions in round-robin fashion > ModifyRegionUtils.assignRegions(assignmentManager, regions); > // Enable table > assignmentManager.getTableStateManager() > .setTableState(tableName, ZooKeeperProtos.Table.State.ENABLED); > {code} > 4) At the client side, CreateTableFuture.waitProcedureResult(...) is waiting > for the procedure to finish, > {code} > // If the procedure is no longer running, we should have a result > if (response != null && response.getState() != > GetProcedureResultResponse.State.RUNNING) { > procResultFound = response.getState() != > GetProcedureResultResponse.State.NOT_FOUND; > return convertResult(response); > } > {code} > Here we wait for operation result only when procedure result not found, but > in this scenario it will be wrong because region assignment didnt complete, > {code} > // if we don't have a proc result, try the compatibility wait > if (!procResultFound) { > result = waitOperationResult(deadlineTs); > } > {code} > Since HBaseAdmin didn't wait for operation result (successful region > assignment), so client PUT operation will fail by the time region is > successfully opened because "info:server" entry wont be there in meta. -- This message was sent by Atlassian JIRA (v7.6.3#76005)