Author: stefanegli
Date: Tue Jun 4 10:44:50 2013
New Revision: 1489380
URL: http://svn.apache.org/r1489380
Log:
SLING-2901 : implemented robust paranoia check by writing and checking
additional, new runtimeId property
Modified:
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
Modified:
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java?rev=1489380&r1=1489379&r2=1489380&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
(original)
+++
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
Tue Jun 4 10:44:50 2013
@@ -47,6 +47,7 @@ import org.apache.sling.discovery.impl.c
import
org.apache.sling.discovery.impl.topology.announcement.AnnouncementRegistry;
import org.apache.sling.discovery.impl.topology.connector.ConnectorRegistry;
import org.apache.sling.settings.SlingSettingsService;
+import org.osgi.framework.BundleException;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -112,9 +113,17 @@ public class HeartbeatHandler implements
/** SLING-2895: avoid heartbeats after deactivation **/
private boolean activated = false;
+ /** SLING-2901: the runtimeId is a unique id, set on activation, used for
robust duplicate sling.id detection **/
+ private String runtimeId;
+
+ /** keep a reference to the component context **/
+ private ComponentContext context;
+
@Activate
protected synchronized void activate(ComponentContext context) {
synchronized(lock) {
+ this.context = context;
+
slingId = slingSettingsService.getSlingId();
// on activate the resetLeaderElectionId is set to true to
ensure that
// the 'leaderElectionId' property is reset on next heartbeat
issuance.
@@ -122,6 +131,12 @@ public class HeartbeatHandler implements
// become leader on next join - and by resetting the
leaderElectionId
// to the current time, this is ensured.
resetLeaderElectionId = true;
+ runtimeId = UUID.randomUUID().toString();
+
+ // SLING-2895: reset variables to avoid unnecessary log.error
+ firstHeartbeatWritten = -1;
+ lastHeartbeatWritten = null;
+
activated = true;
}
}
@@ -268,8 +283,36 @@ public class HeartbeatHandler implements
}
}
}
+
+ // SLING-2901 : robust paranoia check: on first heartbeat
write, the
+ // 'runtimeId' is set as a property (ignoring any
former value).
+ // If in subsequent calls the value of 'runtimeId'
changes, then
+ // there is someone else around with the same
slingId.
+ final String readRuntimeId = resourceMap.get("runtimeId",
String.class);
+ if (!runtimeId.equals(readRuntimeId)) {
+ logger.error("issueClusterLocalHeartbeat: SLING-2091:
Detected more than 1 instance running in this cluster " +
+ " with the same sling.id. My sling.id
is "+slingId+", " +
+ " Check for sling.id.file in
your installation of all instances in this cluster " +
+ "to verify this! Duplicate
sling.ids are not allowed within a cluster!");
+ logger.error("issueClusterLocalHeartbeat: disabling
discovery.impl");
+ activated = false;
+ if (context!=null) {
+ // disable all components
+ try {
+
context.getBundleContext().getBundle().stop();
+ } catch (BundleException e) {
+
logger.warn("issueClusterLocalHeartbeat: could not stop bundle: "+e, e);
+ // then disable all
compnoents instead
+
context.disableComponent(null);
+ }
+ }
+ return;
+ }
}
resourceMap.put("lastHeartbeat", currentTime);
+ if (firstHeartbeatWritten==-1) {
+ resourceMap.put("runtimeId", runtimeId);
+ }
if (resetLeaderElectionId ||
!resourceMap.containsKey("leaderElectionId")) {
int maxLongLength = String.valueOf(Long.MAX_VALUE).length();
String currentTimeMillisStr = String.format("%0"
Modified:
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java?rev=1489380&r1=1489379&r2=1489380&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
(original)
+++
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
Tue Jun 4 10:44:50 2013
@@ -233,6 +233,8 @@ public class MockedResource extends Synt
}
if (type.equals(Calendar.class)) {
return (T) p.getDate();
+ } else if (type.equals(String.class)) {
+ return (T) p.getString();
} else {
throw new UnsupportedOperationException();
}