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.ProcedureInfo;
|
||||||
import org.apache.hadoop.hbase.ServerName;
|
import org.apache.hadoop.hbase.ServerName;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
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.constraint.ConstraintException;
|
||||||
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
||||||
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
|
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
|
@Override
|
||||||
public void preSetUserQuota(ObserverContext<MasterCoprocessorEnvironment> ctx, String userName,
|
public void preSetUserQuota(ObserverContext<MasterCoprocessorEnvironment> ctx, String userName,
|
||||||
Quotas quotas) throws IOException {
|
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.TableName;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceStability;
|
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.RegionPlan;
|
||||||
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
||||||
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
||||||
|
@ -439,6 +440,17 @@ public class BaseMasterObserver implements MasterObserver {
|
||||||
HRegionInfo regionInfo) throws IOException {
|
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
|
@Override
|
||||||
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> ctx)
|
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> ctx)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.ServerName;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
import org.apache.hadoop.hbase.TableName;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceStability;
|
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.RegionPlan;
|
||||||
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
|
||||||
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
|
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)
|
void postBalance(final ObserverContext<MasterCoprocessorEnvironment> ctx, List<RegionPlan> plans)
|
||||||
throws IOException;
|
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.
|
* Called prior to modifying the flag used to enable/disable region balancing.
|
||||||
* @param ctx the coprocessor instance's environment
|
* @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.ServerName;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
import org.apache.hadoop.hbase.TableName;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
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.CoprocessorHost;
|
||||||
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
|
||||||
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
|
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 {
|
public boolean preBalanceSwitch(final boolean b) throws IOException {
|
||||||
return execOperationWithResult(b, coprocessors.isEmpty() ? null :
|
return execOperationWithResult(b, coprocessors.isEmpty() ? null :
|
||||||
new CoprocessorOperationWithResult<Boolean>() {
|
new CoprocessorOperationWithResult<Boolean>() {
|
||||||
|
|
|
@ -1524,8 +1524,17 @@ public class MasterRpcServices extends RSRpcServices
|
||||||
for (MasterSwitchType masterSwitchType : request.getSwitchTypesList()) {
|
for (MasterSwitchType masterSwitchType : request.getSwitchTypesList()) {
|
||||||
Admin.MasterSwitchType switchType = convert(masterSwitchType);
|
Admin.MasterSwitchType switchType = convert(masterSwitchType);
|
||||||
boolean oldValue = master.isSplitOrMergeEnabled(switchType);
|
boolean oldValue = master.isSplitOrMergeEnabled(switchType);
|
||||||
master.getSplitOrMergeTracker().setSplitOrMergeEnabled(newValue, switchType);
|
|
||||||
response.addPrevValue(oldValue);
|
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) {
|
} catch (IOException e) {
|
||||||
throw new ServiceException(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.TagRewriteCell;
|
||||||
import org.apache.hadoop.hbase.TagUtil;
|
import org.apache.hadoop.hbase.TagUtil;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
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.Append;
|
||||||
import org.apache.hadoop.hbase.client.Delete;
|
import org.apache.hadoop.hbase.client.Delete;
|
||||||
import org.apache.hadoop.hbase.client.Durability;
|
import org.apache.hadoop.hbase.client.Durability;
|
||||||
|
@ -1259,6 +1260,18 @@ public class AccessController extends BaseMasterAndRegionObserver
|
||||||
requirePermission("regionOffline", regionInfo.getTable(), null, null, Action.ADMIN);
|
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
|
@Override
|
||||||
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> c)
|
public void preBalance(ObserverContext<MasterCoprocessorEnvironment> c)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.apache.hadoop.hbase.TagRewriteCell;
|
||||||
import org.apache.hadoop.hbase.TagType;
|
import org.apache.hadoop.hbase.TagType;
|
||||||
import org.apache.hadoop.hbase.TagUtil;
|
import org.apache.hadoop.hbase.TagUtil;
|
||||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
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.Append;
|
||||||
import org.apache.hadoop.hbase.client.Delete;
|
import org.apache.hadoop.hbase.client.Delete;
|
||||||
import org.apache.hadoop.hbase.client.Get;
|
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
|
@Override
|
||||||
public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
|
public void preBatchMutate(ObserverContext<RegionCoprocessorEnvironment> c,
|
||||||
MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
|
MiniBatchOperationInProgress<Mutation> miniBatchOp) throws IOException {
|
||||||
|
|
|
@ -346,6 +346,17 @@ public class TestMasterObserver {
|
||||||
return preTruncateTableCalled && !postTruncateTableCalled;
|
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
|
@Override
|
||||||
public void preModifyTable(ObserverContext<MasterCoprocessorEnvironment> env,
|
public void preModifyTable(ObserverContext<MasterCoprocessorEnvironment> env,
|
||||||
TableName tableName, HTableDescriptor htd) throws IOException {
|
TableName tableName, HTableDescriptor htd) throws IOException {
|
||||||
|
|
|
@ -704,6 +704,22 @@ public class TestAccessController extends SecureTestUtil {
|
||||||
USER_GROUP_WRITE, USER_GROUP_CREATE);
|
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)
|
@Test (timeout=180000)
|
||||||
public void testBalance() throws Exception {
|
public void testBalance() throws Exception {
|
||||||
AccessTestAction action = new AccessTestAction() {
|
AccessTestAction action = new AccessTestAction() {
|
||||||
|
|
Loading…
Reference in New Issue