Repository: hbase Updated Branches: refs/heads/HBASE-14070.HLC 4e7c55d99 -> 4c56a3c28
HBASE-18509 Encapsulate all clocks in RS/Master into a new 'Clocks' class Signed-off-by: Michael Stack <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4c56a3c2 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4c56a3c2 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4c56a3c2 Branch: refs/heads/HBASE-14070.HLC Commit: 4c56a3c28a5eea721f82dae841bb88c48a2bb04e Parents: 4e7c55d Author: Amit Patel <[email protected]> Authored: Tue Aug 22 13:02:57 2017 -0700 Committer: Michael Stack <[email protected]> Committed: Tue Aug 22 21:16:17 2017 -0700 ---------------------------------------------------------------------- .../hbase/shaded/protobuf/ProtobufUtil.java | 9 +- .../hadoop/hbase/master/MasterServices.java | 8 +- .../master/procedure/RSProcedureDispatcher.java | 48 ++------ .../hadoop/hbase/regionserver/Clocks.java | 112 +++++++++++++++++++ .../hadoop/hbase/regionserver/HRegion.java | 5 +- .../hbase/regionserver/HRegionServer.java | 46 +------- .../hbase/regionserver/RSRpcServices.java | 32 ++---- .../regionserver/RegionServerServices.java | 7 +- .../hadoop/hbase/MockRegionServerServices.java | 5 +- .../hadoop/hbase/TestClockWithCluster.java | 8 +- .../hbase/master/MockNoopMasterServices.java | 5 +- .../hadoop/hbase/master/MockRegionServer.java | 8 +- .../regionserver/TestHRegionReplayEvents.java | 2 +- .../regionserver/TestRegionSplitPolicy.java | 5 +- .../hbase/regionserver/TestWALLockup.java | 2 +- .../regionserver/wal/AbstractTestWALReplay.java | 2 +- 16 files changed, 159 insertions(+), 145 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java index 405c438..fa62b6a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java @@ -184,7 +184,6 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos; import org.apache.hadoop.hbase.util.Addressing; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.DynamicClassLoader; -import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.ExceptionUtil; import org.apache.hadoop.hbase.util.ForeignExceptionUtil; import org.apache.hadoop.hbase.util.Methods; @@ -3344,7 +3343,7 @@ public final class ProtobufUtil { } public static CloseRegionRequest buildCloseRegionRequest(ServerName server, - final byte[] regionName, ServerName destinationServer, List<Pair<ClockType, Long>> nodeTimes) { + final byte[] regionName, ServerName destinationServer, List<NodeTime> nodeTimes) { CloseRegionRequest.Builder builder = CloseRegionRequest.newBuilder(); RegionSpecifier region = RequestConverter.buildRegionSpecifier( RegionSpecifierType.REGION_NAME, regionName); @@ -3356,11 +3355,7 @@ public final class ProtobufUtil { builder.setServerStartCode(server.getStartcode()); } if (nodeTimes != null) { - for (Pair<ClockType, Long> nodeTime : nodeTimes) { - builder.addNodeTimesBuilder() - .setClockType(ProtobufUtil.toClockType(nodeTime.getFirst())) - .setTimestamp(nodeTime.getSecond()); - } + builder.addAllNodeTimes(nodeTimes); } return builder.build(); } http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java index d57cda0..08940b8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java @@ -21,8 +21,6 @@ package org.apache.hadoop.hbase.master; import java.io.IOException; import java.util.List; -import org.apache.hadoop.hbase.Clock; -import org.apache.hadoop.hbase.ClockType; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; @@ -48,6 +46,7 @@ import org.apache.hadoop.hbase.procedure2.LockInfo; import org.apache.hadoop.hbase.procedure2.ProcedureEvent; import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.quotas.MasterQuotaManager; +import org.apache.hadoop.hbase.regionserver.Clocks; import org.apache.hadoop.hbase.replication.ReplicationException; import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; import org.apache.hadoop.hbase.replication.ReplicationPeerDescription; @@ -61,10 +60,9 @@ import com.google.protobuf.Service; @InterfaceAudience.Private public interface MasterServices extends Server { /** - * @param clockType The clock type - * @return Master's instance of {@link Clock} + * @return the underlying clocks instance */ - Clock getClock(ClockType clockType); + Clocks getClocks(); /** * @return the underlying snapshot manager http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java index f29a7f2..1a8ca44 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.java @@ -22,7 +22,6 @@ import org.apache.hadoop.hbase.shaded.com.google.common.collect.ArrayListMultima import java.io.IOException; import java.net.SocketTimeoutException; -import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.List; @@ -30,13 +29,10 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.ClockType; -import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.ipc.RemoteException; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.DoNotRetryIOException; -import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NodeTime; import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.ServerListener; @@ -271,16 +267,10 @@ public class RSProcedureDispatcher final ExecuteProceduresResponse response = sendRequest(getServerName(), request.build()); // TODO: consider updating clock with just top timestamp from both loops for (OpenRegionResponse orr : response.getOpenRegionList()) { - for (NodeTime nodeTime : orr.getNodeTimesList()) { - env.getMasterServices().getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + env.getMasterServices().getClocks().updateAll(orr.getNodeTimesList()); } for (CloseRegionResponse crr : response.getCloseRegionList()) { - for (NodeTime nodeTime : crr.getNodeTimesList()) { - env.getMasterServices().getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + env.getMasterServices().getClocks().updateAll(crr.getNodeTimesList()); } remoteCallCompleted(env, response); } catch (IOException e) { @@ -340,15 +330,8 @@ public class RSProcedureDispatcher final ServerName serverName, final List<RegionOpenOperation> operations) { final OpenRegionRequest.Builder builder = OpenRegionRequest.newBuilder(); builder.setServerStartCode(serverName.getStartcode()); - - // Set master clock time for send event - builder.addNodeTimesBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.SYSTEM_MONOTONIC)) - .setTimestamp(env.getMasterServices().getClock(ClockType.SYSTEM_MONOTONIC).now()); - builder.addNodeTimesBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.HYBRID_LOGICAL)) - .setTimestamp(env.getMasterServices().getClock(ClockType.HYBRID_LOGICAL).now()); - + // Set master clock times for send event + builder.addAllNodeTimes(env.getMasterServices().getClocks().nowAll()); for (RegionOpenOperation op: operations) { builder.addOpenInfo(op.buildRegionOpenInfoRequest(env)); } @@ -371,11 +354,8 @@ public class RSProcedureDispatcher try { final OpenRegionRequest request = buildOpenRegionRequest(env, getServerName(), operations); OpenRegionResponse response = sendRequest(getServerName(), request); - for (NodeTime nodeTime : response.getNodeTimesList()) { - // Update master clock upon receiving open region response from region server - env.getMasterServices().getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + // Update master clocks upon receiving open region response from region server + env.getMasterServices().getClocks().updateAll(response.getNodeTimesList()); remoteCallCompleted(env, response); } catch (IOException e) { e = unwrapException(e); @@ -429,11 +409,8 @@ public class RSProcedureDispatcher final CloseRegionRequest request = operation.buildCloseRegionRequest(env, getServerName()); try { CloseRegionResponse response = sendRequest(getServerName(), request); - for (NodeTime nodeTime : response.getNodeTimesList()) { - // Update master clock upon receiving close region response from region server - env.getMasterServices().getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + // Update master clock upon receiving close region response from region server + env.getMasterServices().getClocks().updateAll(response.getNodeTimesList()); remoteCallCompleted(env, response); } catch (IOException e) { e = unwrapException(e); @@ -572,14 +549,9 @@ public class RSProcedureDispatcher public CloseRegionRequest buildCloseRegionRequest(final MasterProcedureEnv env, final ServerName serverName) { - // Set master clock time for send event - List<Pair<ClockType, Long>> nodeTimes = new ArrayList<>(); - nodeTimes.add(new Pair<>(ClockType.SYSTEM_MONOTONIC, - env.getMasterServices().getClock(ClockType.SYSTEM_MONOTONIC).now())); - nodeTimes.add(new Pair<>(ClockType.HYBRID_LOGICAL, - env.getMasterServices().getClock(ClockType.HYBRID_LOGICAL).now())); return ProtobufUtil.buildCloseRegionRequest(serverName, - getRegionInfo().getRegionName(), getDestinationServer(), nodeTimes); + getRegionInfo().getRegionName(), getDestinationServer(), + env.getMasterServices().getClocks().nowAll()); } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Clocks.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Clocks.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Clocks.java new file mode 100644 index 0000000..a401007 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Clocks.java @@ -0,0 +1,112 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hbase.regionserver; + +import com.google.common.annotations.VisibleForTesting; +import org.apache.hadoop.hbase.Clock; +import org.apache.hadoop.hbase.ClockType; +import org.apache.hadoop.hbase.HybridLogicalClock; +import org.apache.hadoop.hbase.SystemClock; +import org.apache.hadoop.hbase.SystemMonotonicClock; +import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; +import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NodeTime; + +import java.util.ArrayList; +import java.util.List; + +/** + * Clocks encapsulates each instance of a {@link Clock} to facilitate doing batch now() or update() + * on all of the clocks. + */ +public class Clocks { + private Clock systemClock; + private Clock systemMonotonicClock; + private Clock hybridLogicalClock; + private List<ClockType> clockTypes = new ArrayList<>(); + + public Clocks(long maxClockSkew) { + systemClock = new SystemClock(); + systemMonotonicClock = new SystemMonotonicClock(maxClockSkew); + hybridLogicalClock = new HybridLogicalClock(maxClockSkew); + + clockTypes.add(systemClock.getClockType()); + clockTypes.add(systemMonotonicClock.getClockType()); + clockTypes.add(hybridLogicalClock.getClockType()); + } + + public long update(ClockType clockType, long timestamp) { + return getClock(clockType).update(timestamp); + } + + public long now(ClockType clockType) { + return getClock(clockType).now(); + } + + public List<Long> updateAll(List<NodeTime> nodeTimes) { + List<Long> updatedNodeTimes = new ArrayList<>(); + for (NodeTime nodeTime : nodeTimes) { + ClockType clockType = ProtobufUtil.toClockType(nodeTime.getClockType()); + updatedNodeTimes.add(update(clockType, nodeTime.getTimestamp())); + } + return updatedNodeTimes; + } + + public List<NodeTime> nowAll() { + List<NodeTime> nodeTimes = new ArrayList<>(); + for (ClockType clockType : clockTypes) { + NodeTime nodeTime = NodeTime.newBuilder() + .setClockType(ProtobufUtil.toClockType(clockType)) + .setTimestamp(now(clockType)) + .build(); + nodeTimes.add(nodeTime); + } + return nodeTimes; + } + + public Clock getClock(ClockType clockType) { + switch (clockType) { + case HYBRID_LOGICAL: + return hybridLogicalClock; + case SYSTEM_MONOTONIC: + return systemMonotonicClock; + case SYSTEM: + return systemClock; + default: + throw new IllegalArgumentException("Wrong clock type: " + clockType.toString()); + } + } + + @VisibleForTesting + public void setClock(Clock clock) { + switch (clock.getClockType()) { + case HYBRID_LOGICAL: + hybridLogicalClock = clock; + break; + case SYSTEM_MONOTONIC: + systemMonotonicClock = clock; + break; + case SYSTEM: + systemClock = clock; + break; + default: + throw new IllegalArgumentException("Wrong clock type: " + clock.getClockType().toString()); + } + } +} http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 1c1b26a..6119483 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -389,8 +389,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi @Override public Clock getClock() { if (this.clock == null) { - return this.getRegionServerServices().getClock( - getTableDescriptor().getClockType()); + return this.getRegionServerServices().getClocks().getClock(htableDescriptor.getClockType()); } return this.clock; } @@ -800,7 +799,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi ? DEFAULT_DURABILITY : htd.getDurability(); if (rsServices != null) { - this.clock = rsServices.getClock(htd.getClockType()); + this.clock = rsServices.getClocks().getClock(htd.getClockType()); this.rsAccounting = this.rsServices.getRegionServerAccounting(); // don't initialize coprocessors if not running within a regionserver // TODO: revisit if coprocessors should load in other cases http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index fad0d96..fbf78d5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -73,17 +73,13 @@ import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.Clock; -import org.apache.hadoop.hbase.ClockType; import org.apache.hadoop.hbase.HealthCheckChore; -import org.apache.hadoop.hbase.HybridLogicalClock; import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.NotServingRegionException; import org.apache.hadoop.hbase.PleaseHoldException; import org.apache.hadoop.hbase.ScheduledChore; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.Stoppable; -import org.apache.hadoop.hbase.SystemClock; -import org.apache.hadoop.hbase.SystemMonotonicClock; import org.apache.hadoop.hbase.TableDescriptors; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.YouAreDeadException; @@ -341,9 +337,7 @@ public class HRegionServer extends HasThread implements // Region server contains instances of all three clock clocks. Regions have a set // clock type so depending on the clock type needed by a region, the appropriate // one can be accessed. - protected Clock hybridLogicalClock; - protected Clock systemMonotonicClock; - protected Clock systemClock; + protected Clocks clocks; ConcurrentMap<String, Integer> rowlocks = new ConcurrentHashMap<>(); @@ -605,9 +599,7 @@ public class HRegionServer extends HasThread implements final long maxClockSkew = conf.getLong("hbase.max.clock.skew.in.ms", Clock.DEFAULT_MAX_CLOCK_SKEW_IN_MS); - this.hybridLogicalClock = new HybridLogicalClock(maxClockSkew); - this.systemMonotonicClock = new SystemMonotonicClock(maxClockSkew); - this.systemClock = new SystemClock(); + this.clocks = new Clocks(maxClockSkew); rpcServices = createRpcServices(); if (this instanceof HMaster) { @@ -2094,38 +2086,8 @@ public class HRegionServer extends HasThread implements } @Override - public Clock getClock(ClockType clockType) { - switch (clockType) { - case HYBRID_LOGICAL: - return this.hybridLogicalClock; - case SYSTEM_MONOTONIC: - return this.systemMonotonicClock; - case SYSTEM: - return this.systemClock; - default: - throw new IllegalArgumentException("Wrong clock type: " + clockType.toString()); - } - } - - /** - * Only for the purpose of testing - * @param clock - */ - @VisibleForTesting - public void setClock(Clock clock) { - switch (clock.getClockType()) { - case HYBRID_LOGICAL: - this.hybridLogicalClock = clock; - break; - case SYSTEM_MONOTONIC: - this.systemMonotonicClock = clock; - break; - case SYSTEM: - this.systemClock = clock; - break; - default: - throw new IllegalArgumentException("Wrong clock type: " + clock.getClockType().toString()); - } + public Clocks getClocks() { + return clocks; } @Override http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index fb33187..8c3dd2e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -53,7 +53,6 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellScannable; import org.apache.hadoop.hbase.CellScanner; import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.ClockType; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.DroppedSnapshotException; import org.apache.hadoop.hbase.HBaseIOException; @@ -209,7 +208,6 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameBytesPair; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameInt64Pair; -import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NodeTime; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionInfo; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType; @@ -1516,11 +1514,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion()); - for (NodeTime nodeTime : request.getNodeTimesList()) { - // Update master clock upon receiving open region response from region server - regionServer.getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + // Update master clocks upon receiving open region response from region server + regionServer.getClocks().updateAll(request.getNodeTimesList()); requestCount.increment(); if (sn == null) { @@ -1532,12 +1527,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder() .setClosed(closed) - .addNodeTimes(NodeTime.newBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.SYSTEM_MONOTONIC)) - .setTimestamp(regionServer.getClock(ClockType.SYSTEM_MONOTONIC).now()).build()) - .addNodeTimes(NodeTime.newBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.HYBRID_LOGICAL)) - .setTimestamp(regionServer.getClock(ClockType.HYBRID_LOGICAL).now()).build()); + .addAllNodeTimes(regionServer.getClocks().nowAll()); return builder.build(); } catch (IOException ie) { throw new ServiceException(ie); @@ -1910,11 +1900,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } } - for (NodeTime nodeTime : request.getNodeTimesList()) { - // Update region server clock on receive event - regionServer.getClock(ProtobufUtil.toClockType(nodeTime.getClockType())) - .update(nodeTime.getTimestamp()); - } + // Update region server clocks on receive event + regionServer.getClocks().updateAll(request.getNodeTimesList()); for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) { final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion()); @@ -2021,13 +2008,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } } - // Set clock for send event - builder.addNodeTimes(NodeTime.newBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.SYSTEM_MONOTONIC)) - .setTimestamp(regionServer.getClock(ClockType.SYSTEM_MONOTONIC).now()).build()) - .addNodeTimes(NodeTime.newBuilder() - .setClockType(ProtobufUtil.toClockType(ClockType.HYBRID_LOGICAL)) - .setTimestamp(regionServer.getClock(ClockType.HYBRID_LOGICAL).now()).build()); + // Set node times for send event + builder.addAllNodeTimes(regionServer.getClocks().nowAll()); return builder.build(); } http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java index 8e9c742..375cce0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java @@ -39,8 +39,6 @@ import org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager; import org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager; import org.apache.hadoop.hbase.regionserver.throttle.ThroughputController; import org.apache.hadoop.hbase.wal.WAL; -import org.apache.hadoop.hbase.Clock; -import org.apache.hadoop.hbase.ClockType; import org.apache.zookeeper.KeeperException; import com.google.protobuf.Service; @@ -61,10 +59,9 @@ public interface RegionServerServices extends OnlineRegions, FavoredNodesForRegi WAL getWAL(HRegionInfo regionInfo) throws IOException; /** - * @param clockType The clock type - * @return Region server's instance of {@link Clock} + * @return the underlying clocks instance */ - Clock getClock(ClockType clockType); + Clocks getClocks(); /** @return the List of WALs that are used by this server * Doesn't include the meta WAL http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java index 86ae056..77472e4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.client.locking.EntityLock; import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.fs.HFileSystem; import org.apache.hadoop.hbase.ipc.RpcServerInterface; +import org.apache.hadoop.hbase.regionserver.Clocks; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; import org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager; @@ -253,8 +254,8 @@ public class MockRegionServerServices implements RegionServerServices { } @Override - public Clock getClock(ClockType clockType) { - return Clock.getDummyClockOfGivenClockType(clockType); + public Clocks getClocks() { + return null; } @Override http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClockWithCluster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClockWithCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClockWithCluster.java index c1cca09..c107607 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClockWithCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClockWithCluster.java @@ -222,7 +222,7 @@ public class TestClockWithCluster { // Set meta region clock so that region state transitions are timestamped with mocked clock regionMeta.setClock(masterHLC); - master.setClock(masterHLC); + master.getClocks().setClock(masterHLC); HRegion userRegion = null; for (Region region : regions) { @@ -234,7 +234,7 @@ public class TestClockWithCluster { // Only mock the region server clock because the region clock does not get used during // unassignment and assignment - rs.setClock(masterHLC); + rs.getClocks().setClock(masterHLC); // Repeatedly unassign and assign region while tracking the timestamps of the region state // transitions from the meta table @@ -330,7 +330,7 @@ public class TestClockWithCluster { when(masterMockSystemClock.getTimeUnit()).thenReturn(TimeUnit.MILLISECONDS); HybridLogicalClock masterHLC = new HybridLogicalClock(new SystemMonotonicClock(masterMockSystemClock)); - master.setClock(masterHLC); + master.getClocks().setClock(masterHLC); regionMeta.setClock(masterHLC); Clock rsMockSystemClock = mock(Clock.class); @@ -341,7 +341,7 @@ public class TestClockWithCluster { new HybridLogicalClock(new SystemMonotonicClock(rsMockSystemClock)); // We only mock the region server clock here because the region clock does not get used // during unassignment and assignment - rs.setClock(rsHLC); + rs.getClocks().setClock(rsHLC); // Increment master physical clock time expectedPhysicalTime += 1000; http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java index aea9093..ad655a3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java @@ -22,8 +22,6 @@ import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.ChoreService; -import org.apache.hadoop.hbase.Clock; -import org.apache.hadoop.hbase.ClockType; import org.apache.hadoop.hbase.CoordinatedStateManager; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HRegionInfo; @@ -48,6 +46,7 @@ import org.apache.hadoop.hbase.procedure2.LockInfo; import org.apache.hadoop.hbase.procedure2.ProcedureEvent; import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.quotas.MasterQuotaManager; +import org.apache.hadoop.hbase.regionserver.Clocks; import org.apache.hadoop.hbase.replication.ReplicationException; import org.apache.hadoop.hbase.replication.ReplicationPeerConfig; import org.apache.hadoop.hbase.replication.ReplicationPeerDescription; @@ -91,7 +90,7 @@ public class MockNoopMasterServices implements MasterServices, Server { } @Override - public Clock getClock(ClockType clockType) { return null; }; + public Clocks getClocks() { return null; }; @Override public AssignmentManager getAssignmentManager() { http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java index d4a07f5..84b58ca 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java @@ -34,13 +34,10 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.hbase.Abortable; import org.apache.hadoop.hbase.CellScannable; import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.ClockType; -import org.apache.hadoop.hbase.Clock; import org.apache.hadoop.hbase.ChoreService; import org.apache.hadoop.hbase.CoordinatedStateManager; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.ServerName; -import org.apache.hadoop.hbase.SystemClock; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.ZooKeeperConnectionException; import org.apache.hadoop.hbase.client.ClusterConnection; @@ -50,6 +47,7 @@ import org.apache.hadoop.hbase.client.locking.EntityLock; import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.ipc.HBaseRpcController; import org.apache.hadoop.hbase.ipc.RpcServerInterface; +import org.apache.hadoop.hbase.regionserver.Clocks; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest; @@ -572,8 +570,8 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices { } @Override - public Clock getClock(ClockType clockType) { - return new SystemClock(); + public Clocks getClocks() { + return null; } @Override http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java index aeef694..54eaa57 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java @@ -173,7 +173,7 @@ public class TestHRegionReplayEvents { when(rss.getServerName()).thenReturn(ServerName.valueOf("foo", 1, 1)); when(rss.getConfiguration()).thenReturn(CONF); when(rss.getRegionServerAccounting()).thenReturn(new RegionServerAccounting(CONF)); - when(rss.getClock((ClockType)any())).thenReturn(new SystemClock()); + when(rss.getClocks().getClock(any())).thenReturn(new SystemClock()); String string = org.apache.hadoop.hbase.executor.EventType.RS_COMPACTED_FILES_DISCHARGER .toString(); ExecutorService es = new ExecutorService(string); http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java index 7120ab9..ecc2d8d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java @@ -108,7 +108,7 @@ public class TestRegionSplitPolicy { final List<Region> regions = new ArrayList<>(); Mockito.when(rss.getOnlineRegions(TABLENAME)).thenReturn(regions); Mockito.when(mockRegion.getRegionServerServices()).thenReturn(rss); - Mockito.when(rss.getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); + Mockito.when(rss.getClocks().getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); // Set max size for this 'table'. long maxSplitSize = 1024L; htd.setMaxFileSize(maxSplitSize); @@ -170,8 +170,7 @@ public class TestRegionSplitPolicy { Mockito.when(mockRegion.getRegionServerServices()).thenReturn(rss); Mockito.when(mockRegion.getBlockedRequestsCount()).thenReturn(0L); Mockito.when(mockRegion.getWriteRequestsCount()).thenReturn(0L); - Mockito.when(rss.getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); - + Mockito.when(rss.getClocks().getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); BusyRegionSplitPolicy policy = (BusyRegionSplitPolicy)RegionSplitPolicy.create(mockRegion, conf); http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestWALLockup.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestWALLockup.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestWALLockup.java index 4b448e6..cf535c8 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestWALLockup.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestWALLockup.java @@ -205,7 +205,7 @@ public class TestWALLockup { Mockito.when(server.isStopped()).thenReturn(false); Mockito.when(server.isAborted()).thenReturn(false); RegionServerServices services = Mockito.mock(RegionServerServices.class); - Mockito.when(services.getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); + Mockito.when(services.getClocks().getClock(ClockType.SYSTEM)).thenReturn(new SystemClock()); // OK. Now I have my mocked up Server & RegionServerServices and dodgy WAL, go ahead with test. FileSystem fs = FileSystem.get(CONF); http://git-wip-us.apache.org/repos/asf/hbase/blob/4c56a3c2/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java index bed393f..ebbcf2e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java @@ -687,7 +687,7 @@ public abstract class AbstractTestWALReplay { WAL wal = createWAL(this.conf, hbaseRootDir, logName); RegionServerServices rsServices = Mockito.mock(RegionServerServices.class); Mockito.doReturn(false).when(rsServices).isAborted(); - when(rsServices.getClock(clock.getClockType())).thenReturn(clock); + when(rsServices.getClocks().getClock(clock.getClockType())).thenReturn(clock); when(rsServices.getServerName()).thenReturn(ServerName.valueOf("foo", 10, 10)); Configuration customConf = new Configuration(this.conf); customConf.set(DefaultStoreEngine.DEFAULT_STORE_FLUSHER_CLASS_KEY,
