HBASE-15488 Add ACL for setting split merge switch
This commit is contained in:
parent
797562e6c3
commit
47471c35e3
|
@ -43,6 +43,7 @@ import org.apache.hadoop.hbase.NamespaceDescriptor;
|
|||
import org.apache.hadoop.hbase.ProcedureInfo;
|
||||
import org.apache.hadoop.hbase.ServerName;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.constraint.ConstraintException;
|
||||
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
||||
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
|
||||
|
@ -824,6 +825,17 @@ public class RSGroupAdminEndpoint extends RSGroupAdminService
|
|||
|
||||
}
|
||||
|
||||
@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 preSetUserQuota(ObserverContext<MasterCoprocessorEnvironment> ctx, String userName,
|
||||
Quotas quotas) throws IOException {
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.ServerName;
|
|||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceStability;
|
||||
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;
|
||||
|
@ -439,6 +440,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 {
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.ServerName;
|
|||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceStability;
|
||||
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;
|
||||
|
@ -799,6 +800,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
|
||||
|
|
|
@ -38,6 +38,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.CoprocessorHost;
|
||||
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
||||
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
|
||||
|
@ -777,6 +778,28 @@ 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>() {
|
||||
|
|
|
@ -1524,8 +1524,17 @@ public class MasterRpcServices extends RSRpcServices
|
|||
for (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);
|
||||
|
|
|
@ -60,6 +60,7 @@ import org.apache.hadoop.hbase.Tag;
|
|||
import org.apache.hadoop.hbase.TagRewriteCell;
|
||||
import org.apache.hadoop.hbase.TagUtil;
|
||||
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 {
|
||||
|
|
|
@ -51,6 +51,7 @@ import org.apache.hadoop.hbase.TagRewriteCell;
|
|||
import org.apache.hadoop.hbase.TagType;
|
||||
import org.apache.hadoop.hbase.TagUtil;
|
||||
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 {
|
||||
|
|
|
@ -346,6 +346,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 {
|
||||
|
|
|
@ -704,6 +704,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…
Reference in New Issue