use of org.apache.sling.discovery.base.commons.DefaultTopologyView in project sling by apache.
the class TopologyHelper method createTopologyView.
public static DefaultTopologyView createTopologyView(String clusterViewId, String slingId) {
DefaultTopologyView t = new DefaultTopologyView();
DefaultClusterView c = new DefaultClusterView(clusterViewId);
DefaultInstanceDescription i = new DefaultInstanceDescription(c, true, false, slingId, new HashMap<String, String>());
Collection<InstanceDescription> instances = new LinkedList<InstanceDescription>();
instances.add(i);
t.addInstances(instances);
return t;
}
use of org.apache.sling.discovery.base.commons.DefaultTopologyView in project sling by apache.
the class TopologyHelper method cloneTopologyView.
public static DefaultTopologyView cloneTopologyView(DefaultTopologyView view, String newLeader) throws NoSuchFieldException {
final DefaultTopologyView clone = cloneTopologyView(view);
final DefaultClusterView cluster = (DefaultClusterView) clone.getClusterViews().iterator().next();
for (Iterator it = cluster.getInstances().iterator(); it.hasNext(); ) {
DefaultInstanceDescription id = (DefaultInstanceDescription) it.next();
PrivateAccessor.setField(id, "isLeader", id.getSlingId().equals(newLeader));
}
return clone;
}
use of org.apache.sling.discovery.base.commons.DefaultTopologyView in project sling by apache.
the class TopologyHelper method cloneTopologyView.
public static DefaultTopologyView cloneTopologyView(DefaultTopologyView original) {
DefaultTopologyView t = new DefaultTopologyView();
Iterator<ClusterView> it = original.getClusterViews().iterator();
while (it.hasNext()) {
DefaultClusterView c = (DefaultClusterView) it.next();
t.addInstances(clone(c).getInstances());
}
return t;
}
use of org.apache.sling.discovery.base.commons.DefaultTopologyView in project sling by apache.
the class OakDiscoveryService method checkForTopologyChange.
/**
* Check the current topology for any potential change
*/
public void checkForTopologyChange() {
viewStateManagerLock.lock();
try {
if (!activated) {
logger.debug("checkForTopologyChange: not yet activated, ignoring");
return;
}
DefaultTopologyView t = (DefaultTopologyView) getTopology();
if (t.isCurrent()) {
// if we have a valid view, let the viewStateManager do the
// comparison and sending of an event, if necessary
viewStateManager.handleNewView(t);
setOldView(t);
} else {
// if we don't have a view, then we might have to send
// a CHANGING event, let that be decided by the viewStateManager as well
viewStateManager.handleChanging();
}
} finally {
if (viewStateManagerLock != null) {
viewStateManagerLock.unlock();
}
}
}
use of org.apache.sling.discovery.base.commons.DefaultTopologyView in project sling by apache.
the class OakDiscoveryService method activate.
/**
* Activate this service
*/
@Activate
protected void activate(final BundleContext bundleContext) {
logger.debug("OakDiscoveryService activating...");
if (settingsService == null) {
throw new IllegalStateException("settingsService not found");
}
if (oakViewChecker == null) {
throw new IllegalStateException("heartbeatHandler not found");
}
slingId = settingsService.getSlingId();
ClusterSyncService consistencyService;
if (config.getSyncTokenEnabled()) {
//TODO: ConsistencyHistory is implemented a little bit hacky ..
ClusterSyncHistory consistencyHistory = new ClusterSyncHistory();
oakBacklogClusterSyncService.setConsistencyHistory(consistencyHistory);
syncTokenService.setConsistencyHistory(consistencyHistory);
consistencyService = new ClusterSyncServiceChain(oakBacklogClusterSyncService, syncTokenService);
} else {
consistencyService = oakBacklogClusterSyncService;
}
viewStateManager = ViewStateManagerFactory.newViewStateManager(viewStateManagerLock, consistencyService);
if (config.getMinEventDelay() > 0) {
viewStateManager.installMinEventDelayHandler(this, scheduler, config.getMinEventDelay());
}
final String isolatedClusterId = UUID.randomUUID().toString();
{
// create a pre-voting/isolated topologyView which would be used
// until the first voting has finished.
// this way for the single-instance case the clusterId can
// remain the same between a getTopology() that is invoked before
// the first TOPOLOGY_INIT and afterwards
DefaultClusterView isolatedCluster = new DefaultClusterView(isolatedClusterId);
Map<String, String> emptyProperties = new HashMap<String, String>();
DefaultInstanceDescription isolatedInstance = new DefaultInstanceDescription(isolatedCluster, true, true, slingId, emptyProperties);
Collection<InstanceDescription> col = new ArrayList<InstanceDescription>();
col.add(isolatedInstance);
final DefaultTopologyView topology = new DefaultTopologyView();
topology.addInstances(col);
topology.setNotCurrent();
setOldView(topology);
}
setOldView((DefaultTopologyView) getTopology());
getOldView().setNotCurrent();
// make sure the first heartbeat is issued as soon as possible - which
// is right after this service starts. since the two (discoveryservice
// and heartbeatHandler need to know each other, the discoveryservice
// is passed on to the heartbeatHandler in this initialize call).
oakViewChecker.initialize(this);
viewStateManagerLock.lock();
try {
viewStateManager.handleActivated();
doUpdateProperties();
DefaultTopologyView newView = (DefaultTopologyView) getTopology();
if (newView.isCurrent()) {
viewStateManager.handleNewView(newView);
} else {
// SLING-3750: just issue a log.info about the delaying
logger.info("activate: this instance is in isolated mode and must yet finish voting before it can send out TOPOLOGY_INIT.");
}
activated = true;
setOldView(newView);
// bind them to the viewstatemanager too
for (TopologyEventListener listener : pendingListeners) {
viewStateManager.bind(listener);
}
pendingListeners.clear();
viewStateManager.bind(changePropagationListener);
} finally {
if (viewStateManagerLock != null) {
viewStateManagerLock.unlock();
}
}
URL[] topologyConnectorURLs = config.getTopologyConnectorURLs();
if (topologyConnectorURLs != null) {
for (int i = 0; i < topologyConnectorURLs.length; i++) {
final URL aURL = topologyConnectorURLs[i];
if (aURL != null) {
try {
logger.info("activate: registering outgoing topology connector to " + aURL);
connectorRegistry.registerOutgoingConnector(clusterViewService, aURL);
} catch (final Exception e) {
logger.info("activate: could not register url: " + aURL + " due to: " + e, e);
}
}
}
}
logger.debug("OakDiscoveryService activated.");
}
Aggregations