Repository: phoenix Updated Branches: refs/heads/master f31ece1dc -> 8d41ab0b4
PHOENIX-2401 Split table is failing when the table is local indexed in secure cluster(Ted Yu) Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/8d41ab0b Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/8d41ab0b Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/8d41ab0b Branch: refs/heads/master Commit: 8d41ab0b4d70969b59136cce01ef71c6b8c754f8 Parents: f31ece1 Author: Rajeshbabu Chintaguntla <[email protected]> Authored: Thu Nov 19 09:54:21 2015 +0530 Committer: Rajeshbabu Chintaguntla <[email protected]> Committed: Thu Nov 19 09:54:21 2015 +0530 ---------------------------------------------------------------------- .../hbase/regionserver/LocalIndexSplitter.java | 12 ++++++-- .../UngroupedAggregateRegionObserver.java | 31 +++++++++++++------- 2 files changed, 31 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/8d41ab0b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java index 7882e25..63dc1e8 100644 --- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java +++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/LocalIndexSplitter.java @@ -28,6 +28,7 @@ import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.PairOfSameType; import org.apache.phoenix.hbase.index.util.VersionUtil; import org.apache.phoenix.jdbc.PhoenixConnection; @@ -45,6 +46,7 @@ import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.SchemaUtil; import java.io.IOException; +import java.security.PrivilegedExceptionAction; import java.sql.SQLException; import java.util.List; @@ -66,7 +68,7 @@ public class LocalIndexSplitter extends BaseRegionObserver { if (SchemaUtil.isSystemTable(tableDesc.getName())) { return; } - RegionServerServices rss = ctx.getEnvironment().getRegionServerServices(); + final RegionServerServices rss = ctx.getEnvironment().getRegionServerServices(); if (tableDesc.getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES) == null || !Boolean.TRUE.equals(PBoolean.INSTANCE.toObject(tableDesc .getValue(MetaDataUtil.IS_LOCAL_INDEX_TABLE_PROP_BYTES)))) { @@ -100,7 +102,13 @@ public class LocalIndexSplitter extends BaseRegionObserver { return; } ((HRegion)indexRegion).forceSplit(splitKey); - daughterRegions = st.stepsBeforePONR(rss, rss, false); + User.runAsLoginUser(new PrivilegedExceptionAction<Void>() { + @Override + public Void run() throws Exception { + daughterRegions = st.stepsBeforePONR(rss, rss, false); + return null; + } + }); HRegionInfo copyOfParent = new HRegionInfo(indexRegion.getRegionInfo()); copyOfParent.setOffline(true); copyOfParent.setSplit(true); http://git-wip-us.apache.org/repos/asf/phoenix/blob/8d41ab0b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java index 6b51138..5133cb2 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java @@ -28,6 +28,7 @@ import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.security.PrivilegedExceptionAction; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; @@ -54,6 +55,7 @@ import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.RegionScanner; import org.apache.hadoop.hbase.regionserver.ScanType; import org.apache.hadoop.hbase.regionserver.Store; +import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.WritableUtils; import org.apache.phoenix.coprocessor.generated.PTableProtos; @@ -642,11 +644,10 @@ public class UngroupedAggregateRegionObserver extends BaseScannerRegionObserver{ @Override - public void postSplit(ObserverContext<RegionCoprocessorEnvironment> e, Region l, Region r) - throws IOException { - Region region = e.getEnvironment().getRegion(); - TableName table = region.getRegionInfo().getTable(); - StatisticsCollector stats = null; + public void postSplit(final ObserverContext<RegionCoprocessorEnvironment> e, final Region l, + final Region r) throws IOException { + final Region region = e.getEnvironment().getRegion(); + final TableName table = region.getRegionInfo().getTable(); try { boolean useCurrentTime = e.getEnvironment().getConfiguration().getBoolean(QueryServices.STATS_USE_CURRENT_TIME_ATTRIB, @@ -654,15 +655,25 @@ public class UngroupedAggregateRegionObserver extends BaseScannerRegionObserver{ // Provides a means of clients controlling their timestamps to not use current time // when background tasks are updating stats. Instead we track the max timestamp of // the cells and use that. - long clientTimeStamp = useCurrentTime ? TimeKeeper.SYSTEM.getCurrentTime() : StatisticsCollector.NO_TIMESTAMP; - stats = new StatisticsCollector(e.getEnvironment(), table.getNameAsString(), clientTimeStamp); - stats.splitStats(region, l, r); + final long clientTimeStamp = useCurrentTime ? TimeKeeper.SYSTEM.getCurrentTime() : + StatisticsCollector.NO_TIMESTAMP; + User.runAsLoginUser(new PrivilegedExceptionAction<Void>() { + @Override + public Void run() throws Exception { + StatisticsCollector stats = new StatisticsCollector(e.getEnvironment(), + table.getNameAsString(), clientTimeStamp); + try { + stats.splitStats(region, l, r); + return null; + } finally { + if (stats != null) stats.close(); + } + } + }); } catch (IOException ioe) { if(logger.isWarnEnabled()) { logger.warn("Error while collecting stats during split for " + table,ioe); } - } finally { - if (stats != null) stats.close(); } }
