You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by la...@apache.org on 2014/12/02 05:51:37 UTC
[3/3] phoenix git commit: PHOENIX-1496 Further reduce work in
StatsCollector.
PHOENIX-1496 Further reduce work in StatsCollector.
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/c1da4c9f
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/c1da4c9f
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/c1da4c9f
Branch: refs/heads/3.0
Commit: c1da4c9f2f3a3838554723cdb3eb91d23962b42f
Parents: 4019318
Author: Lars Hofhansl <la...@apache.org>
Authored: Mon Dec 1 20:44:01 2014 -0800
Committer: Lars Hofhansl <la...@apache.org>
Committed: Mon Dec 1 20:51:08 2014 -0800
----------------------------------------------------------------------
.../UngroupedAggregateRegionObserver.java | 4 ++-
.../schema/stats/StatisticsCollector.java | 38 ++++++++++++++------
2 files changed, 31 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1da4c9f/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 4cf816a..d561f30 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
@@ -438,7 +438,9 @@ public class UngroupedAggregateRegionObserver extends BaseScannerRegionObserver
// 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;
- StatisticsCollector stats = new StatisticsCollector(c.getEnvironment(), table, clientTimeStamp);
+ StatisticsCollector stats = new StatisticsCollector(
+ c.getEnvironment(), table,
+ clientTimeStamp, store.getFamily().getName());
internalScanner = stats.createCompactionScanner(c.getEnvironment().getRegion(), store, scanner);
} catch (IOException e) {
// If we can't reach the stats table, don't interrupt the normal
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1da4c9f/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/StatisticsCollector.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/StatisticsCollector.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/StatisticsCollector.java
index 7ad1d9b..258ef6d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/StatisticsCollector.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/StatisticsCollector.java
@@ -54,9 +54,13 @@ public class StatisticsCollector {
// Tracks the bytecount per family if it has reached the guidePostsDepth
private Map<ImmutableBytesPtr, Boolean> familyMap = Maps.newHashMap();
protected StatisticsWriter statsTable;
+ private Pair<Long,GuidePostsInfo> cachedGps = null;
- public StatisticsCollector(RegionCoprocessorEnvironment env, String tableName, long clientTimeStamp)
- throws IOException {
+ public StatisticsCollector(RegionCoprocessorEnvironment env, String tableName, long clientTimeStamp) throws IOException {
+ this(env, tableName, clientTimeStamp, null);
+ }
+
+ public StatisticsCollector(RegionCoprocessorEnvironment env, String tableName, long clientTimeStamp, byte[] family) throws IOException {
Configuration config = env.getConfiguration();
int guidepostPerRegion = config.getInt(QueryServices.STATS_GUIDEPOST_PER_REGION_ATTRIB,
QueryServicesOptions.DEFAULT_STATS_GUIDEPOST_PER_REGION);
@@ -66,6 +70,14 @@ public class StatisticsCollector {
// Get the stats table associated with the current table on which the CP is
// triggered
this.statsTable = StatisticsWriter.newWriter(env, tableName, clientTimeStamp);
+ // in a compaction we know the one family ahead of time
+ // pre-populate familyMap and guidePostsMap here
+ if (family != null) {
+ ImmutableBytesPtr cfKey = new ImmutableBytesPtr(family, 0, family.length);
+ familyMap.put(cfKey, true);
+ cachedGps = new Pair<Long,GuidePostsInfo>(0L,new GuidePostsInfo(0, Collections.<byte[]>emptyList()));
+ guidePostsMap.put(cfKey, cachedGps);
+ }
}
public long getMaxTimeStamp() {
@@ -176,15 +188,21 @@ public class StatisticsCollector {
}
public void updateStatistic(KeyValue kv) {
- ImmutableBytesPtr cfKey = new ImmutableBytesPtr(kv.getBuffer(), kv.getFamilyOffset(), kv.getFamilyLength());
- familyMap.put(cfKey, true);
-
maxTimeStamp = Math.max(maxTimeStamp, kv.getTimestamp());
- // TODO : This can be moved to an interface so that we could collect guide posts in different ways
- Pair<Long,GuidePostsInfo> gps = guidePostsMap.get(cfKey);
- if (gps == null) {
- gps = new Pair<Long,GuidePostsInfo>(0L,new GuidePostsInfo(0, Collections.<byte[]>emptyList()));
- guidePostsMap.put(cfKey, gps);
+
+ Pair<Long,GuidePostsInfo> gps;
+ if (cachedGps == null) {
+ ImmutableBytesPtr cfKey = new ImmutableBytesPtr(kv.getBuffer(), kv.getFamilyOffset(), kv.getFamilyLength());
+ familyMap.put(cfKey, true);
+
+ // TODO : This can be moved to an interface so that we could collect guide posts in different ways
+ gps = guidePostsMap.get(cfKey);
+ if (gps == null) {
+ gps = new Pair<Long,GuidePostsInfo>(0L,new GuidePostsInfo(0, Collections.<byte[]>emptyList()));
+ guidePostsMap.put(cfKey, gps);
+ }
+ } else {
+ gps = cachedGps;
}
int kvLength = kv.getLength();
long byteCount = gps.getFirst() + kvLength;