[ https://issues.apache.org/jira/browse/HBASE-19017?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ramkrishna.s.vasudevan updated HBASE-19017: ------------------------------------------- Resolution: Fixed Hadoop Flags: Reviewed Status: Resolved (was: Patch Available) Pushed to master and branch-2. Thanks to all for the reviews. > [AMv2] EnableTableProcedure is not retaining the assignments > ------------------------------------------------------------ > > Key: HBASE-19017 > URL: https://issues.apache.org/jira/browse/HBASE-19017 > Project: HBase > Issue Type: Bug > Components: Region Assignment > Affects Versions: 2.0.0-alpha-3 > Reporter: ramkrishna.s.vasudevan > Assignee: ramkrishna.s.vasudevan > Fix For: 2.0.0-beta-1 > > Attachments: HBASE-19017.patch > > > Found this while working on HBASE-18946. In branch-1.4 when ever we do enable > table we try retain assignment. > But in branch-2 and trunk the EnableTableProcedure tries to get the location > from the existing regionNode. It always returns null because while doing > region CLOSE while disabling a table, the regionNode's 'regionLocation' is > made NULL but the 'lastHost' is actually having the servername where the > region was hosted. But on trying assignment again we try to see what was the > last RegionLocation and not the 'lastHost' and we go ahead with new > assignment. > On region CLOSE while disable table > {code} > public void markRegionAsClosed(final RegionStateNode regionNode) throws > IOException { > final RegionInfo hri = regionNode.getRegionInfo(); > synchronized (regionNode) { > State state = regionNode.transitionState(State.CLOSED, > RegionStates.STATES_EXPECTED_ON_CLOSE); > regionStates.removeRegionFromServer(regionNode.getRegionLocation(), > regionNode); > regionNode.setLastHost(regionNode.getRegionLocation()); > regionNode.setRegionLocation(null); > regionStateStore.updateRegionLocation(regionNode.getRegionInfo(), state, > regionNode.getRegionLocation()/*null*/, regionNode.getLastHost(), > HConstants.NO_SEQNUM, regionNode.getProcedure().getProcId()); > sendRegionClosedNotification(hri); > } > {code} > In AssignProcedure > {code} > ServerName lastRegionLocation = regionNode.offline(); > {code} > {code} > public ServerName setRegionLocation(final ServerName serverName) { > ServerName lastRegionLocation = this.regionLocation; > if (LOG.isTraceEnabled() && serverName == null) { > LOG.trace("Tracking when we are set to null " + this, new > Throwable("TRACE")); > } > this.regionLocation = serverName; > this.lastUpdate = EnvironmentEdgeManager.currentTime(); > return lastRegionLocation; > } > {code} > So further code in AssignProcedure > {code} > boolean retain = false; > if (!forceNewPlan) { > if (this.targetServer != null) { > retain = targetServer.equals(lastRegionLocation); > regionNode.setRegionLocation(targetServer); > } else { > if (lastRegionLocation != null) { > // Try and keep the location we had before we offlined. > retain = true; > regionNode.setRegionLocation(lastRegionLocation); > } > } > } > {code} > Tries to do retainAssignment but fails because lastRegionLocation is always > null. -- This message was sent by Atlassian JIRA (v6.4.14#64029)