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);
}
}