This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.5 by this push:
new 53b57d686bf HBASE-27028 Add a shell command for flushing master local
region (#4539)
53b57d686bf is described below
commit 53b57d686bfb9e9dfe27b31c1754ef09e83204e1
Author: LiangJun He <[email protected]>
AuthorDate: Tue Jun 21 13:25:35 2022 +0800
HBASE-27028 Add a shell command for flushing master local region (#4539)
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 666aa064e7cfe8efa2c020a6831206b71df0d8a9)
---
.../java/org/apache/hadoop/hbase/client/Admin.java | 5 +++
.../org/apache/hadoop/hbase/client/AsyncAdmin.java | 5 +++
.../hadoop/hbase/client/AsyncHBaseAdmin.java | 5 +++
.../hbase/client/ConnectionImplementation.java | 8 +++++
.../org/apache/hadoop/hbase/client/HBaseAdmin.java | 13 ++++++++
.../hadoop/hbase/client/RawAsyncHBaseAdmin.java | 12 +++++++
.../hbase/client/ShortCircuitMasterConnection.java | 8 +++++
.../src/main/protobuf/Master.proto | 6 ++++
.../hadoop/hbase/coprocessor/MasterObserver.java | 16 ++++++++++
.../org/apache/hadoop/hbase/master/HMaster.java | 20 ++++++++++++
.../hadoop/hbase/master/MasterCoprocessorHost.java | 18 +++++++++++
.../hadoop/hbase/master/MasterRpcServices.java | 14 ++++++++
.../apache/hadoop/hbase/master/MasterServices.java | 5 +++
.../hadoop/hbase/master/region/MasterRegion.java | 7 ++--
.../region/MasterRegionFlusherAndCompactor.java | 14 ++++++--
.../hbase/coprocessor/TestMasterObserver.java | 34 ++++++++++++++++++++
.../hbase/master/MockNoopMasterServices.java | 4 +++
hbase-shell/src/main/ruby/hbase/admin.rb | 8 ++++-
hbase-shell/src/main/ruby/shell.rb | 1 +
.../main/ruby/shell/commands/flush_master_store.rb | 37 ++++++++++++++++++++++
.../hadoop/hbase/thrift2/client/ThriftAdmin.java | 5 +++
21 files changed, 238 insertions(+), 7 deletions(-)
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
index 8279a8efa2f..d1bbdac45e8 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
@@ -3210,4 +3210,9 @@ public interface Admin extends Abortable, Closeable {
*/
List<LogEntry> getLogEntries(Set<ServerName> serverNames, String logType,
ServerType serverType,
int limit, Map<String, Object> filterParams) throws IOException;
+
+ /**
+ * Flush master local region
+ */
+ void flushMasterStore() throws IOException;
}
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
index fabdf629d7b..a47ca261e03 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
@@ -1629,4 +1629,9 @@ public interface AsyncAdmin {
*/
CompletableFuture<List<LogEntry>> getLogEntries(Set<ServerName> serverNames,
String logType,
ServerType serverType, int limit, Map<String, Object> filterParams);
+
+ /**
+ * Flush master local region
+ */
+ CompletableFuture<Void> flushMasterStore();
}
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
index ad554d9bed6..9ccdeebad7a 100644
---
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
+++
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
@@ -865,4 +865,9 @@ class AsyncHBaseAdmin implements AsyncAdmin {
String logType, ServerType serverType, int limit, Map<String, Object>
filterParams) {
return wrap(rawAdmin.getLogEntries(serverNames, logType, serverType,
limit, filterParams));
}
+
+ @Override
+ public CompletableFuture<Void> flushMasterStore() {
+ return wrap(rawAdmin.flushMasterStore());
+ }
}
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
index 1fc64972f96..bec9c0bc863 100644
---
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
+++
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
@@ -114,6 +114,8 @@ import
org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.DecommissionRegionServersResponse;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledRequest;
@@ -1914,6 +1916,12 @@ public class ConnectionImplementation implements
ClusterConnection, Closeable {
throws ServiceException {
return stub.modifyColumnStoreFileTracker(controller, request);
}
+
+ @Override
+ public FlushMasterStoreResponse flushMasterStore(RpcController
controller,
+ FlushMasterStoreRequest request) throws ServiceException {
+ return stub.flushMasterStore(controller, request);
+ }
};
}
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
index c79aee717b8..254359d5c42 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
@@ -165,6 +165,7 @@ import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTabl
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetLocksRequest;
@@ -4439,6 +4440,18 @@ public class HBaseAdmin implements Admin {
return Collections.emptyList();
}
+ @Override
+ public void flushMasterStore() throws IOException {
+ executeCallable(new MasterCallable<Void>(getConnection(),
getRpcControllerFactory()) {
+ @Override
+ protected Void rpcCall() throws Exception {
+ FlushMasterStoreRequest request =
FlushMasterStoreRequest.newBuilder().build();
+ master.flushMasterStore(getRpcController(), request);
+ return null;
+ }
+ });
+ }
+
private List<LogEntry> getBalancerDecisions(final int limit) throws
IOException {
return executeCallable(
new MasterCallable<List<LogEntry>>(getConnection(),
getRpcControllerFactory()) {
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
index 3fa1e48a9c8..a389879736e 100644
---
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
+++
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
@@ -174,6 +174,8 @@ import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTabl
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
@@ -3999,4 +4001,14 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
return CompletableFuture.completedFuture(Collections.emptyList());
}
}
+
+ @Override
+ public CompletableFuture<Void> flushMasterStore() {
+ FlushMasterStoreRequest.Builder request =
FlushMasterStoreRequest.newBuilder();
+ return this.<Void> newMasterCaller()
+ .action(((controller, stub) -> this.<FlushMasterStoreRequest,
FlushMasterStoreResponse,
+ Void> call(controller, stub, request.build(),
+ (s, c, req, done) -> s.flushMasterStore(c, req, done), resp ->
null)))
+ .call();
+ }
}
diff --git
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ShortCircuitMasterConnection.java
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ShortCircuitMasterConnection.java
index 0362bf1f704..59d0dc592bd 100644
---
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ShortCircuitMasterConnection.java
+++
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ShortCircuitMasterConnection.java
@@ -65,6 +65,8 @@ import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTabl
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.EnableTableResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
@@ -744,4 +746,10 @@ public class ShortCircuitMasterConnection implements
MasterKeepAliveConnection {
ModifyColumnStoreFileTrackerRequest request) throws ServiceException {
return stub.modifyColumnStoreFileTracker(controller, request);
}
+
+ @Override
+ public FlushMasterStoreResponse flushMasterStore(RpcController controller,
+ FlushMasterStoreRequest request) throws ServiceException {
+ return stub.flushMasterStore(controller, request);
+ }
}
diff --git a/hbase-protocol-shaded/src/main/protobuf/Master.proto
b/hbase-protocol-shaded/src/main/protobuf/Master.proto
index 42764554590..f7735fe315a 100644
--- a/hbase-protocol-shaded/src/main/protobuf/Master.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto
@@ -754,6 +754,9 @@ message ModifyColumnStoreFileTrackerResponse {
optional uint64 proc_id = 1;
}
+message FlushMasterStoreRequest {}
+message FlushMasterStoreResponse {}
+
service MasterService {
/** Used by the client to get the number of regions that have received the
updated schema */
rpc GetSchemaAlterStatus(GetSchemaAlterStatusRequest)
@@ -1150,6 +1153,9 @@ service MasterService {
rpc ModifyColumnStoreFileTracker(ModifyColumnStoreFileTrackerRequest)
returns(ModifyColumnStoreFileTrackerResponse);
+
+ rpc FlushMasterStore(FlushMasterStoreRequest)
+ returns(FlushMasterStoreResponse);
}
// HBCK Service definitions.
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
index 9ffbd802054..0e73808a8ca 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
@@ -1104,6 +1104,22 @@ public interface MasterObserver {
final TableName tableName) throws IOException {
}
+ /**
+ * Called before the master local region memstore is flushed to disk.
+ * @param ctx the environment to interact with the framework and master
+ */
+ default void preMasterStoreFlush(final
ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ }
+
+ /**
+ * Called after the master local region memstore is flushed to disk.
+ * @param ctx the environment to interact with the framework and master
+ */
+ default void postMasterStoreFlush(final
ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ }
+
/**
* Called before the quota for the user is stored.
* @param ctx the environment to interact with the framework and master
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index e793fe844fd..cf80d089543 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -4160,6 +4160,26 @@ public class HMaster extends HRegionServer implements
MasterServices {
return metaLocationSyncer;
}
+ @Override
+ public void flushMasterStore() throws IOException {
+ LOG.info("Force flush master local region.");
+ if (this.cpHost != null) {
+ try {
+ cpHost.preMasterStoreFlush();
+ } catch (IOException ioe) {
+ LOG.error("Error invoking master coprocessor preMasterStoreFlush()",
ioe);
+ }
+ }
+ masterRegion.flush(true);
+ if (this.cpHost != null) {
+ try {
+ cpHost.postMasterStoreFlush();
+ } catch (IOException ioe) {
+ LOG.error("Error invoking master coprocessor postMasterStoreFlush()",
ioe);
+ }
+ }
+ }
+
@RestrictedApi(explanation = "Should only be called in tests", link = "",
allowedOnPath = ".*/src/test/.*")
public MasterRegion getMasterRegion() {
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 8c6848cb006..bfc01c9e8e2 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -1224,6 +1224,24 @@ public class MasterCoprocessorHost
});
}
+ public void preMasterStoreFlush() throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new
MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.preMasterStoreFlush(this);
+ }
+ });
+ }
+
+ public void postMasterStoreFlush() throws IOException {
+ execOperation(coprocEnvironments.isEmpty() ? null : new
MasterObserverOperation() {
+ @Override
+ public void call(MasterObserver observer) throws IOException {
+ observer.postMasterStoreFlush(this);
+ }
+ });
+ }
+
public void preSetUserQuota(final String user, final GlobalQuotaSettings
quotas)
throws IOException {
execOperation(coprocEnvironments.isEmpty() ? null : new
MasterObserverOperation() {
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
index 75c199f559c..64b57492c78 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
@@ -200,6 +200,8 @@ import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProced
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ExecProcedureResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FixMetaResponse;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreRequest;
+import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.FlushMasterStoreResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusRequest;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterStatusResponse;
import
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetCompletedSnapshotsRequest;
@@ -1374,6 +1376,18 @@ public class MasterRpcServices extends RSRpcServices
}
}
+ @Override
+ public FlushMasterStoreResponse flushMasterStore(RpcController controller,
+ FlushMasterStoreRequest request) throws ServiceException {
+ rpcPreCheck("flushMasterStore");
+ try {
+ master.flushMasterStore();
+ } catch (IOException ioe) {
+ throw new ServiceException(ioe);
+ }
+ return FlushMasterStoreResponse.newBuilder().build();
+ }
+
@Override
public ModifyNamespaceResponse modifyNamespace(RpcController controller,
ModifyNamespaceRequest request) throws ServiceException {
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 85e1504fda4..cfaeb139331 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
@@ -480,4 +480,9 @@ public interface MasterServices extends Server {
* We need to get this in MTP to tell the syncer the new meta replica count.
*/
MetaLocationSyncer getMetaLocationSyncer();
+
+ /**
+ * Flush master local region
+ */
+ void flushMasterStore() throws IOException;
}
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
index b5faeaceb2f..63ed27c2675 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegion.java
@@ -161,10 +161,11 @@ public final class MasterRegion {
return region.getScanner(scan);
}
- @RestrictedApi(explanation = "Should only be called in tests", link = "",
- allowedOnPath = ".*/src/test/.*")
public FlushResult flush(boolean force) throws IOException {
- return region.flush(force);
+ flusherAndCompactor.resetChangesAfterLastFlush();
+ FlushResult flushResult = region.flush(force);
+ flusherAndCompactor.recordLastFlushTime();
+ return flushResult;
}
@RestrictedApi(explanation = "Should only be called in tests", link = "",
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFlusherAndCompactor.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFlusherAndCompactor.java
index 2e970ae4b93..3d4bfea146e 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFlusherAndCompactor.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/region/MasterRegionFlusherAndCompactor.java
@@ -180,7 +180,7 @@ class MasterRegionFlusherAndCompactor implements Closeable {
}
private void flushLoop() {
- lastFlushTime = EnvironmentEdgeManager.currentTime();
+ recordLastFlushTime();
while (!closed) {
flushLock.lock();
try {
@@ -202,10 +202,10 @@ class MasterRegionFlusherAndCompactor implements
Closeable {
flushLock.unlock();
}
assert flushRequest;
- changesAfterLastFlush.set(0);
+ resetChangesAfterLastFlush();
try {
region.flush(true);
- lastFlushTime = EnvironmentEdgeManager.currentTime();
+ recordLastFlushTime();
} catch (IOException e) {
LOG.error(HBaseMarkers.FATAL, "Failed to flush master local region,
aborting...", e);
abortable.abort("Failed to flush master local region", e);
@@ -263,6 +263,14 @@ class MasterRegionFlusherAndCompactor implements Closeable
{
}
}
+ void resetChangesAfterLastFlush() {
+ changesAfterLastFlush.set(0);
+ }
+
+ void recordLastFlushTime() {
+ lastFlushTime = EnvironmentEdgeManager.currentTime();
+ }
+
@Override
public void close() {
closed = true;
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
index 5a5bfe28280..61e671b7389 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
@@ -189,6 +189,8 @@ public class TestMasterObserver {
private boolean postRequestLockCalled;
private boolean preLockHeartbeatCalled;
private boolean postLockHeartbeatCalled;
+ private boolean preMasterStoreFlushCalled;
+ private boolean postMasterStoreFlushCalled;
public void resetStates() {
preCreateTableRegionInfosCalled = false;
@@ -280,6 +282,8 @@ public class TestMasterObserver {
postRequestLockCalled = false;
preLockHeartbeatCalled = false;
postLockHeartbeatCalled = false;
+ preMasterStoreFlushCalled = false;
+ postMasterStoreFlushCalled = false;
}
@Override
@@ -1042,6 +1046,18 @@ public class TestMasterObserver {
TableName tableName) throws IOException {
}
+ @Override
+ public void
preMasterStoreFlush(ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ preMasterStoreFlushCalled = true;
+ }
+
+ @Override
+ public void
postMasterStoreFlush(ObserverContext<MasterCoprocessorEnvironment> ctx)
+ throws IOException {
+ postMasterStoreFlushCalled = true;
+ }
+
@Override
public void preSetUserQuota(final
ObserverContext<MasterCoprocessorEnvironment> ctx,
final String userName, final GlobalQuotaSettings quotas) throws
IOException {
@@ -1676,4 +1692,22 @@ public class TestMasterObserver {
ProcedureTestingUtility.waitNoProcedureRunning(master.getMasterProcedureExecutor());
ProcedureTestingUtility.assertProcNotFailed(master.getMasterProcedureExecutor(),
procId);
}
+
+ @Test
+ public void testMasterStoreOperations() throws Exception {
+ HMaster master = UTIL.getMiniHBaseCluster().getMaster();
+ MasterCoprocessorHost host = master.getMasterCoprocessorHost();
+ CPMasterObserver cp = host.findCoprocessor(CPMasterObserver.class);
+ cp.resetStates();
+ assertFalse("No master store flush call", cp.preMasterStoreFlushCalled);
+ assertFalse("No master store flush call", cp.postMasterStoreFlushCalled);
+
+ try (Connection connection =
ConnectionFactory.createConnection(UTIL.getConfiguration());
+ Admin admin = connection.getAdmin()) {
+ admin.flushMasterStore();
+
+ assertTrue("Master store flush called", cp.preMasterStoreFlushCalled);
+ assertTrue("Master store flush called", cp.postMasterStoreFlushCalled);
+ }
+ }
}
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 1e4fca56737..1150c4eb16a 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
@@ -480,6 +480,10 @@ public class MockNoopMasterServices implements
MasterServices {
return null;
}
+ @Override
+ public void flushMasterStore() throws IOException {
+ }
+
@Override
public long modifyTableStoreFileTracker(TableName tableName, String dstSFT,
long nonceGroup,
long nonce) throws IOException {
diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb
b/hbase-shell/src/main/ruby/hbase/admin.rb
index 1c9e97a46ec..8580f1378ab 100644
--- a/hbase-shell/src/main/ruby/hbase/admin.rb
+++ b/hbase-shell/src/main/ruby/hbase/admin.rb
@@ -1795,11 +1795,17 @@ module Hbase
@admin.modifyTableStoreFileTracker(tableName, sft)
end
-
#----------------------------------------------------------------------------------------------
+
#----------------------------------------------------------------------------------------------
# Change table column family's sft
def modify_table_family_sft(tableName, family_bytes, sft)
@admin.modifyColumnFamilyStoreFileTracker(tableName, family_bytes, sft)
end
+
+
#----------------------------------------------------------------------------------------------
+ # Flush master local region
+ def flush_master_store()
+ @admin.flushMasterStore()
+ end
end
# rubocop:enable Metrics/ClassLength
end
diff --git a/hbase-shell/src/main/ruby/shell.rb
b/hbase-shell/src/main/ruby/shell.rb
index 59f2cbe4601..e1c4d42b426 100644
--- a/hbase-shell/src/main/ruby/shell.rb
+++ b/hbase-shell/src/main/ruby/shell.rb
@@ -446,6 +446,7 @@ Shell.load_command_group(
compact
compaction_switch
flush
+ flush_master_store
get_balancer_decisions
get_balancer_rejections
get_slowlog_responses
diff --git a/hbase-shell/src/main/ruby/shell/commands/flush_master_store.rb
b/hbase-shell/src/main/ruby/shell/commands/flush_master_store.rb
new file mode 100644
index 00000000000..91b8961fffa
--- /dev/null
+++ b/hbase-shell/src/main/ruby/shell/commands/flush_master_store.rb
@@ -0,0 +1,37 @@
+#
+#
+# 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.
+#
+
+module Shell
+ module Commands
+ class FlushMasterStore < Command
+ def help
+ <<-EOF
+Flush master local region.
+For example:
+
+ hbase> flush_master_store
+EOF
+ end
+
+ def command()
+ admin.flush_master_store()
+ end
+ end
+ end
+end
diff --git
a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
index d58345d3826..cb040c5cf2b 100644
---
a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
+++
b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
@@ -1448,6 +1448,11 @@ public class ThriftAdmin implements Admin {
throw new NotImplementedException("getLogEntries not supported in
ThriftAdmin");
}
+ @Override
+ public void flushMasterStore() throws IOException {
+ throw new NotImplementedException("flushMasterStore not supported in
ThriftAdmin");
+ }
+
@Override
public Future<Void> modifyColumnFamilyStoreFileTrackerAsync(TableName
tableName, byte[] family,
String dstSFT) throws IOException {