HBASE-16217 Pass through the calling user in ObserverContext
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/65834a1c Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/65834a1c Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/65834a1c Branch: refs/heads/master Commit: 65834a1ced6632e28cd8707f2791c3da9025f01c Parents: 9d740f7 Author: Gary Helmling <ga...@apache.org> Authored: Wed Jun 29 16:57:11 2016 -0700 Committer: Gary Helmling <ga...@apache.org> Committed: Thu Jul 21 16:45:09 2016 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/protobuf/ProtobufUtil.java | 5 +- .../hbase/coprocessor/ObserverContext.java | 45 ++- .../hbase/master/MasterCoprocessorHost.java | 91 +++--- .../hadoop/hbase/master/ServerManager.java | 4 +- .../procedure/AddColumnFamilyProcedure.java | 35 +-- .../procedure/CloneSnapshotProcedure.java | 24 +- .../master/procedure/CreateTableProcedure.java | 24 +- .../procedure/DeleteColumnFamilyProcedure.java | 34 +-- .../master/procedure/DeleteTableProcedure.java | 24 +- .../master/procedure/DisableTableProcedure.java | 33 +- .../DispatchMergingRegionsProcedure.java | 8 +- .../master/procedure/EnableTableProcedure.java | 34 +-- .../master/procedure/MasterProcedureUtil.java | 15 +- .../procedure/ModifyColumnFamilyProcedure.java | 34 +-- .../master/procedure/ModifyTableProcedure.java | 34 +-- .../procedure/RestoreSnapshotProcedure.java | 8 +- .../procedure/TruncateTableProcedure.java | 24 +- .../hadoop/hbase/regionserver/HStore.java | 62 +--- .../regionserver/RegionCoprocessorHost.java | 73 +++-- .../RegionMergeTransactionImpl.java | 108 +------ .../RegionServerCoprocessorHost.java | 35 ++- .../regionserver/SecureBulkLoadManager.java | 4 +- .../regionserver/SplitTransactionImpl.java | 112 +------ .../regionserver/compactions/Compactor.java | 37 +-- .../hbase/security/access/AccessController.java | 302 ++++++++++--------- 25 files changed, 483 insertions(+), 726 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java index 08c18c6..b3bf041 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java @@ -159,6 +159,7 @@ import org.apache.hadoop.hbase.quotas.ThrottleType; import org.apache.hadoop.hbase.replication.ReplicationLoadSink; import org.apache.hadoop.hbase.replication.ReplicationLoadSource; import org.apache.hadoop.hbase.rsgroup.RSGroupInfo; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.access.Permission; import org.apache.hadoop.hbase.security.access.TablePermission; import org.apache.hadoop.hbase.security.access.UserPermission; @@ -1874,12 +1875,12 @@ public final class ProtobufUtil { public static void mergeRegions(final RpcController controller, final AdminService.BlockingInterface admin, final HRegionInfo region_a, final HRegionInfo region_b, - final boolean forcible, final UserGroupInformation user) throws IOException { + final boolean forcible, final User user) throws IOException { final MergeRegionsRequest request = RequestConverter.buildMergeRegionsRequest( region_a.getRegionName(), region_b.getRegionName(),forcible); if (user != null) { try { - user.doAs(new PrivilegedExceptionAction<Void>() { + user.runAs(new PrivilegedExceptionAction<Void>() { @Override public Void run() throws Exception { admin.mergeRegions(controller, request); http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ObserverContext.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ObserverContext.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ObserverContext.java index 78279ad..d522ce9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ObserverContext.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ObserverContext.java @@ -23,6 +23,10 @@ import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.HBaseInterfaceAudience; +import org.apache.hadoop.hbase.ipc.RpcServer; +import org.apache.hadoop.hbase.security.User; + +import javax.annotation.Nullable; /** * Carries the execution state for a given invocation of an Observer coprocessor @@ -40,8 +44,10 @@ public class ObserverContext<E extends CoprocessorEnvironment> { private E env; private boolean bypass; private boolean complete; + private User caller; - public ObserverContext() { + public ObserverContext(User caller) { + this.caller = caller; } public E getEnvironment() { @@ -92,6 +98,17 @@ public class ObserverContext<E extends CoprocessorEnvironment> { } /** + * Returns the active user for the coprocessor call. + * If an explicit {@code User} instance was provided to the constructor, that will be returned, + * otherwise if we are in the context of an RPC call, the remote user is used. May return null + * if the execution is outside of an RPC context. + */ + @Nullable + public User getCaller() { + return caller; + } + + /** * Instantiates a new ObserverContext instance if the passed reference is * <code>null</code> and sets the environment in the new or existing instance. * This allows deferring the instantiation of a ObserverContext until it is @@ -103,10 +120,34 @@ public class ObserverContext<E extends CoprocessorEnvironment> { * @param <T> The environment type for the context * @return An instance of <code>ObserverContext</code> with the environment set */ + @Deprecated + // TODO: Remove this method, ObserverContext should not depend on RpcServer public static <T extends CoprocessorEnvironment> ObserverContext<T> createAndPrepare( T env, ObserverContext<T> context) { if (context == null) { - context = new ObserverContext<T>(); + context = new ObserverContext<T>(RpcServer.getRequestUser()); + } + context.prepare(env); + return context; + } + + /** + * Instantiates a new ObserverContext instance if the passed reference is + * <code>null</code> and sets the environment in the new or existing instance. + * This allows deferring the instantiation of a ObserverContext until it is + * actually needed. + * + * @param env The coprocessor environment to set + * @param context An existing ObserverContext instance to use, or <code>null</code> + * to create a new instance + * @param user The requesting caller for the execution context + * @param <T> The environment type for the context + * @return An instance of <code>ObserverContext</code> with the environment set + */ + public static <T extends CoprocessorEnvironment> ObserverContext<T> createAndPrepare( + T env, ObserverContext<T> context, User user) { + if (context == null) { + context = new ObserverContext<T>(user); } context.prepare(env); return context; http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java ---------------------------------------------------------------------- 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 459fd01..11e20f5 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 @@ -44,10 +44,12 @@ import org.apache.hadoop.hbase.coprocessor.CoprocessorService; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.MasterObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.ipc.RpcServer; import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription; import org.apache.hadoop.hbase.protobuf.generated.QuotaProtos.Quotas; +import org.apache.hadoop.hbase.security.User; /** * Provides the coprocessor framework and environment for master oriented @@ -240,9 +242,10 @@ public class MasterCoprocessorHost }); } - public void preCreateTableAction(final HTableDescriptor htd, final HRegionInfo[] regions) + public void preCreateTableAction(final HTableDescriptor htd, final HRegionInfo[] regions, + final User user) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -253,8 +256,8 @@ public class MasterCoprocessorHost } public void postCompletedCreateTableAction( - final HTableDescriptor htd, final HRegionInfo[] regions) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final HTableDescriptor htd, final HRegionInfo[] regions, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -284,8 +287,8 @@ public class MasterCoprocessorHost }); } - public void preDeleteTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void preDeleteTableAction(final TableName tableName, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -295,8 +298,9 @@ public class MasterCoprocessorHost }); } - public void postCompletedDeleteTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void postCompletedDeleteTableAction(final TableName tableName, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -326,8 +330,8 @@ public class MasterCoprocessorHost }); } - public void preTruncateTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void preTruncateTableAction(final TableName tableName, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -337,8 +341,9 @@ public class MasterCoprocessorHost }); } - public void postCompletedTruncateTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void postCompletedTruncateTableAction(final TableName tableName, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -370,9 +375,10 @@ public class MasterCoprocessorHost }); } - public void preModifyTableAction(final TableName tableName, final HTableDescriptor htd) + public void preModifyTableAction(final TableName tableName, final HTableDescriptor htd, + final User user) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -382,9 +388,10 @@ public class MasterCoprocessorHost }); } - public void postCompletedModifyTableAction(final TableName tableName, final HTableDescriptor htd) + public void postCompletedModifyTableAction(final TableName tableName, final HTableDescriptor htd, + final User user) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -420,9 +427,10 @@ public class MasterCoprocessorHost public boolean preAddColumnFamilyAction( final TableName tableName, - final HColumnDescriptor columnFamily) + final HColumnDescriptor columnFamily, + final User user) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -434,9 +442,10 @@ public class MasterCoprocessorHost public void postCompletedAddColumnFamilyAction( final TableName tableName, - final HColumnDescriptor columnFamily) + final HColumnDescriptor columnFamily, + final User user) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -472,8 +481,9 @@ public class MasterCoprocessorHost public boolean preModifyColumnFamilyAction( final TableName tableName, - final HColumnDescriptor columnFamily) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final HColumnDescriptor columnFamily, + final User user) throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -485,8 +495,9 @@ public class MasterCoprocessorHost public void postCompletedModifyColumnFamilyAction( final TableName tableName, - final HColumnDescriptor columnFamily) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final HColumnDescriptor columnFamily, + final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -522,9 +533,10 @@ public class MasterCoprocessorHost public boolean preDeleteColumnFamilyAction( final TableName tableName, - final byte[] columnFamily) + final byte[] columnFamily, + final User user) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -535,8 +547,8 @@ public class MasterCoprocessorHost } public void postCompletedDeleteColumnFamilyAction( - final TableName tableName, final byte[] columnFamily) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final TableName tableName, final byte[] columnFamily, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -566,8 +578,8 @@ public class MasterCoprocessorHost }); } - public void preEnableTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void preEnableTableAction(final TableName tableName, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -577,8 +589,9 @@ public class MasterCoprocessorHost }); } - public void postCompletedEnableTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void postCompletedEnableTableAction(final TableName tableName, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -608,8 +621,8 @@ public class MasterCoprocessorHost }); } - public void preDisableTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void preDisableTableAction(final TableName tableName, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -619,8 +632,9 @@ public class MasterCoprocessorHost }); } - public void postCompletedDisableTableAction(final TableName tableName) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void postCompletedDisableTableAction(final TableName tableName, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(MasterObserver oserver, ObserverContext<MasterCoprocessorEnvironment> ctx) throws IOException { @@ -1168,6 +1182,11 @@ public class MasterCoprocessorHost private static abstract class CoprocessorOperation extends ObserverContext<MasterCoprocessorEnvironment> { public CoprocessorOperation() { + this(RpcServer.getRequestUser()); + } + + public CoprocessorOperation(User user) { + super(user); } public abstract void call(MasterObserver oserver, http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index ffdbd17..612a8d0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -67,13 +67,13 @@ import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos.StoreSeque import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos.SplitLogTask.RecoveryMode; import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.apache.hadoop.hbase.regionserver.RegionOpeningState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.RetryCounter; import org.apache.hadoop.hbase.util.RetryCounterFactory; import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; -import org.apache.hadoop.security.UserGroupInformation; import org.apache.zookeeper.KeeperException; import com.google.common.annotations.VisibleForTesting; @@ -884,7 +884,7 @@ public class ServerManager { * @throws IOException */ public void sendRegionsMerge(ServerName server, HRegionInfo region_a, - HRegionInfo region_b, boolean forcible, final UserGroupInformation user) throws IOException { + HRegionInfo region_b, boolean forcible, final User user) throws IOException { if (server == null) throw new NullPointerException("Passed server is null"); if (region_a == null || region_b == null) http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AddColumnFamilyProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AddColumnFamilyProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AddColumnFamilyProcedure.java index ce099ed..195f738 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AddColumnFamilyProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AddColumnFamilyProcedure.java @@ -21,7 +21,6 @@ package org.apache.hadoop.hbase.master.procedure; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.security.PrivilegedExceptionAction; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -39,7 +38,7 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.AddColumnFamilyState; -import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.hbase.security.User; /** * The procedure to add a column family to an existing table. @@ -55,7 +54,7 @@ public class AddColumnFamilyProcedure private TableName tableName; private HTableDescriptor unmodifiedHTableDescriptor; private HColumnDescriptor cfDescriptor; - private UserGroupInformation user; + private User user; private List<HRegionInfo> regionInfoList; private Boolean traceEnabled; @@ -72,8 +71,8 @@ public class AddColumnFamilyProcedure final HColumnDescriptor cfDescriptor) throws IOException { this.tableName = tableName; this.cfDescriptor = cfDescriptor; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); this.unmodifiedHTableDescriptor = null; this.regionInfoList = null; this.traceEnabled = null; @@ -378,22 +377,16 @@ public class AddColumnFamilyProcedure throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case ADD_COLUMN_FAMILY_PRE_OPERATION: - cpHost.preAddColumnFamilyAction(tableName, cfDescriptor); - break; - case ADD_COLUMN_FAMILY_POST_OPERATION: - cpHost.postCompletedAddColumnFamilyAction(tableName, cfDescriptor); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case ADD_COLUMN_FAMILY_PRE_OPERATION: + cpHost.preAddColumnFamilyAction(tableName, cfDescriptor, user); + break; + case ADD_COLUMN_FAMILY_POST_OPERATION: + cpHost.postCompletedAddColumnFamilyAction(tableName, cfDescriptor, user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java index fcad845..861ac56 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java @@ -53,6 +53,7 @@ import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.CloneSnapshotState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.FSTableDescriptors; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.Pair; @@ -62,7 +63,6 @@ import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException; import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper; import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils; import org.apache.hadoop.hbase.snapshot.SnapshotManifest; -import org.apache.hadoop.security.UserGroupInformation; import com.google.common.base.Preconditions; @@ -74,7 +74,7 @@ public class CloneSnapshotProcedure private final AtomicBoolean aborted = new AtomicBoolean(false); - private UserGroupInformation user; + private User user; private HTableDescriptor hTableDescriptor; private SnapshotDescription snapshot; private List<HRegionInfo> newRegions = null; @@ -106,8 +106,8 @@ public class CloneSnapshotProcedure throws IOException { this.hTableDescriptor = hTableDescriptor; this.snapshot = snapshot; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); getMonitorStatus(); } @@ -372,13 +372,7 @@ public class CloneSnapshotProcedure final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.preCreateTableAction(hTableDescriptor, null); - return null; - } - }); + cpHost.preCreateTableAction(hTableDescriptor, null, user); } } @@ -394,13 +388,7 @@ public class CloneSnapshotProcedure if (cpHost != null) { final HRegionInfo[] regions = (newRegions == null) ? null : newRegions.toArray(new HRegionInfo[newRegions.size()]); - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.postCompletedCreateTableAction(hTableDescriptor, regions); - return null; - } - }); + cpHost.postCompletedCreateTableAction(hTableDescriptor, regions, user); } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java index 40b56e0..f6ade6e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java @@ -47,11 +47,11 @@ import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.CreateTableState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.FSTableDescriptors; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.ModifyRegionUtils; import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil; -import org.apache.hadoop.security.UserGroupInformation; import com.google.common.collect.Lists; @@ -68,7 +68,7 @@ public class CreateTableProcedure private HTableDescriptor hTableDescriptor; private List<HRegionInfo> newRegions; - private UserGroupInformation user; + private User user; public CreateTableProcedure() { // Required by the Procedure framework to create the procedure on replay @@ -87,8 +87,8 @@ public class CreateTableProcedure throws IOException { this.hTableDescriptor = hTableDescriptor; this.newRegions = newRegions != null ? Lists.newArrayList(newRegions) : null; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); // used for compatibility with clients without procedures // they need a sync TableExistsException @@ -307,13 +307,7 @@ public class CreateTableProcedure if (cpHost != null) { final HRegionInfo[] regions = newRegions == null ? null : newRegions.toArray(new HRegionInfo[newRegions.size()]); - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.preCreateTableAction(hTableDescriptor, regions); - return null; - } - }); + cpHost.preCreateTableAction(hTableDescriptor, regions, user); } } @@ -323,13 +317,7 @@ public class CreateTableProcedure if (cpHost != null) { final HRegionInfo[] regions = (newRegions == null) ? null : newRegions.toArray(new HRegionInfo[newRegions.size()]); - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.postCompletedCreateTableAction(hTableDescriptor, regions); - return null; - } - }); + cpHost.postCompletedCreateTableAction(hTableDescriptor, regions, user); } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteColumnFamilyProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteColumnFamilyProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteColumnFamilyProcedure.java index 097aaf1..8bcbd82 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteColumnFamilyProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteColumnFamilyProcedure.java @@ -38,9 +38,9 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.DeleteColumnFamilyState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.ByteStringer; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.security.UserGroupInformation; /** * The procedure to delete a column family from an existing table. @@ -57,7 +57,7 @@ public class DeleteColumnFamilyProcedure private TableName tableName; private byte [] familyName; private boolean hasMob; - private UserGroupInformation user; + private User user; private List<HRegionInfo> regionInfoList; private Boolean traceEnabled; @@ -74,8 +74,8 @@ public class DeleteColumnFamilyProcedure final byte[] familyName) throws IOException { this.tableName = tableName; this.familyName = familyName; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); this.unmodifiedHTableDescriptor = null; this.regionInfoList = null; this.traceEnabled = null; @@ -403,22 +403,16 @@ public class DeleteColumnFamilyProcedure final DeleteColumnFamilyState state) throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case DELETE_COLUMN_FAMILY_PRE_OPERATION: - cpHost.preDeleteColumnFamilyAction(tableName, familyName); - break; - case DELETE_COLUMN_FAMILY_POST_OPERATION: - cpHost.postCompletedDeleteColumnFamilyAction(tableName, familyName); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case DELETE_COLUMN_FAMILY_PRE_OPERATION: + cpHost.preDeleteColumnFamilyAction(tableName, familyName, user); + break; + case DELETE_COLUMN_FAMILY_POST_OPERATION: + cpHost.postCompletedDeleteColumnFamilyAction(tableName, familyName, user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java index 39ec0a6..2881ed5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java @@ -55,8 +55,8 @@ import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.DeleteTableState; import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.FSUtils; -import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private public class DeleteTableProcedure @@ -65,7 +65,7 @@ public class DeleteTableProcedure private static final Log LOG = LogFactory.getLog(DeleteTableProcedure.class); private List<HRegionInfo> regions; - private UserGroupInformation user; + private User user; private TableName tableName; // used for compatibility with old clients @@ -84,8 +84,8 @@ public class DeleteTableProcedure public DeleteTableProcedure(final MasterProcedureEnv env, final TableName tableName, final ProcedurePrepareLatch syncLatch) throws IOException { this.tableName = tableName; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); // used for compatibility with clients without procedures // they need a sync TableNotFoundException, TableNotDisabledException, ... @@ -266,13 +266,7 @@ public class DeleteTableProcedure final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { final TableName tableName = this.tableName; - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.preDeleteTableAction(tableName); - return null; - } - }); + cpHost.preDeleteTableAction(tableName, user); } return true; } @@ -284,13 +278,7 @@ public class DeleteTableProcedure final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { final TableName tableName = this.tableName; - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.postCompletedDeleteTableAction(tableName); - return null; - } - }); + cpHost.postCompletedDeleteTableAction(tableName, user); } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java index 5518b8b..be21590 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.DisableTableState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.security.UserGroupInformation; import org.apache.htrace.Trace; @@ -63,7 +64,7 @@ public class DisableTableProcedure private TableName tableName; private boolean skipTableStateCheck; - private UserGroupInformation user; + private User user; private Boolean traceEnabled = null; @@ -105,8 +106,8 @@ public class DisableTableProcedure final ProcedurePrepareLatch syncLatch) throws IOException { this.tableName = tableName; this.skipTableStateCheck = skipTableStateCheck; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); // Compatible with 1.0: We use latch to make sure that this procedure implementation is // compatible with 1.0 asynchronized operations. We need to lock the table and check @@ -458,22 +459,16 @@ public class DisableTableProcedure throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case DISABLE_TABLE_PRE_OPERATION: - cpHost.preDisableTableAction(tableName); - break; - case DISABLE_TABLE_POST_OPERATION: - cpHost.postCompletedDisableTableAction(tableName); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case DISABLE_TABLE_PRE_OPERATION: + cpHost.preDisableTableAction(tableName, user); + break; + case DISABLE_TABLE_POST_OPERATION: + cpHost.postCompletedDisableTableAction(tableName, user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DispatchMergingRegionsProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DispatchMergingRegionsProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DispatchMergingRegionsProcedure.java index 0dfb711..b4f1bf0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DispatchMergingRegionsProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DispatchMergingRegionsProcedure.java @@ -46,8 +46,8 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.DispatchMergingRegionsState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; -import org.apache.hadoop.security.UserGroupInformation; /** * The procedure to Merge a region in a table. @@ -66,7 +66,7 @@ implements TableProcedureInterface { private String regionsToMergeListFullName; private String regionsToMergeListEncodedName; - private UserGroupInformation user; + private User user; private TableName tableName; private HRegionInfo [] regionsToMerge; private boolean forcible; @@ -94,8 +94,8 @@ implements TableProcedureInterface { this.regionsToMerge = regionsToMerge; this.forcible = forcible; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); this.timeout = -1; this.regionsToMergeListFullName = getRegionsToMergeListFullNameString(); http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java index 141dcd4..1893543 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java @@ -50,9 +50,9 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.EnableTableState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.zookeeper.MetaTableLocator; -import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private public class EnableTableProcedure @@ -67,7 +67,7 @@ public class EnableTableProcedure private TableName tableName; private boolean skipTableStateCheck; - private UserGroupInformation user; + private User user; private Boolean traceEnabled = null; @@ -103,8 +103,8 @@ public class EnableTableProcedure final ProcedurePrepareLatch syncLatch) throws IOException { this.tableName = tableName; this.skipTableStateCheck = skipTableStateCheck; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); // Compatible with 1.0: We use latch to make sure that this procedure implementation is // compatible with 1.0 asynchronized operations. We need to lock the table and check @@ -561,22 +561,16 @@ public class EnableTableProcedure throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case ENABLE_TABLE_PRE_OPERATION: - cpHost.preEnableTableAction(getTableName()); - break; - case ENABLE_TABLE_POST_OPERATION: - cpHost.postCompletedEnableTableAction(getTableName()); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case ENABLE_TABLE_PRE_OPERATION: + cpHost.preEnableTableAction(getTableName(), user); + break; + case ENABLE_TABLE_POST_OPERATION: + cpHost.postCompletedEnableTableAction(getTableName(), user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java index d7c0b92..fa0c366 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private @@ -32,24 +33,24 @@ public final class MasterProcedureUtil { private MasterProcedureUtil() {} - public static UserInformation toProtoUserInfo(UserGroupInformation ugi) { + public static UserInformation toProtoUserInfo(User user) { UserInformation.Builder userInfoPB = UserInformation.newBuilder(); - userInfoPB.setEffectiveUser(ugi.getUserName()); - if (ugi.getRealUser() != null) { - userInfoPB.setRealUser(ugi.getRealUser().getUserName()); + userInfoPB.setEffectiveUser(user.getName()); + if (user.getUGI().getRealUser() != null) { + userInfoPB.setRealUser(user.getUGI().getRealUser().getUserName()); } return userInfoPB.build(); } - public static UserGroupInformation toUserInfo(UserInformation userInfoProto) { + public static User toUserInfo(UserInformation userInfoProto) { if (userInfoProto.hasEffectiveUser()) { String effectiveUser = userInfoProto.getEffectiveUser(); if (userInfoProto.hasRealUser()) { String realUser = userInfoProto.getRealUser(); UserGroupInformation realUserUgi = UserGroupInformation.createRemoteUser(realUser); - return UserGroupInformation.createProxyUser(effectiveUser, realUserUgi); + return User.create(UserGroupInformation.createProxyUser(effectiveUser, realUserUgi)); } - return UserGroupInformation.createRemoteUser(effectiveUser); + return User.create(UserGroupInformation.createRemoteUser(effectiveUser)); } return null; } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyColumnFamilyProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyColumnFamilyProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyColumnFamilyProcedure.java index ee534e9..6a408da 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyColumnFamilyProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyColumnFamilyProcedure.java @@ -39,7 +39,7 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.ModifyColumnFamilyState; -import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.hbase.security.User; /** * The procedure to modify a column family from an existing table. @@ -55,7 +55,7 @@ public class ModifyColumnFamilyProcedure private TableName tableName; private HTableDescriptor unmodifiedHTableDescriptor; private HColumnDescriptor cfDescriptor; - private UserGroupInformation user; + private User user; private Boolean traceEnabled; @@ -70,8 +70,8 @@ public class ModifyColumnFamilyProcedure final HColumnDescriptor cfDescriptor) throws IOException { this.tableName = tableName; this.cfDescriptor = cfDescriptor; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); this.unmodifiedHTableDescriptor = null; this.traceEnabled = null; } @@ -359,22 +359,16 @@ public class ModifyColumnFamilyProcedure final ModifyColumnFamilyState state) throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case MODIFY_COLUMN_FAMILY_PRE_OPERATION: - cpHost.preModifyColumnFamilyAction(tableName, cfDescriptor); - break; - case MODIFY_COLUMN_FAMILY_POST_OPERATION: - cpHost.postCompletedModifyColumnFamilyAction(tableName, cfDescriptor); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case MODIFY_COLUMN_FAMILY_PRE_OPERATION: + cpHost.preModifyColumnFamilyAction(tableName, cfDescriptor, user); + break; + case MODIFY_COLUMN_FAMILY_POST_OPERATION: + cpHost.postCompletedModifyColumnFamilyAction(tableName, cfDescriptor, user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java index 6c65718..c523f23 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java @@ -49,8 +49,8 @@ import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.ModifyTableState; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil; -import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private public class ModifyTableProcedure @@ -62,7 +62,7 @@ public class ModifyTableProcedure private HTableDescriptor unmodifiedHTableDescriptor = null; private HTableDescriptor modifiedHTableDescriptor; - private UserGroupInformation user; + private User user; private boolean deleteColumnFamilyInModify; private List<HRegionInfo> regionInfoList; @@ -77,8 +77,8 @@ public class ModifyTableProcedure final HTableDescriptor htd) throws IOException { initilize(); this.modifiedHTableDescriptor = htd; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); } private void initilize() { @@ -467,22 +467,16 @@ public class ModifyTableProcedure throws IOException, InterruptedException { final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - switch (state) { - case MODIFY_TABLE_PRE_OPERATION: - cpHost.preModifyTableAction(getTableName(), modifiedHTableDescriptor); - break; - case MODIFY_TABLE_POST_OPERATION: - cpHost.postCompletedModifyTableAction(getTableName(), modifiedHTableDescriptor); - break; - default: - throw new UnsupportedOperationException(this + " unhandled state=" + state); - } - return null; - } - }); + switch (state) { + case MODIFY_TABLE_PRE_OPERATION: + cpHost.preModifyTableAction(getTableName(), modifiedHTableDescriptor, user); + break; + case MODIFY_TABLE_POST_OPERATION: + cpHost.postCompletedModifyTableAction(getTableName(), modifiedHTableDescriptor, user); + break; + default: + throw new UnsupportedOperationException(this + " unhandled state=" + state); + } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java index ab9cc50..23ab3ac 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java @@ -53,12 +53,12 @@ import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils; import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper; import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils; import org.apache.hadoop.hbase.snapshot.SnapshotManifest; import org.apache.hadoop.hbase.util.Pair; -import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private public class RestoreSnapshotProcedure @@ -75,7 +75,7 @@ public class RestoreSnapshotProcedure private Map<String, Pair<String, String>> parentsToChildrenPairMap = new HashMap<String, Pair<String, String>>(); - private UserGroupInformation user; + private User user; private SnapshotDescription snapshot; // Monitor @@ -106,8 +106,8 @@ public class RestoreSnapshotProcedure // Snapshot information this.snapshot = snapshot; // User and owner information - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); // Monitor getMonitorStatus(); http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java index b420274..0b60cea 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java @@ -41,8 +41,8 @@ import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.protobuf.generated.MasterProcedureProtos.TruncateTableState; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.procedure2.StateMachineProcedure; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.ModifyRegionUtils; -import org.apache.hadoop.security.UserGroupInformation; @InterfaceAudience.Private public class TruncateTableProcedure @@ -52,7 +52,7 @@ public class TruncateTableProcedure private boolean preserveSplits; private List<HRegionInfo> regions; - private UserGroupInformation user; + private User user; private HTableDescriptor hTableDescriptor; private TableName tableName; @@ -64,8 +64,8 @@ public class TruncateTableProcedure boolean preserveSplits) throws IOException { this.tableName = tableName; this.preserveSplits = preserveSplits; - this.user = env.getRequestUser().getUGI(); - this.setOwner(this.user.getShortUserName()); + this.user = env.getRequestUser(); + this.setOwner(this.user.getShortName()); } @Override @@ -261,13 +261,7 @@ public class TruncateTableProcedure final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { final TableName tableName = getTableName(); - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.preTruncateTableAction(tableName); - return null; - } - }); + cpHost.preTruncateTableAction(tableName, user); } return true; } @@ -277,13 +271,7 @@ public class TruncateTableProcedure final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); if (cpHost != null) { final TableName tableName = getTableName(); - user.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - cpHost.postCompletedTruncateTableAction(tableName); - return null; - } - }); + cpHost.postCompletedTruncateTableAction(tableName, user); } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 4b79153..b32b757 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -1284,23 +1284,7 @@ public class HStore implements Store { final StoreFile sf = moveFileIntoPlace(newFile); if (this.getCoprocessorHost() != null) { final Store thisStore = this; - if (user == null) { - getCoprocessorHost().postCompact(thisStore, sf, cr); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - getCoprocessorHost().postCompact(thisStore, sf, cr); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + getCoprocessorHost().postCompact(thisStore, sf, cr, user); } assert sf != null; sfs.add(sf); @@ -1507,7 +1491,7 @@ public class HStore implements Store { // Move the compaction into place. StoreFile sf = moveFileIntoPlace(newFile); if (this.getCoprocessorHost() != null) { - this.getCoprocessorHost().postCompact(this, sf, null); + this.getCoprocessorHost().postCompact(this, sf, null, null); } replaceStoreFiles(filesToCompact, Lists.newArrayList(sf)); completeCompaction(filesToCompact); @@ -1568,29 +1552,12 @@ public class HStore implements Store { this.lock.readLock().lock(); try { synchronized (filesCompacting) { - final Store thisStore = this; // First, see if coprocessor would want to override selection. if (this.getCoprocessorHost() != null) { final List<StoreFile> candidatesForCoproc = compaction.preSelect(this.filesCompacting); boolean override = false; - if (user == null) { - override = getCoprocessorHost().preCompactSelection(this, candidatesForCoproc, - baseRequest); - } else { - try { - override = user.getUGI().doAs(new PrivilegedExceptionAction<Boolean>() { - @Override - public Boolean run() throws Exception { - return getCoprocessorHost().preCompactSelection(thisStore, candidatesForCoproc, - baseRequest); - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + override = getCoprocessorHost().preCompactSelection(this, candidatesForCoproc, + baseRequest, user); if (override) { // Coprocessor is overriding normal file selection. compaction.forceSelect(new CompactionRequest(candidatesForCoproc)); @@ -1618,25 +1585,8 @@ public class HStore implements Store { } } if (this.getCoprocessorHost() != null) { - if (user == null) { - this.getCoprocessorHost().postCompactSelection( - this, ImmutableList.copyOf(compaction.getRequest().getFiles()), baseRequest); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - getCoprocessorHost().postCompactSelection( - thisStore,ImmutableList.copyOf(compaction.getRequest().getFiles()),baseRequest); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + this.getCoprocessorHost().postCompactSelection( + this, ImmutableList.copyOf(compaction.getRequest().getFiles()), baseRequest, user); } // Selected files; see if we have a compaction with some custom base request. http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java index f6ccaa1..acfaa96 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java @@ -74,9 +74,11 @@ import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper; import org.apache.hadoop.hbase.io.Reference; import org.apache.hadoop.hbase.io.hfile.CacheConfig; +import org.apache.hadoop.hbase.ipc.RpcServer; import org.apache.hadoop.hbase.regionserver.Region.Operation; import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest; import org.apache.hadoop.hbase.regionserver.wal.HLogKey; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.wal.WALKey; import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.hadoop.hbase.util.Bytes; @@ -532,9 +534,9 @@ public class RegionCoprocessorHost */ public InternalScanner preCompactScannerOpen(final Store store, final List<StoreFileScanner> scanners, final ScanType scanType, final long earliestPutTs, - final CompactionRequest request) throws IOException { + final CompactionRequest request, final User user) throws IOException { return execOperationWithResult(null, - coprocessors.isEmpty() ? null : new RegionOperationWithResult<InternalScanner>() { + coprocessors.isEmpty() ? null : new RegionOperationWithResult<InternalScanner>(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -554,8 +556,8 @@ public class RegionCoprocessorHost * @throws IOException */ public boolean preCompactSelection(final Store store, final List<StoreFile> candidates, - final CompactionRequest request) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + final CompactionRequest request, final User user) throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -572,9 +574,9 @@ public class RegionCoprocessorHost * @param request custom compaction */ public void postCompactSelection(final Store store, final ImmutableList<StoreFile> selected, - final CompactionRequest request) { + final CompactionRequest request, final User user) { try { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -595,9 +597,10 @@ public class RegionCoprocessorHost * @throws IOException */ public InternalScanner preCompact(final Store store, final InternalScanner scanner, - final ScanType scanType, final CompactionRequest request) throws IOException { + final ScanType scanType, final CompactionRequest request, final User user) + throws IOException { return execOperationWithResult(false, scanner, - coprocessors.isEmpty() ? null : new RegionOperationWithResult<InternalScanner>() { + coprocessors.isEmpty() ? null : new RegionOperationWithResult<InternalScanner>(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -614,8 +617,8 @@ public class RegionCoprocessorHost * @throws IOException */ public void postCompact(final Store store, final StoreFile resultFile, - final CompactionRequest request) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + final CompactionRequest request, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -704,8 +707,8 @@ public class RegionCoprocessorHost * @throws IOException */ // TODO: Deprecate this - public void preSplit() throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void preSplit(final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -718,8 +721,8 @@ public class RegionCoprocessorHost * Invoked just before a split * @throws IOException */ - public void preSplit(final byte[] splitRow) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void preSplit(final byte[] splitRow, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -734,8 +737,8 @@ public class RegionCoprocessorHost * @param r the new right-hand daughter region * @throws IOException */ - public void postSplit(final Region l, final Region r) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void postSplit(final Region l, final Region r, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -745,8 +748,8 @@ public class RegionCoprocessorHost } public boolean preSplitBeforePONR(final byte[] splitKey, - final List<Mutation> metaEntries) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + final List<Mutation> metaEntries, final User user) throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -755,8 +758,8 @@ public class RegionCoprocessorHost }); } - public void preSplitAfterPONR() throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void preSplitAfterPONR(final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -769,8 +772,8 @@ public class RegionCoprocessorHost * Invoked just before the rollback of a failed split is started * @throws IOException */ - public void preRollBackSplit() throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void preRollBackSplit(final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -783,8 +786,8 @@ public class RegionCoprocessorHost * Invoked just after the rollback of a failed split is done * @throws IOException */ - public void postRollBackSplit() throws IOException { - execOperation(coprocessors.isEmpty() ? null : new RegionOperation() { + public void postRollBackSplit(final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new RegionOperation(user) { @Override public void call(RegionObserver oserver, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException { @@ -1656,6 +1659,14 @@ public class RegionCoprocessorHost private static abstract class CoprocessorOperation extends ObserverContext<RegionCoprocessorEnvironment> { + public CoprocessorOperation() { + this(RpcServer.getRequestUser()); + } + + public CoprocessorOperation(User user) { + super(user); + } + public abstract void call(Coprocessor observer, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException; public abstract boolean hasCall(Coprocessor observer); @@ -1663,6 +1674,13 @@ public class RegionCoprocessorHost } private static abstract class RegionOperation extends CoprocessorOperation { + public RegionOperation() { + } + + public RegionOperation(User user) { + super(user); + } + public abstract void call(RegionObserver observer, ObserverContext<RegionCoprocessorEnvironment> ctx) throws IOException; @@ -1677,6 +1695,13 @@ public class RegionCoprocessorHost } private static abstract class RegionOperationWithResult<T> extends RegionOperation { + public RegionOperationWithResult() { + } + + public RegionOperationWithResult(User user) { + super (user); + } + private T result = null; public void setResult(final T result) { this.result = result; } public T getResult() { return this.result; } http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionMergeTransactionImpl.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionMergeTransactionImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionMergeTransactionImpl.java index 5c177d1..9e7f97b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionMergeTransactionImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionMergeTransactionImpl.java @@ -247,23 +247,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { } final HRegion mergedRegion = createMergedRegion(server, services, user); if (rsCoprocessorHost != null) { - if (user == null) { - rsCoprocessorHost.postMergeCommit(this.region_a, this.region_b, mergedRegion); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - rsCoprocessorHost.postMergeCommit(region_a, region_b, mergedRegion); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + rsCoprocessorHost.postMergeCommit(this.region_a, this.region_b, mergedRegion, user); } stepsAfterPONR(server, services, mergedRegion, user); @@ -277,23 +261,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { final HRegion mergedRegion, User user) throws IOException { openMergedRegion(server, services, mergedRegion); if (rsCoprocessorHost != null) { - if (user == null) { - rsCoprocessorHost.postMerge(region_a, region_b, mergedRegion); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - rsCoprocessorHost.postMerge(region_a, region_b, mergedRegion); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + rsCoprocessorHost.postMerge(region_a, region_b, mergedRegion, user); } } @@ -315,23 +283,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { } if (rsCoprocessorHost != null) { - boolean ret = false; - if (user == null) { - ret = rsCoprocessorHost.preMerge(region_a, region_b); - } else { - try { - ret = user.getUGI().doAs(new PrivilegedExceptionAction<Boolean>() { - @Override - public Boolean run() throws Exception { - return rsCoprocessorHost.preMerge(region_a, region_b); - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + boolean ret = rsCoprocessorHost.preMerge(region_a, region_b, user); if (ret) { throw new IOException("Coprocessor bypassing regions " + this.region_a + " " + this.region_b + " merge."); @@ -347,23 +299,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { @MetaMutationAnnotation final List<Mutation> metaEntries = new ArrayList<Mutation>(); if (rsCoprocessorHost != null) { - boolean ret = false; - if (user == null) { - ret = rsCoprocessorHost.preMergeCommit(region_a, region_b, metaEntries); - } else { - try { - ret = user.getUGI().doAs(new PrivilegedExceptionAction<Boolean>() { - @Override - public Boolean run() throws Exception { - return rsCoprocessorHost.preMergeCommit(region_a, region_b, metaEntries); - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + boolean ret = rsCoprocessorHost.preMergeCommit(region_a, region_b, metaEntries, user); if (ret) { throw new IOException("Coprocessor bypassing regions " + this.region_a + " " @@ -658,23 +594,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { this.rsServices = services; // Coprocessor callback if (rsCoprocessorHost != null) { - if (user == null) { - rsCoprocessorHost.preRollBackMerge(region_a, region_b); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - rsCoprocessorHost.preRollBackMerge(region_a, region_b); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + rsCoprocessorHost.preRollBackMerge(region_a, region_b, user); } boolean result = true; @@ -759,23 +679,7 @@ public class RegionMergeTransactionImpl implements RegionMergeTransaction { } // Coprocessor callback if (rsCoprocessorHost != null) { - if (user == null) { - rsCoprocessorHost.postRollBackMerge(region_a, region_b); - } else { - try { - user.getUGI().doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - rsCoprocessorHost.postRollBackMerge(region_a, region_b); - return null; - } - }); - } catch (InterruptedException ie) { - InterruptedIOException iioe = new InterruptedIOException(); - iioe.initCause(ie); - throw iioe; - } - } + rsCoprocessorHost.postRollBackMerge(region_a, region_b, user); } return result; http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java index 50072c3..3f21a72 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java @@ -39,8 +39,10 @@ import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.RegionServerObserver; import org.apache.hadoop.hbase.coprocessor.SingletonCoprocessorService; +import org.apache.hadoop.hbase.ipc.RpcServer; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WALEntry; import org.apache.hadoop.hbase.replication.ReplicationEndpoint; +import org.apache.hadoop.hbase.security.User; @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC) @InterfaceStability.Evolving @@ -91,8 +93,8 @@ public class RegionServerCoprocessorHost extends }); } - public boolean preMerge(final HRegion regionA, final HRegion regionB) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public boolean preMerge(final HRegion regionA, final HRegion regionB, final User user) throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -101,9 +103,10 @@ public class RegionServerCoprocessorHost extends }); } - public void postMerge(final HRegion regionA, final HRegion regionB, final HRegion mergedRegion) + public void postMerge(final HRegion regionA, final HRegion regionB, final HRegion mergedRegion, + final User user) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -113,8 +116,9 @@ public class RegionServerCoprocessorHost extends } public boolean preMergeCommit(final HRegion regionA, final HRegion regionB, - final @MetaMutationAnnotation List<Mutation> metaEntries) throws IOException { - return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final @MetaMutationAnnotation List<Mutation> metaEntries, final User user) + throws IOException { + return execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -124,8 +128,8 @@ public class RegionServerCoprocessorHost extends } public void postMergeCommit(final HRegion regionA, final HRegion regionB, - final HRegion mergedRegion) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + final HRegion mergedRegion, final User user) throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -134,8 +138,9 @@ public class RegionServerCoprocessorHost extends }); } - public void preRollBackMerge(final HRegion regionA, final HRegion regionB) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void preRollBackMerge(final HRegion regionA, final HRegion regionB, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -144,8 +149,9 @@ public class RegionServerCoprocessorHost extends }); } - public void postRollBackMerge(final HRegion regionA, final HRegion regionB) throws IOException { - execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { + public void postRollBackMerge(final HRegion regionA, final HRegion regionB, final User user) + throws IOException { + execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation(user) { @Override public void call(RegionServerObserver oserver, ObserverContext<RegionServerCoprocessorEnvironment> ctx) throws IOException { @@ -220,6 +226,11 @@ public class RegionServerCoprocessorHost extends private static abstract class CoprocessorOperation extends ObserverContext<RegionServerCoprocessorEnvironment> { public CoprocessorOperation() { + this(RpcServer.getRequestUser()); + } + + public CoprocessorOperation(User user) { + super(user); } public abstract void call(RegionServerObserver oserver, http://git-wip-us.apache.org/repos/asf/hbase/blob/65834a1c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java index b47b31d..7a43c5d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java @@ -151,7 +151,7 @@ public class SecureBulkLoadManager { if (bulkLoadObservers != null && bulkLoadObservers.size() != 0) { ObserverContext<RegionCoprocessorEnvironment> ctx = - new ObserverContext<RegionCoprocessorEnvironment>(); + new ObserverContext<RegionCoprocessorEnvironment>(getActiveUser()); ctx.prepare((RegionCoprocessorEnvironment) region.getCoprocessorHost() .findCoprocessorEnvironment(BulkLoadObserver.class).get(0)); @@ -173,7 +173,7 @@ public class SecureBulkLoadManager { if (bulkLoadObservers != null && bulkLoadObservers.size() != 0) { ObserverContext<RegionCoprocessorEnvironment> ctx = - new ObserverContext<RegionCoprocessorEnvironment>(); + new ObserverContext<RegionCoprocessorEnvironment>(getActiveUser()); ctx.prepare((RegionCoprocessorEnvironment) region.getCoprocessorHost() .findCoprocessorEnvironment(BulkLoadObserver.class).get(0));