in src/main/java/org/apache/sling/discovery/commons/providers/spi/base/IdMapService.java [184:246]
private synchronized boolean init() throws LoginException, PersistenceException {
if (initialized) {
return true;
}
slingId = settingsService.getSlingId();
ResourceResolver resourceResolver = null;
try{
resourceResolver = getResourceResolver();
DiscoveryLiteDescriptor descriptor =
DiscoveryLiteDescriptor.getDescriptorFrom(resourceResolver);
long me = descriptor.getMyId();
final Resource resource = ResourceHelper.getOrCreateResource(resourceResolver, getIdMapPath());
ModifiableValueMap idmap = resource.adaptTo(ModifiableValueMap.class);
// check to see if either my slingId is already mapped to another clusterNodeId
// or when my clusterNodeId is already mapped to another slingId
// in both cases: clean that up
boolean foundMe = false;
for (String aKey : new HashSet<>(idmap.keySet())) {
Object value = idmap.get(aKey);
if (value instanceof Number) {
Number n = (Number)value;
if (n.longValue()==me) {
// my clusterNodeId is already mapped to
// let's check if the key is my slingId
if (aKey.equals(slingId)) {
// perfect
foundMe = true;
} else {
// cleanup necessary
logger.info("init: my clusterNodeId is already mapped to by another slingId, deleting entry: key="+aKey+" mapped to "+value);
idmap.remove(aKey);
}
} else if (aKey.equals(slingId)) {
// cleanup necessary
logger.info("init: my slingId is already mapped to by another clusterNodeId, deleting entry: key="+aKey+" mapped to "+value);
idmap.remove(aKey);
} else {
// that's just some other slingId-clusterNodeId mapping
// leave it unchanged
}
}
}
if (!foundMe) {
logger.info("init: added the following mapping: slingId="+slingId+" to discovery-lite id="+me);
idmap.put(slingId, me);
} else {
logger.info("init: mapping already existed, left unchanged: slingId="+slingId+" to discovery-lite id="+me);
}
resourceResolver.commit();
this.me = me;
initialized = true;
notifyAll();
return true;
} catch(Exception e) {
logger.info("init: init failed: "+e);
return false;
} finally {
if (resourceResolver!=null) {
resourceResolver.close();
}
}
}