Skip to content

Commit f7d4e20

Browse files
charlesconnellndimiduk
authored andcommitted
HBASE-26268 Provide coprocessor hooks for updateConfiguration and clearRegionBlockCache (#5593)
Co-authored-by: Charles Connell <[email protected]> Signed-off-by: Nick Dimiduk <[email protected]>
1 parent 8e87f47 commit f7d4e20

File tree

11 files changed

+271
-19
lines changed

11 files changed

+271
-19
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/HBaseServerBase.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,19 @@
4646
import org.apache.hadoop.hbase.conf.ConfigurationManager;
4747
import org.apache.hadoop.hbase.conf.ConfigurationObserver;
4848
import org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager;
49+
import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
4950
import org.apache.hadoop.hbase.executor.ExecutorService;
5051
import org.apache.hadoop.hbase.fs.HFileSystem;
5152
import org.apache.hadoop.hbase.http.InfoServer;
5253
import org.apache.hadoop.hbase.io.util.MemorySizeUtil;
5354
import org.apache.hadoop.hbase.ipc.RpcServerInterface;
5455
import org.apache.hadoop.hbase.master.HMaster;
56+
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
5557
import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;
5658
import org.apache.hadoop.hbase.regionserver.ChunkCreator;
5759
import org.apache.hadoop.hbase.regionserver.HeapMemoryManager;
5860
import org.apache.hadoop.hbase.regionserver.MemStoreLAB;
61+
import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;
5962
import org.apache.hadoop.hbase.regionserver.ShutdownHook;
6063
import org.apache.hadoop.hbase.security.Superusers;
6164
import org.apache.hadoop.hbase.security.User;
@@ -184,14 +187,14 @@ public abstract class HBaseServerBase<R extends HBaseRpcServicesBase<?>> extends
184187

185188
protected final NettyEventLoopGroupConfig eventLoopGroupConfig;
186189

187-
/**
188-
* If running on Windows, do windows-specific setup.
189-
*/
190-
private static void setupWindows(final Configuration conf, ConfigurationManager cm) {
190+
private void setupSignalHandlers() {
191191
if (!SystemUtils.IS_OS_WINDOWS) {
192192
HBasePlatformDependent.handle("HUP", (number, name) -> {
193-
conf.reloadConfiguration();
194-
cm.notifyAllObservers(conf);
193+
try {
194+
updateConfiguration();
195+
} catch (IOException e) {
196+
LOG.error("Problem while reloading configuration", e);
197+
}
195198
});
196199
}
197200
}
@@ -276,7 +279,7 @@ public HBaseServerBase(Configuration conf, String name) throws IOException {
276279
new ZKWatcher(conf, getProcessName() + ":" + addr.getPort(), this, canCreateBaseZNode());
277280

278281
this.configurationManager = new ConfigurationManager();
279-
setupWindows(conf, configurationManager);
282+
setupSignalHandlers();
280283

281284
initializeFileSystem();
282285

@@ -614,18 +617,40 @@ public ConfigurationManager getConfigurationManager() {
614617
/**
615618
* Reload the configuration from disk.
616619
*/
617-
public void updateConfiguration() {
620+
public void updateConfiguration() throws IOException {
618621
LOG.info("Reloading the configuration from disk.");
619622
// Reload the configuration from disk.
623+
preUpdateConfiguration();
620624
conf.reloadConfiguration();
621625
configurationManager.notifyAllObservers(conf);
626+
postUpdateConfiguration();
627+
}
628+
629+
private void preUpdateConfiguration() throws IOException {
630+
CoprocessorHost<?, ?> coprocessorHost = getCoprocessorHost();
631+
if (coprocessorHost instanceof RegionServerCoprocessorHost) {
632+
((RegionServerCoprocessorHost) coprocessorHost).preUpdateConfiguration(conf);
633+
} else if (coprocessorHost instanceof MasterCoprocessorHost) {
634+
((MasterCoprocessorHost) coprocessorHost).preUpdateConfiguration(conf);
635+
}
636+
}
637+
638+
private void postUpdateConfiguration() throws IOException {
639+
CoprocessorHost<?, ?> coprocessorHost = getCoprocessorHost();
640+
if (coprocessorHost instanceof RegionServerCoprocessorHost) {
641+
((RegionServerCoprocessorHost) coprocessorHost).postUpdateConfiguration(conf);
642+
} else if (coprocessorHost instanceof MasterCoprocessorHost) {
643+
((MasterCoprocessorHost) coprocessorHost).postUpdateConfiguration(conf);
644+
}
622645
}
623646

624647
@Override
625648
public String toString() {
626649
return getServerName().toString();
627650
}
628651

652+
protected abstract CoprocessorHost<?, ?> getCoprocessorHost();
653+
629654
protected abstract boolean canCreateBaseZNode();
630655

631656
protected abstract String getProcessName();

hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.Map;
2323
import java.util.Set;
24+
import org.apache.hadoop.conf.Configuration;
2425
import org.apache.hadoop.hbase.ClusterMetrics;
2526
import org.apache.hadoop.hbase.HBaseInterfaceAudience;
2627
import org.apache.hadoop.hbase.MetaMutationAnnotation;
@@ -1873,4 +1874,24 @@ default void preHasUserPermissions(ObserverContext<MasterCoprocessorEnvironment>
18731874
default void postHasUserPermissions(ObserverContext<MasterCoprocessorEnvironment> ctx,
18741875
String userName, List<Permission> permissions) throws IOException {
18751876
}
1877+
1878+
/**
1879+
* Called before reloading the HMaster's {@link Configuration} from disk
1880+
* @param ctx the coprocessor instance's environment
1881+
* @param preReloadConf the {@link Configuration} in use prior to reload
1882+
* @throws IOException if you need to signal an IO error
1883+
*/
1884+
default void preUpdateMasterConfiguration(ObserverContext<MasterCoprocessorEnvironment> ctx,
1885+
Configuration preReloadConf) throws IOException {
1886+
}
1887+
1888+
/**
1889+
* Called after reloading the HMaster's {@link Configuration} from disk
1890+
* @param ctx the coprocessor instance's environment
1891+
* @param postReloadConf the {@link Configuration} that was loaded
1892+
* @throws IOException if you need to signal an IO error
1893+
*/
1894+
default void postUpdateMasterConfiguration(ObserverContext<MasterCoprocessorEnvironment> ctx,
1895+
Configuration postReloadConf) throws IOException {
1896+
}
18761897
}

hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package org.apache.hadoop.hbase.coprocessor;
1919

2020
import java.io.IOException;
21+
import org.apache.hadoop.conf.Configuration;
22+
import org.apache.hadoop.hbase.CacheEvictionStats;
2123
import org.apache.hadoop.hbase.HBaseInterfaceAudience;
2224
import org.apache.hadoop.hbase.client.Mutation;
2325
import org.apache.hadoop.hbase.replication.ReplicationEndpoint;
@@ -169,4 +171,45 @@ default void postReplicationSinkBatchMutate(
169171

170172
}
171173

174+
/**
175+
* Called before clearing the block caches for one or more regions
176+
* @param ctx the coprocessor instance's environment
177+
* @throws IOException if you need to signal an IO error
178+
*/
179+
default void preClearRegionBlockCache(ObserverContext<RegionServerCoprocessorEnvironment> ctx)
180+
throws IOException {
181+
}
182+
183+
/**
184+
* Called after clearing the block caches for one or more regions
185+
* @param ctx the coprocessor instance's environment
186+
* @param stats statistics about the cache evictions that happened
187+
* @throws IOException if you need to signal an IO error
188+
*/
189+
default void postClearRegionBlockCache(ObserverContext<RegionServerCoprocessorEnvironment> ctx,
190+
CacheEvictionStats stats) throws IOException {
191+
}
192+
193+
/**
194+
* Called before reloading the RegionServer's {@link Configuration} from disk
195+
* @param ctx the coprocessor instance's environment
196+
* @param preReloadConf the {@link Configuration} in use prior to reload
197+
* @throws IOException if you need to signal an IO error
198+
*/
199+
default void preUpdateRegionServerConfiguration(
200+
ObserverContext<RegionServerCoprocessorEnvironment> ctx, Configuration preReloadConf)
201+
throws IOException {
202+
}
203+
204+
/**
205+
* Called after reloading the RegionServer's {@link Configuration} from disk
206+
* @param ctx the coprocessor instance's environment
207+
* @param postReloadConf the {@link Configuration} that was loaded
208+
* @throws IOException if you need to signal an IO error
209+
*/
210+
default void postUpdateRegionServerConfiguration(
211+
ObserverContext<RegionServerCoprocessorEnvironment> ctx, Configuration postReloadConf)
212+
throws IOException {
213+
}
214+
172215
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,11 @@ public MasterRpcServices getMasterRpcServices() {
724724
return rpcServices;
725725
}
726726

727+
@Override
728+
protected MasterCoprocessorHost getCoprocessorHost() {
729+
return getMasterCoprocessorHost();
730+
}
731+
727732
public boolean balanceSwitch(final boolean b) throws IOException {
728733
return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);
729734
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,4 +2114,22 @@ public void call(MasterObserver observer) throws IOException {
21142114
}
21152115
});
21162116
}
2117+
2118+
public void preUpdateConfiguration(Configuration preReloadConf) throws IOException {
2119+
execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
2120+
@Override
2121+
public void call(MasterObserver observer) throws IOException {
2122+
observer.preUpdateMasterConfiguration(this, preReloadConf);
2123+
}
2124+
});
2125+
}
2126+
2127+
public void postUpdateConfiguration(Configuration postReloadConf) throws IOException {
2128+
execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
2129+
@Override
2130+
public void call(MasterObserver observer) throws IOException {
2131+
observer.postUpdateMasterConfiguration(this, postReloadConf);
2132+
}
2133+
});
2134+
}
21172135
}

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,11 @@ protected String getProcessName() {
587587
return REGIONSERVER;
588588
}
589589

