HBASE-13875 Clock skew between master and region server may render restored region without server address
This commit is contained in:
parent
14fe23254a
commit
4713fc6407
|
@ -64,7 +64,6 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
|||
import org.apache.hadoop.hbase.util.ExceptionUtil;
|
||||
import org.apache.hadoop.hbase.util.Pair;
|
||||
import org.apache.hadoop.hbase.util.PairOfSameType;
|
||||
import org.apache.hadoop.hbase.util.Threads;
|
||||
|
||||
/**
|
||||
* Read/write operations on region and assignment information store in
|
||||
|
@ -1289,8 +1288,15 @@ public class MetaTableAccessor {
|
|||
*/
|
||||
public static Put makePutFromRegionInfo(HRegionInfo regionInfo)
|
||||
throws IOException {
|
||||
long now = EnvironmentEdgeManager.currentTime();
|
||||
Put put = new Put(regionInfo.getRegionName(), now);
|
||||
return makePutFromRegionInfo(regionInfo, EnvironmentEdgeManager.currentTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and returns a Put containing the region into for the catalog table
|
||||
*/
|
||||
public static Put makePutFromRegionInfo(HRegionInfo regionInfo, long ts)
|
||||
throws IOException {
|
||||
Put put = new Put(regionInfo.getRegionName(), ts);
|
||||
addRegionInfo(put, regionInfo);
|
||||
return put;
|
||||
}
|
||||
|
@ -1533,11 +1539,23 @@ public class MetaTableAccessor {
|
|||
public static void addRegionsToMeta(Connection connection,
|
||||
List<HRegionInfo> regionInfos, int regionReplication)
|
||||
throws IOException {
|
||||
addRegionsToMeta(connection, regionInfos, regionReplication, HConstants.LATEST_TIMESTAMP);
|
||||
}
|
||||
/**
|
||||
* Adds a hbase:meta row for each of the specified new regions.
|
||||
* @param connection connection we're using
|
||||
* @param regionInfos region information list
|
||||
* @param regionReplication
|
||||
* @param ts desired timestamp
|
||||
* @throws IOException if problem connecting or updating meta
|
||||
*/
|
||||
public static void addRegionsToMeta(Connection connection,
|
||||
List<HRegionInfo> regionInfos, int regionReplication, long ts)
|
||||
throws IOException {
|
||||
List<Put> puts = new ArrayList<Put>();
|
||||
for (HRegionInfo regionInfo : regionInfos) {
|
||||
if (RegionReplicaUtil.isDefaultReplica(regionInfo)) {
|
||||
puts.add(makePutFromRegionInfo(regionInfo));
|
||||
Put put = makePutFromRegionInfo(regionInfo);
|
||||
Put put = makePutFromRegionInfo(regionInfo, ts);
|
||||
// Add empty locations for region replicas so that number of replicas can be cached
|
||||
// whenever the primary region is looked up from meta
|
||||
for (int i = 1; i < regionReplication; i++) {
|
||||
|
@ -1808,11 +1826,20 @@ public class MetaTableAccessor {
|
|||
*/
|
||||
public static void deleteRegions(Connection connection,
|
||||
List<HRegionInfo> regionsInfo) throws IOException {
|
||||
deleteRegions(connection, regionsInfo, EnvironmentEdgeManager.currentTime());
|
||||
}
|
||||
/**
|
||||
* Deletes the specified regions from META.
|
||||
* @param connection connection we're using
|
||||
* @param regionsInfo list of regions to be deleted from META
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void deleteRegions(Connection connection,
|
||||
List<HRegionInfo> regionsInfo, long ts) throws IOException {
|
||||
List<Delete> deletes = new ArrayList<Delete>(regionsInfo.size());
|
||||
long time = EnvironmentEdgeManager.currentTime();
|
||||
for (HRegionInfo hri: regionsInfo) {
|
||||
Delete e = new Delete(hri.getRegionName());
|
||||
e.addFamily(getCatalogFamily(), time);
|
||||
e.addFamily(getCatalogFamily(), ts);
|
||||
deletes.add(e);
|
||||
}
|
||||
deleteFromMetaTable(connection, deletes);
|
||||
|
@ -1858,13 +1885,16 @@ public class MetaTableAccessor {
|
|||
*/
|
||||
public static void overwriteRegions(Connection connection,
|
||||
List<HRegionInfo> regionInfos, int regionReplication) throws IOException {
|
||||
deleteRegions(connection, regionInfos);
|
||||
// use master time for delete marker and the Put
|
||||
long now = EnvironmentEdgeManager.currentTime();
|
||||
deleteRegions(connection, regionInfos, now);
|
||||
// Why sleep? This is the easiest way to ensure that the previous deletes does not
|
||||
// eclipse the following puts, that might happen in the same ts from the server.
|
||||
// See HBASE-9906, and HBASE-9879. Once either HBASE-9879, HBASE-8770 is fixed,
|
||||
// or HBASE-9905 is fixed and meta uses seqIds, we do not need the sleep.
|
||||
Threads.sleep(20);
|
||||
addRegionsToMeta(connection, regionInfos, regionReplication);
|
||||
//
|
||||
// HBASE-13875 uses master timestamp for the mutations. The 20ms sleep is not needed
|
||||
addRegionsToMeta(connection, regionInfos, regionReplication, now+1);
|
||||
LOG.info("Overwritten " + regionInfos);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue