Author: cziegeler
Date: Mon Dec 23 16:59:19 2013
New Revision: 1553149

URL: http://svn.apache.org/r1553149
Log:
SLING-3278 : Provide a HealthCheckExecutor service. Only use service.id as 
cache key, don't hold service reference

Modified:
    
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/ExecutionResult.java
    
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckDescriptor.java
    
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckResultCache.java

Modified: 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/ExecutionResult.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/ExecutionResult.java?rev=1553149&r1=1553148&r2=1553149&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/ExecutionResult.java
 (original)
+++ 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/ExecutionResult.java
 Mon Dec 23 16:59:19 2013
@@ -20,7 +20,6 @@ package org.apache.sling.hc.core.impl.ex
 import java.text.Collator;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.sling.hc.api.HealthCheck;
@@ -33,23 +32,27 @@ public class ExecutionResult implements 
 
     private final HealthCheckResult resultFromHC;
 
-    private final HealthCheckDescriptor healthCheckDescriptor;
+    private final String name;
+    private final List<String> tags;
     private final Date finishedAt;
     private final long elapsedTimeInMs;
+    private final long serviceId;
 
     /** Build a single-value Result
      *  @param s if lower than OK, our status is set to OK */
     ExecutionResult(final HealthCheckDescriptor healthCheckDescriptor, 
HealthCheckResult simpleResult,
             long elapsedTimeInMs) {
-        this.healthCheckDescriptor = healthCheckDescriptor;
+        this.name = healthCheckDescriptor.getName();
+        this.tags = healthCheckDescriptor.getTags();
         this.resultFromHC = simpleResult;
         this.finishedAt = new Date();
         this.elapsedTimeInMs = elapsedTimeInMs;
+        this.serviceId = healthCheckDescriptor.getServiceId();
     }
 
     /**
      * Shortcut constructor to created error result.
-     * 
+     *
      * @param healthCheckDescriptor
      * @param status
      * @param errorMessage
@@ -60,7 +63,7 @@ public class ExecutionResult implements 
 
     /**
      * Shortcut constructor to created error result.
-     * 
+     *
      * @param healthCheckDescriptor
      * @param status
      * @param errorMessage
@@ -69,11 +72,13 @@ public class ExecutionResult implements 
         this(healthCheckDescriptor, new Result(status, errorMessage), 
elapsedTime);
     }
 
+    @Override
     public boolean isOk() {
         return resultFromHC.isOk();
     }
 
 
+    @Override
     public Result.Status getStatus() {
         return resultFromHC.getStatus();
     }
@@ -88,24 +93,27 @@ public class ExecutionResult implements 
         return "ExecutionResult [status=" + getStatus() + ", finishedAt=" + 
finishedAt + ", elapsedTimeInMs=" + elapsedTimeInMs + "]";
     }
 
+    @Override
     public long getElapsedTimeInMs() {
         return elapsedTimeInMs;
     }
 
-    HealthCheckDescriptor getHealthCheckDescriptor() {
-        return healthCheckDescriptor;
+    Long getServiceId() {
+        return this.serviceId;
     }
 
+    @Override
     public String getHealthCheckName() {
-        return healthCheckDescriptor != null ? healthCheckDescriptor.getName() 
: toString();
+        return this.name;
     }
 
 
     @Override
     public List<String> getHealthCheckTags() {
-        return healthCheckDescriptor != null ? healthCheckDescriptor.getTags() 
: new LinkedList<String>();
+        return this.tags;
     }
 
+    @Override
     public Date getFinishedAt() {
         return finishedAt;
     }

Modified: 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckDescriptor.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckDescriptor.java?rev=1553149&r1=1553148&r2=1553149&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckDescriptor.java
 (original)
+++ 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckDescriptor.java
 Mon Dec 23 16:59:19 2013
@@ -32,17 +32,18 @@ import org.osgi.service.component.Compon
  */
 public class HealthCheckDescriptor {
 
+    private final long serviceId;
     private final transient ServiceReference serviceReference;
     private final String name;
     private final String className;
     private final List<String> tags;
 
-    public HealthCheckDescriptor(ServiceReference healthCheckRef) {
+    public HealthCheckDescriptor(final ServiceReference healthCheckRef) {
         if (healthCheckRef == null) {
             throw new IllegalArgumentException("HealthCheck reference must not 
be null");
         }
-
         this.serviceReference = healthCheckRef;
+        this.serviceId = (Long) 
healthCheckRef.getProperty(Constants.SERVICE_ID);
 
         this.name = getHealthCheckName(healthCheckRef);
         this.className = (String) 
healthCheckRef.getProperty(ComponentConstants.COMPONENT_NAME);
@@ -89,38 +90,27 @@ public class HealthCheckDescriptor {
     }
 
     public ServiceReference getServiceReference() {
-        return serviceReference;
+        return this.serviceReference;
+    }
+
+    public long getServiceId() {
+        return this.serviceId;
     }
 
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((className == null) ? 0 : 
className.hashCode());
-        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + (int) (serviceId ^ (serviceId >>> 32));
         return result;
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
+    public boolean equals(final Object obj) {
+        if ( !(obj instanceof HealthCheckDescriptor)) {
             return false;
-        HealthCheckDescriptor other = (HealthCheckDescriptor) obj;
-        if (className == null) {
-            if (other.className != null)
-                return false;
-        } else if (!className.equals(other.className))
-            return false;
-        if (name == null) {
-            if (other.name != null)
-                return false;
-        } else if (!name.equals(other.name))
-            return false;
-        return true;
+        }
+        final HealthCheckDescriptor other = (HealthCheckDescriptor) obj;
+        return serviceId == other.serviceId;
     }
-
 }

Modified: 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckResultCache.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckResultCache.java?rev=1553149&r1=1553148&r2=1553149&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckResultCache.java
 (original)
+++ 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckResultCache.java
 Mon Dec 23 16:59:19 2013
@@ -38,7 +38,7 @@ public class HealthCheckResultCache {
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-    private Map<HealthCheckDescriptor, HealthCheckResult> cache = new 
ConcurrentHashMap<HealthCheckDescriptor, HealthCheckResult>();
+    private final Map<Long, HealthCheckResult> cache = new 
ConcurrentHashMap<Long, HealthCheckResult>();
 
     @Override
     public String toString() {
@@ -47,21 +47,21 @@ public class HealthCheckResultCache {
 
     public void updateWith(final Collection<HealthCheckResult> results) {
         for (final HealthCheckResult result : results) {
-            ExecutionResult executionResult = (ExecutionResult) result;
-            cache.put(executionResult.getHealthCheckDescriptor(), 
executionResult);
+            final ExecutionResult executionResult = (ExecutionResult) result;
+            cache.put(executionResult.getServiceId(), result);
         }
     }
 
-    public void useValidCacheResults(List<HealthCheckDescriptor> 
healthCheckDescriptors,
+    public void useValidCacheResults(final List<HealthCheckDescriptor> 
healthCheckDescriptors,
             final Collection<HealthCheckResult> results,
-            long resultCacheTtlInMs) {
+            final long resultCacheTtlInMs) {
 
-        Iterator<HealthCheckDescriptor> checksIt = 
healthCheckDescriptors.iterator();
 
-        Set<HealthCheckResult> cachedResults = new 
TreeSet<HealthCheckResult>();
+        final Set<HealthCheckResult> cachedResults = new 
TreeSet<HealthCheckResult>();
+        final Iterator<HealthCheckDescriptor> checksIt = 
healthCheckDescriptors.iterator();
         while (checksIt.hasNext()) {
-            HealthCheckDescriptor descriptor = checksIt.next();
-            HealthCheckResult result = get(descriptor, resultCacheTtlInMs);
+            final HealthCheckDescriptor descriptor = checksIt.next();
+            final HealthCheckResult result = get(descriptor, 
resultCacheTtlInMs);
             if (result != null) {
                 cachedResults.add(result);
                 checksIt.remove();
@@ -71,12 +71,14 @@ public class HealthCheckResultCache {
         results.addAll(cachedResults);
     }
 
-    private HealthCheckResult get(HealthCheckDescriptor healthCheckDescriptor, 
long resultCacheTtlInMs) {
-        HealthCheckResult cachedResult = cache.get(healthCheckDescriptor);
+    private HealthCheckResult get(final HealthCheckDescriptor 
healthCheckDescriptor, final long resultCacheTtlInMs) {
+        final Long key = healthCheckDescriptor.getServiceId();
+        final HealthCheckResult cachedResult = cache.get(key);
         if (cachedResult != null) {
             Date finishedAt = cachedResult.getFinishedAt();
             if (finishedAt == null) {
-                // never cache without proper meta data
+                // never cache without proper meta data -> remove it
+                cache.remove(key);
                 return null;
             }
 
@@ -87,7 +89,8 @@ public class HealthCheckResultCache {
                 logger.debug("Cache hit: validUntil={} cachedResult={}", 
validUntil, cachedResult);
                 return cachedResult;
             } else {
-                logger.trace("Outdated result: validUntil={} cachedResult={}", 
validUntil, cachedResult);
+                logger.debug("Outdated result: validUntil={} cachedResult={}", 
validUntil, cachedResult);
+                cache.remove(key);
             }
         }
 


Reply via email to