From 666aa064e7cfe8efa2c020a6831206b71df0d8a9 Mon Sep 17 00:00:00 2001 From: LiangJun He <2005hithlj@163.com> Date: Tue, 21 Jun 2022 13:25:35 +0800 Subject: [PATCH] HBASE-27028 Add a shell command for flushing master local region (#4539) Signed-off-by: Duo Zhang --- .../org/apache/hadoop/hbase/client/Admin.java | 5 +++ .../hadoop/hbase/client/AsyncAdmin.java | 5 +++ .../hadoop/hbase/client/AsyncHBaseAdmin.java | 5 +++ .../client/ConnectionImplementation.java | 8 ++++ .../hadoop/hbase/client/HBaseAdmin.java | 13 +++++++ .../hbase/client/RawAsyncHBaseAdmin.java | 12 ++++++ .../client/ShortCircuitMasterConnection.java | 8 ++++ .../src/main/protobuf/Master.proto | 6 +++ .../hbase/coprocessor/MasterObserver.java | 16 ++++++++ .../apache/hadoop/hbase/master/HMaster.java | 20 ++++++++++ .../hbase/master/MasterCoprocessorHost.java | 18 +++++++++ .../hbase/master/MasterRpcServices.java | 14 +++++++ .../hadoop/hbase/master/MasterServices.java | 5 +++ .../hbase/master/region/MasterRegion.java | 7 ++-- .../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 + .../ruby/shell/commands/flush_master_store.rb | 37 +++++++++++++++++++ .../hbase/thrift2/client/ThriftAdmin.java | 5 +++ 21 files changed, 238 insertions(+), 7 deletions(-) create mode 100644 hbase-shell/src/main/ruby/shell/commands/flush_master_store.rb 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 95c0cad90c6..a0505463f72 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 @@ -3212,4 +3212,9 @@ public interface Admin extends Abortable, Closeable { */ List getLogEntries(Set serverNames, String logType, ServerType serverType, int limit, Map 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> getLogEntries(Set serverNames, String logType, ServerType serverType, int limit, Map filterParams); + + /** + * Flush master local region + */ + CompletableFuture 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 filterParams) { return wrap(rawAdmin.getLogEntries(serverNames, logType, serverType, limit, filterParams)); } + + @Override + public CompletableFuture 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 a6ce210f57b..bb62d88760c 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 @@ -119,6 +119,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; @@ -1922,6 +1924,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 9e19a0405f0..ca2cf11d3b2 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; @@ -4401,6 +4402,18 @@ public class HBaseAdmin implements Admin { return Collections.emptyList(); } + @Override + public void flushMasterStore() throws IOException { + executeCallable(new MasterCallable(getConnection(), getRpcControllerFactory()) { + @Override + protected Void rpcCall() throws Exception { + FlushMasterStoreRequest request = FlushMasterStoreRequest.newBuilder().build(); + master.flushMasterStore(getRpcController(), request); + return null; + } + }); + } + private List getBalancerDecisions(final int limit) throws IOException { return executeCallable( new MasterCallable>(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 ef11c4bdb93..8634f33c163 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; @@ -4023,4 +4025,14 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { return CompletableFuture.completedFuture(Collections.emptyList()); } } + + @Override + public CompletableFuture flushMasterStore() { + FlushMasterStoreRequest.Builder request = FlushMasterStoreRequest.newBuilder(); + return this. newMasterCaller() + .action(((controller, stub) -> this. 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 29f9d022ec4..8c540bf7387 100644 --- a/hbase-protocol-shaded/src/main/protobuf/Master.proto +++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto @@ -757,6 +757,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) @@ -1153,6 +1156,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 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 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 8fd9bbb59b9..59ebb14dd05 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 @@ -4163,6 +4163,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 637df20ecaa..880ee18129e 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 a07b1b06092..be861d93027 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 @@ -201,6 +201,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; @@ -1377,6 +1379,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 ctx) + throws IOException { + preMasterStoreFlushCalled = true; + } + + @Override + public void postMasterStoreFlush(ObserverContext ctx) + throws IOException { + postMasterStoreFlushCalled = true; + } + @Override public void preSetUserQuota(final ObserverContext 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 modifyColumnFamilyStoreFileTrackerAsync(TableName tableName, byte[] family, String dstSFT) throws IOException {