HBASE-15488 Add ACL for setting split merge switch
This commit is contained in:
parent
249e37f83c
commit
2331d9efe3
@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.CoprocessorEnvironment;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.NamespaceDescriptor;
|
||||
import org.apache.hadoop.hbase.ServerName;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.master.RegionPlan;
|
||||
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
||||
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
||||
@ -358,6 +359,17 @@ public class BaseMasterObserver implements MasterObserver {
|
||||
HRegionInfo regionInfo) throws IOException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> ctx)
|
||||
throws IOException {
|
||||
|
@ -33,6 +33,7 @@ import org.apache.hadoop.hbase.HRegionInfo;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.NamespaceDescriptor;
|
||||
import org.apache.hadoop.hbase.ServerName;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.master.RegionPlan;
|
||||
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
||||
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
||||
@ -562,6 +563,24 @@ public interface MasterObserver extends Coprocessor {
|
||||
void postBalance(final ObserverContext<MasterCoprocessorEnvironment> ctx, List<RegionPlan> plans)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Called prior to setting split / merge switch
|
||||
* @param ctx the coprocessor instance's environment
|
||||
* @param newValue the new value submitted in the call
|
||||
* @param switchType type of switch
|
||||
*/
|
||||
boolean preSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException;
|
||||
|
||||
/**
|
||||
* Called after setting split / merge switch
|
||||
* @param ctx the coprocessor instance's environment
|
||||
* @param newValue the new value submitted in the call
|
||||
* @param switchType type of switch
|
||||
*/
|
||||
void postSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException;
|
||||
|
||||
/**
|
||||
* Called prior to modifying the flag used to enable/disable region balancing.
|
||||
* @param ctx the coprocessor instance's environment
|
||||
|
@ -35,6 +35,7 @@ import org.apache.hadoop.hbase.ProcedureInfo;
|
||||
import org.apache.hadoop.hbase.ServerName;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.coprocessor.*;
|
||||
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
||||
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
||||
@ -752,6 +753,29 @@ public class MasterCoprocessorHost
|
||||
});
|
||||
}
|
||||
|
||||
public boolean preSetSplitOrMergeEnabled(final boolean newValue,
|
||||
final Admin.MasterSwitchType switchType) throws IOException {
|
||||
return execOperation(coprocessors.isEmpty() ? null :
|
||||
new CoprocessorOperation() {
|
||||
@Override
|
||||
public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx)
|
||||
throws IOException {
|
||||
oserver.preSetSplitOrMergeEnabled(ctx, newValue, switchType);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void postSetSplitOrMergeEnabled(final boolean newValue,
|
||||
final Admin.MasterSwitchType switchType) throws IOException {
|
||||
execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() {
|
||||
@Override
|
||||
public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx)
|
||||
throws IOException {
|
||||
oserver.postSetSplitOrMergeEnabled(ctx, newValue, switchType);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean preBalanceSwitch(final boolean b) throws IOException {
|
||||
return execOperationWithResult(b, coprocessors.isEmpty() ? null :
|
||||
new CoprocessorOperationWithResult<Boolean>() {
|
||||
|
@ -1479,8 +1479,17 @@ public class MasterRpcServices extends RSRpcServices
|
||||
for (MasterProtos.MasterSwitchType masterSwitchType : request.getSwitchTypesList()) {
|
||||
Admin.MasterSwitchType switchType = convert(masterSwitchType);
|
||||
boolean oldValue = master.isSplitOrMergeEnabled(switchType);
|
||||
master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);
|
||||
response.addPrevValue(oldValue);
|
||||
boolean bypass = false;
|
||||
if (master.cpHost != null) {
|
||||
bypass = master.cpHost.preSetSplitOrMergeEnabled(newValue, switchType);
|
||||
}
|
||||
if (!bypass) {
|
||||
master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);
|
||||
}
|
||||
if (master.cpHost != null) {
|
||||
master.cpHost.postSetSplitOrMergeEnabled(newValue, switchType);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new ServiceException(e);
|
||||
|
@ -55,6 +55,7 @@ import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.Tag;
|
||||
import org.apache.hadoop.hbase.TagRewriteCell;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.client.Append;
|
||||
import org.apache.hadoop.hbase.client.Delete;
|
||||
import org.apache.hadoop.hbase.client.Durability;
|
||||
@ -1259,6 +1260,18 @@ public class AccessController extends BaseMasterAndRegionObserver
|
||||
requirePermission("regionOffline", regionInfo.getTable(), null, null, Action.ADMIN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
requirePermission("setSplitOrMergeEnabled", Action.ADMIN);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> c)
|
||||
throws IOException {
|
||||
|
@ -50,6 +50,7 @@ import org.apache.hadoop.hbase.Tag;
|
||||
import org.apache.hadoop.hbase.TagRewriteCell;
|
||||
import org.apache.hadoop.hbase.TagType;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.client.Append;
|
||||
import org.apache.hadoop.hbase.client.Delete;
|
||||
import org.apache.hadoop.hbase.client.Get;
|
||||
@ -307,6 +308,17 @@ public class VisibilityController extends BaseMasterAndRegionObserver implements
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
|
||||
MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
|
||||
|
@ -344,6 +344,17 @@ public class TestMasterObserver {
|
||||
return preTruncateTableCalled && !postTruncateTableCalled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postSetSplitOrMergeEnabled(final ObserverContext<MasterCoprocessorEnvironment> ctx,
|
||||
final boolean newValue, final Admin.MasterSwitchType switchType) throws IOException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preModifyTable(ObserverContext<MasterCoprocessorEnvironment> env,
|
||||
TableName tableName, HTableDescriptor htd) throws IOException {
|
||||
|
@ -706,6 +706,22 @@ public class TestAccessController extends SecureTestUtil {
|
||||
USER_GROUP_WRITE, USER_GROUP_CREATE);
|
||||
}
|
||||
|
||||
@Test (timeout=180000)
|
||||
public void testSetSplitOrMergeEnabled() throws Exception {
|
||||
AccessTestAction action = new AccessTestAction() {
|
||||
@Override
|
||||
public Object run() throws Exception {
|
||||
ACCESS_CONTROLLER.preSetSplitOrMergeEnabled(ObserverContext.createAndPrepare(CP_ENV, null),
|
||||
true, Admin.MasterSwitchType.MERGE);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);
|
||||
verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO, USER_NONE, USER_GROUP_READ,
|
||||
USER_GROUP_WRITE, USER_GROUP_CREATE);
|
||||
}
|
||||
|
||||
@Test (timeout=180000)
|
||||
public void testBalance() throws Exception {
|
||||
AccessTestAction action = new AccessTestAction() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user