590+
@Override
591+
protected RegionServerCoprocessorHost getCoprocessorHost() {
592+
return getRegionServerCoprocessorHost();
593+
}
594+
590595
@Override
591596
protected boolean canCreateBaseZNode() {
592597
return !clusterMode();

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3802,19 +3802,25 @@ public GetSpaceQuotaSnapshotsResponse getSpaceQuotaSnapshots(RpcController contr
38023802
@Override
38033803
public ClearRegionBlockCacheResponse clearRegionBlockCache(RpcController controller,
38043804
ClearRegionBlockCacheRequest request) throws ServiceException {
3805-
rpcPreCheck("clearRegionBlockCache");
3806-
ClearRegionBlockCacheResponse.Builder builder = ClearRegionBlockCacheResponse.newBuilder();
3807-
CacheEvictionStatsBuilder stats = CacheEvictionStats.builder();
3808-
List<HRegion> regions = getRegions(request.getRegionList(), stats);
3809-
for (HRegion region : regions) {
3810-
try {
3811-
stats = stats.append(this.server.clearRegionBlockCache(region));
3812-
} catch (Exception e) {
3813-
stats.addException(region.getRegionInfo().getRegionName(), e);
3805+
try {
3806+
rpcPreCheck("clearRegionBlockCache");
3807+
ClearRegionBlockCacheResponse.Builder builder = ClearRegionBlockCacheResponse.newBuilder();
3808+
CacheEvictionStatsBuilder stats = CacheEvictionStats.builder();
3809+
server.getRegionServerCoprocessorHost().preClearRegionBlockCache();
3810+
List<HRegion> regions = getRegions(request.getRegionList(), stats);
3811+
for (HRegion region : regions) {
3812+
try {
3813+
stats = stats.append(this.server.clearRegionBlockCache(region));
3814+
} catch (Exception e) {
3815+
stats.addException(region.getRegionInfo().getRegionName(), e);
3816+
}
38143817
}
3818+
stats.withMaxCacheSize(server.getBlockCache().map(BlockCache::getMaxSize).orElse(0L));
3819+
server.getRegionServerCoprocessorHost().postClearRegionBlockCache(stats.build());
3820+
return builder.setStats(ProtobufUtil.toCacheEvictionStats(stats.build())).build();
3821+
} catch (IOException e) {
3822+
throw new ServiceException(e);
38153823
}
3816-
stats.withMaxCacheSize(server.getBlockCache().map(BlockCache::getMaxSize).orElse(0L));
3817-
return builder.setStats(ProtobufUtil.toCacheEvictionStats(stats.build())).build();
38183824
}
38193825

38203826
private void executeOpenRegionProcedures(OpenRegionRequest request,

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.io.IOException;
2121
import java.lang.reflect.InvocationTargetException;
2222
import org.apache.hadoop.conf.Configuration;
23+
import org.apache.hadoop.hbase.CacheEvictionStats;
2324
import org.apache.hadoop.hbase.ServerName;
2425
import org.apache.hadoop.hbase.client.Connection;
2526
import org.apache.hadoop.hbase.client.Mutation;
@@ -240,6 +241,42 @@ public void call(RegionServerObserver observer) throws IOException {
240241
});
241242
}
242243

244+
public void preUpdateConfiguration(Configuration preReloadConf) throws IOException {
245+
execOperation(coprocEnvironments.isEmpty() ? null : new RegionServerObserverOperation() {
246+
@Override
247+
public void call(RegionServerObserver observer) throws IOException {
248+
observer.preUpdateRegionServerConfiguration(this, preReloadConf);
249+
}
250+
});
251+
}
252+
253+
public void postUpdateConfiguration(Configuration postReloadConf) throws IOException {
254+
execOperation(coprocEnvironments.isEmpty() ? null : new RegionServerObserverOperation() {
255+
@Override
256+
public void call(RegionServerObserver observer) throws IOException {
257+
observer.postUpdateRegionServerConfiguration(this, postReloadConf);
258+
}
259+
});
260+
}
261+
262+
public void preClearRegionBlockCache() throws IOException {
263+
execOperation(coprocEnvironments.isEmpty() ? null : new RegionServerObserverOperation() {
264+
@Override
265+
public void call(RegionServerObserver observer) throws IOException {
266+
observer.preClearRegionBlockCache(this);
267+
}
268+
});
269+
}
270+
271+
public void postClearRegionBlockCache(CacheEvictionStats stats) throws IOException {
272+
execOperation(coprocEnvironments.isEmpty() ? null : new RegionServerObserverOperation() {
273+
@Override
274+
public void call(RegionServerObserver observer) throws IOException {
275+
observer.postClearRegionBlockCache(this, stats);
276+
}
277+
});
278+
}
279+
243280
/**
244281
* Coprocessor environment extension providing access to region server related services.
245282
*/

hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2576,4 +2576,27 @@ public void preUpdateRSGroupConfig(final ObserverContext<MasterCoprocessorEnviro
25762576
accessChecker.requirePermission(getActiveUser(ctx), "updateRSGroupConfig", null,
25772577
Permission.Action.ADMIN);
25782578
}
2579+
2580+
@Override
2581+
public void preClearRegionBlockCache(ObserverContext<RegionServerCoprocessorEnvironment> ctx)
2582+
throws IOException {
2583+
accessChecker.requirePermission(getActiveUser(ctx), "clearRegionBlockCache", null,
2584+
Permission.Action.ADMIN);
2585+
}
2586+
2587+
@Override
2588+
public void preUpdateRegionServerConfiguration(
2589+
ObserverContext<RegionServerCoprocessorEnvironment> ctx, Configuration preReloadConf)
2590+
throws IOException {
2591+
accessChecker.requirePermission(getActiveUser(ctx), "updateConfiguration", null,
2592+
Permission.Action.ADMIN);
2593+
}
2594+
2595+
@Override
2596+
public void preUpdateMasterConfiguration(ObserverContext<MasterCoprocessorEnvironment> ctx,
2597+
Configuration preReloadConf) throws IOException {
2598+
accessChecker.requirePermission(getActiveUser(ctx), "updateConfiguration", null,
2599+
Permission.Action.ADMIN);
2600+
}
2601+
25792602
}

0 commit comments

Comments
 (0)