[
https://issues.apache.org/jira/browse/HBASE-20771?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Pankaj Kumar updated HBASE-20771:
---------------------------------
Attachment: HBASE-20771.branch-1.002.patch
> 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,
> HBASE-20771.branch-1.002.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)