Repository: ambari Updated Branches: refs/heads/branch-3.0-ams cd769e2e7 -> c32eebf89
http://git-wip-us.apache.org/repos/asf/ambari/blob/c32eebf8/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/cache/TimelineMetricsCacheSizeOfEngine.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/cache/TimelineMetricsCacheSizeOfEngine.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/cache/TimelineMetricsCacheSizeOfEngine.java index 19e0e60..fccf190 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/cache/TimelineMetricsCacheSizeOfEngine.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/cache/TimelineMetricsCacheSizeOfEngine.java @@ -17,57 +17,27 @@ */ package org.apache.ambari.server.controller.metrics.timeline.cache; -import java.util.Map; -import java.util.TreeMap; - -import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric; -import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics; +import org.apache.hadoop.metrics2.sink.timeline.cache.TimelineMetricsEhCacheSizeOfEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sf.ehcache.pool.Size; import net.sf.ehcache.pool.SizeOfEngine; -import net.sf.ehcache.pool.impl.DefaultSizeOfEngine; -import net.sf.ehcache.pool.sizeof.ReflectionSizeOf; -import net.sf.ehcache.pool.sizeof.SizeOf; /** * Cache sizing engine that reduces reflective calls over the Object graph to * find total Heap usage. */ -public class TimelineMetricsCacheSizeOfEngine implements SizeOfEngine { +public class TimelineMetricsCacheSizeOfEngine extends TimelineMetricsEhCacheSizeOfEngine { private final static Logger LOG = LoggerFactory.getLogger(TimelineMetricsCacheSizeOfEngine.class); - public static int DEFAULT_MAX_DEPTH = 1000; - public static boolean DEFAULT_ABORT_WHEN_MAX_DEPTH_EXCEEDED = false; - - private SizeOfEngine underlying = null; - SizeOf reflectionSizeOf = new ReflectionSizeOf(); - - // Optimizations - private volatile long timelineMetricPrimitivesApproximation = 0; - - private long sizeOfMapEntry; - private long sizeOfMapEntryOverhead; private TimelineMetricsCacheSizeOfEngine(SizeOfEngine underlying) { - this.underlying = underlying; + super(underlying); } public TimelineMetricsCacheSizeOfEngine() { - this(new DefaultSizeOfEngine(DEFAULT_MAX_DEPTH, DEFAULT_ABORT_WHEN_MAX_DEPTH_EXCEEDED)); - - this.sizeOfMapEntry = reflectionSizeOf.sizeOf(new Long(1)) + - reflectionSizeOf.sizeOf(new Double(2.0)); - - //SizeOfMapEntryOverhead = SizeOfMapWithOneEntry - (SizeOfEmptyMap + SizeOfOneEntry) - TreeMap<Long, Double> map = new TreeMap<>(); - long emptyMapSize = reflectionSizeOf.sizeOf(map); - map.put(new Long(1), new Double(2.0)); - long sizeOfMapOneEntry = reflectionSizeOf.deepSizeOf(DEFAULT_MAX_DEPTH, DEFAULT_ABORT_WHEN_MAX_DEPTH_EXCEEDED, map).getCalculated(); - this.sizeOfMapEntryOverhead = sizeOfMapOneEntry - (emptyMapSize + this.sizeOfMapEntry); - - LOG.info("Creating custom sizeof engine for TimelineMetrics."); + // Invoke default constructor in base class } @Override @@ -108,36 +78,10 @@ public class TimelineMetricsCacheSizeOfEngine implements SizeOfEngine { private long getTimelineMetricCacheValueSize(TimelineMetricsCacheValue value) { long size = 16; // startTime + endTime - TimelineMetrics metrics = value.getTimelineMetrics(); + size += 8; // Object reference - if (metrics != null) { - for (TimelineMetric metric : metrics.getMetrics()) { - - if (timelineMetricPrimitivesApproximation == 0) { - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getMetricName()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getAppId()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getHostName()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getInstanceId()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getTimestamp()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getStartTime()); - timelineMetricPrimitivesApproximation += reflectionSizeOf.sizeOf(metric.getType()); - timelineMetricPrimitivesApproximation += 8; // Object overhead - - LOG.debug("timelineMetricPrimitivesApproximation bytes = " + timelineMetricPrimitivesApproximation); - } - size += timelineMetricPrimitivesApproximation; - - Map<Long, Double> metricValues = metric.getMetricValues(); - if (metricValues != null && !metricValues.isEmpty()) { - // Numeric wrapper: 12 bytes + 8 bytes Data type + 4 bytes alignment = 48 (Long, Double) - // Tree Map: 12 bytes for header + 20 bytes for 5 object fields : pointers + 1 byte for flag = 40 - LOG.debug("Size of metric value: " + (sizeOfMapEntry + sizeOfMapEntryOverhead) * metricValues.size()); - size += (sizeOfMapEntry + sizeOfMapEntryOverhead) * metricValues.size(); // Treemap size is O(1) - } - } - LOG.debug("Total Size of metric values in cache: " + size); - } + size += getTimelineMetricsSize(value.getTimelineMetrics()); // TreeMap return size; } @@ -147,7 +91,6 @@ public class TimelineMetricsCacheSizeOfEngine implements SizeOfEngine { LOG.debug("Copying tracing sizeof engine, maxdepth: {}, abort: {}", maxDepth, abortWhenMaxDepthExceeded); - return new TimelineMetricsCacheSizeOfEngine( - underlying.copyWith(maxDepth, abortWhenMaxDepthExceeded)); + return new TimelineMetricsCacheSizeOfEngine(underlying.copyWith(maxDepth, abortWhenMaxDepthExceeded)); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/c32eebf8/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index e0d0373..ce70a62 100644 --- a/pom.xml +++ b/pom.xml @@ -394,6 +394,7 @@ <exclude>ambari-metrics/target/rpm/ambari-metrics/SPECS/ambari-metrics.spec</exclude> <exclude>ambari-metrics/ambari-metrics-timelineservice/src/test/resources/lib/org/apache/phoenix/phoenix-core-tests/4.2.0/phoenix-core-tests-4.2.0.pom</exclude> <exclude>ambari-metrics/ambari-metrics-timelineservice/src/test/resources/lib/org/apache/phoenix/phoenix-core-tests/maven-metadata-local.xml</exclude> + <exclude>ambari-metrics/ambari-metrics-alertservice/*.iml</exclude> <exclude>ambari-metrics/*/target/**</exclude> <!-- ignore .settings and .project --> <exclude>ambari-metrics/**/.*/**</exclude>