From 23fab443df4dd0e314c1131f2edd227634f9de66 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Tue, 30 May 2017 17:12:54 +0200 Subject: Revert "Introduce class to track stale ActiveContainer instances" This reverts commit 41a1db5c510ff536caa3740a0f6df9acf8e0cbef. --- .../jdisc/core/ActiveContainerStatistics.java | 137 --------------------- 1 file changed, 137 deletions(-) delete mode 100644 jdisc_core/src/main/java/com/yahoo/jdisc/core/ActiveContainerStatistics.java (limited to 'jdisc_core') diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ActiveContainerStatistics.java b/jdisc_core/src/main/java/com/yahoo/jdisc/core/ActiveContainerStatistics.java deleted file mode 100644 index 43a57aece64..00000000000 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ActiveContainerStatistics.java +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.jdisc.core; - -import com.yahoo.jdisc.Metric; - -import java.time.Instant; -import java.util.List; -import java.util.WeakHashMap; -import java.util.logging.Logger; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; - -/** - * Tracks statistics on stale {@link ActiveContainer} instances. - * - * @author bjorncs - */ -public class ActiveContainerStatistics { - public interface Metrics { - String TOTAL_DEACTIVATED_CONTAINERS = "jdisc.deactivated_containers.total"; - String DEACTIVATED_CONTAINERS_WITH_RETAINED_REFERENCES = "jdisc.deactivated_containers.with_retained_refs"; - } - - private static final Logger log = Logger.getLogger(ActiveContainerStatistics.class.getName()); - - private final WeakHashMap activeContainers = new WeakHashMap<>(); - private final Object lock = new Object(); - - public void onActivated(ActiveContainer activeContainer) { - synchronized (lock) { - activeContainers.put(activeContainer, new ActiveContainerStats(Instant.now())); - } - } - - public void onDeactivated(ActiveContainer activeContainer) { - synchronized (lock) { - ActiveContainerStats containerStats = activeContainers.get(activeContainer); - if (containerStats == null) { - throw new IllegalStateException("onActivated() has not been called for container: " + activeContainer); - } - containerStats.setTimeDeactived(Instant.now()); - } - } - - public void outputMetrics(Metric metric) { - synchronized (lock) { - DeactivatedContainerMetrics metrics = deactivatedContainerStream() - .collect( - DeactivatedContainerMetrics::new, - DeactivatedContainerMetrics::aggregate, - DeactivatedContainerMetrics::merge); - - metric.set(Metrics.TOTAL_DEACTIVATED_CONTAINERS, metrics.deactivatedContainerCount, null); - metric.set(Metrics.DEACTIVATED_CONTAINERS_WITH_RETAINED_REFERENCES, metrics.deactivatedContainersWithRetainedRefsCount, null); - } - } - - public void printSummaryToLog() { - synchronized (lock) { - List deactivatedContainers = deactivatedContainerStream().collect(toList()); - if (deactivatedContainers.isEmpty()) { - return; - } - log.warning( - "Multiple instances of ActiveContainer leaked! " + deactivatedContainers.size() + - " instances are still present."); - deactivatedContainers.stream() - .map(c -> " - " + c.toSummaryString()) - .forEach(log::warning); - } - } - - private Stream deactivatedContainerStream() { - synchronized (lock) { - return activeContainers.entrySet().stream() - .filter(e -> e.getKey() != null) - .filter(e -> !e.getValue().isDeactivated()) - .map(e -> new DeactivatedContainer(e.getKey(), e.getValue().timeActivated, e.getValue().timeDeactived)); - } - } - - private static class ActiveContainerStats { - public final Instant timeActivated; - public Instant timeDeactived; - - public ActiveContainerStats(Instant timeActivated) { - this.timeActivated = timeActivated; - } - - public void setTimeDeactived(Instant instant) { - this.timeDeactived = instant; - } - - public boolean isDeactivated() { - return timeDeactived == null; - } - } - - private static class DeactivatedContainer { - public final ActiveContainer activeContainer; - public final Instant timeActivated; - public final Instant timeDeactivated; - - public DeactivatedContainer(ActiveContainer activeContainer, Instant timeActivated, Instant timeDeactivated) { - this.activeContainer = activeContainer; - this.timeActivated = timeActivated; - this.timeDeactivated = timeDeactivated; - } - - public String toSummaryString() { - return String.format("%s: timeActivated=%s, timeDeactivated=%s, retainCount=%d", - activeContainer.toString(), - timeActivated.toString(), - timeDeactivated.toString(), - activeContainer.retainCount()); - } - } - - private static class DeactivatedContainerMetrics { - public int deactivatedContainerCount = 0; - public int deactivatedContainersWithRetainedRefsCount = 0; - - public void aggregate(DeactivatedContainer deactivatedContainer) { - ++deactivatedContainerCount; - if (deactivatedContainer.activeContainer.retainCount() > 0) { - ++deactivatedContainersWithRetainedRefsCount; - } - } - - public DeactivatedContainerMetrics merge(DeactivatedContainerMetrics other) { - deactivatedContainerCount += other.deactivatedContainerCount; - deactivatedContainersWithRetainedRefsCount += other.deactivatedContainersWithRetainedRefsCount; - return this; - } - } -} -- cgit v1.2.3