All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.protocols.INJECT_VIEW Maven / Gradle / Ivy

package org.jgroups.protocols;

import org.jgroups.Address;
import org.jgroups.View;
import org.jgroups.annotations.MBean;
import org.jgroups.annotations.ManagedOperation;
import org.jgroups.protocols.pbcast.GMS;
import org.jgroups.stack.Protocol;
import org.jgroups.util.NameCache;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Simple protocol to inject an arbitrary view on one or more cluster nodes.

* INJECT_VIEW exposes a managed operation (injectView) capable of injecting a view by parsing the view state from a string. * The string format is A=A/B/C;B=B/C;C=C (where A,B,C are node names), this would inject view [A,B,C] with A as leader in node A, * view [B,C] with B as leader in node B and view [C] in node C.

* In order to leverage the injection on multiple nodes at once use a tool like probe.sh * (https://github.com/belaban/JGroups/blob/master/tests/other/org/jgroups/tests/Probe.java) * @author Andrea Tarocchi * @author Ugo Landini * @since 4.0.10 * @see GMS */ @MBean(description="Protocol to inject an arbitrary view in nodes") public class INJECT_VIEW extends Protocol { public static final String NODE_VIEWS_SEPARATOR = ";"; public static final String VIEW_SEPARATOR = "="; public static final String NAMES_SEPARATOR = "/"; @ManagedOperation(description="Inject a view (example of view string format: A=A/B/C;B=B/C;C=C)") public synchronized void injectView(String newView) { try { log.info("Received request to inject view %s", newView); String[] perNode = newView.split(NODE_VIEWS_SEPARATOR); String thisNodeAddress = getProtocolStack().getChannel().getAddressAsString(); for( String nodeView : perNode ){ if( nodeView.startsWith(thisNodeAddress) ) { log.info("[channel: %s] Injecting a new view: %s", thisNodeAddress, nodeView); long viewId = getProtocolStack().getChannel().getView().getViewId().getId()+1; List
nodes = new ArrayList<>(); for( String nodeName : nodeView.split(VIEW_SEPARATOR)[1].split(NAMES_SEPARATOR) ){ for( Map.Entry entry : NameCache.getContents().entrySet() ) { if( nodeName.equals(entry.getValue()) ){ log.debug("[channel: %s] Found name: <%s> for address: <%s>", entry.getValue(), entry.getKey().toString()); nodes.add( entry.getKey() ); break; } } } View view = new View( nodes.get(0), viewId, nodes); GMS gms = getProtocolStack().findProtocol(GMS.class); gms.installView(view); log.info("[channel: %s] Injection finished of view: %s", thisNodeAddress, nodeView); } } } catch(Exception e) { log.warn(e.getMessage(), e); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy