use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class Arrays method diff.
public static Member[] diff(Membership complete, Membership local, Member ignore) {
List<Member> result = new ArrayList<>();
Member[] comp = complete.getMembers();
for (Member member : comp) {
if (ignore != null && ignore.equals(member)) {
continue;
}
if (local.getMember(member) == null) {
result.add(member);
}
}
return result.toArray(new Member[0]);
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class ReplicatedMap method memberDisappeared.
@Override
public void memberDisappeared(Member member) {
boolean removed = false;
Log log = getLog();
synchronized (mapMembers) {
removed = (mapMembers.remove(member) != null);
if (!removed) {
if (log.isDebugEnabled()) {
log.debug("Member[" + member + "] disappeared, but was not present in the map.");
}
// the member was not part of our map.
return;
}
}
if (log.isInfoEnabled()) {
log.info(sm.getString("replicatedMap.member.disappeared", member));
}
long start = System.currentTimeMillis();
for (Entry<K, MapEntry<K, V>> e : innerMap.entrySet()) {
MapEntry<K, V> entry = innerMap.get(e.getKey());
if (entry == null) {
continue;
}
if (entry.isPrimary()) {
try {
Member[] backup = getMapMembers();
if (backup.length > 0) {
MapMessage msg = new MapMessage(getMapContextName(), MapMessage.MSG_NOTIFY_MAPMEMBER, false, (Serializable) entry.getKey(), null, null, channel.getLocalMember(false), backup);
getChannel().send(backup, msg, getChannelSendOptions());
}
entry.setBackupNodes(backup);
entry.setPrimary(channel.getLocalMember(false));
} catch (ChannelException x) {
log.error(sm.getString("replicatedMap.unable.relocate", entry.getKey()), x);
}
} else if (member.equals(entry.getPrimary())) {
entry.setPrimary(null);
}
if (entry.getPrimary() == null && entry.isCopy() && entry.getBackupNodes() != null && entry.getBackupNodes().length > 0 && entry.getBackupNodes()[0].equals(channel.getLocalMember(false))) {
try {
entry.setPrimary(channel.getLocalMember(false));
entry.setBackup(false);
entry.setProxy(false);
entry.setCopy(false);
Member[] backup = getMapMembers();
if (backup.length > 0) {
MapMessage msg = new MapMessage(getMapContextName(), MapMessage.MSG_NOTIFY_MAPMEMBER, false, (Serializable) entry.getKey(), null, null, channel.getLocalMember(false), backup);
getChannel().send(backup, msg, getChannelSendOptions());
}
entry.setBackupNodes(backup);
if (mapOwner != null) {
mapOwner.objectMadePrimary(entry.getKey(), entry.getValue());
}
} catch (ChannelException x) {
log.error(sm.getString("replicatedMap.unable.relocate", entry.getKey()), x);
}
}
}
// while
long complete = System.currentTimeMillis() - start;
if (log.isInfoEnabled()) {
log.info(sm.getString("replicatedMap.relocate.complete", Long.toString(complete)));
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class NonBlockingCoordinator method createElectionMsg.
private CoordinationMessage createElectionMsg(Member local, Member[] others, Member leader) {
Membership m = new Membership(local, AbsoluteOrder.comp, true);
Arrays.fill(m, others);
Member[] mbrs = m.getMembers();
m.reset();
CoordinationMessage msg = new CoordinationMessage(leader, local, mbrs, new UniqueId(UUIDGenerator.randomUUID(true)), COORD_REQUEST);
return msg;
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class NonBlockingCoordinator method heartbeat.
@Override
public void heartbeat() {
try {
Member local = getLocalMember(false);
if (view != null && (Arrays.diff(view, membership, local).length != 0 || Arrays.diff(membership, view, local).length != 0)) {
if (isHighest()) {
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_START_ELECT, this, sm.getString("nonBlockingCoordinator.heartbeat.inconsistency")));
startElection(true);
}
}
} catch (Exception x) {
log.error(sm.getString("nonBlockingCoordinator.heartbeat.failed"), x);
} finally {
super.heartbeat();
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class NonBlockingCoordinator method mergeOnArrive.
protected Membership mergeOnArrive(CoordinationMessage msg) {
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_PRE_MERGE, this, "Pre merge"));
Member local = getLocalMember(false);
Membership merged = new Membership(local, AbsoluteOrder.comp, true);
Arrays.fill(merged, msg.getMembers());
Arrays.fill(merged, getMembers());
Member[] diff = Arrays.diff(merged, membership, local);
for (Member member : diff) {
if (!alive(member)) {
merged.removeMember(member);
} else {
memberAdded(member, false);
}
}
fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_POST_MERGE, this, "Post merge"));
return merged;
}
Aggregations