use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class KubernetesMembershipProvider method parsePods.
@SuppressWarnings("unchecked")
protected void parsePods(Reader reader, List<MemberImpl> members) {
JSONParser parser = new JSONParser(reader);
try {
LinkedHashMap<String, Object> json = parser.object();
Object itemsObject = json.get("items");
if (!(itemsObject instanceof List<?>)) {
log.error(sm.getString("kubernetesMembershipProvider.invalidPodsList", "no items"));
return;
}
List<Object> items = (List<Object>) itemsObject;
for (Object podObject : items) {
if (!(podObject instanceof LinkedHashMap<?, ?>)) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "item"));
continue;
}
LinkedHashMap<String, Object> pod = (LinkedHashMap<String, Object>) podObject;
// If there is a "kind", check it is "Pod"
Object podKindObject = pod.get("kind");
if (podKindObject != null && !"Pod".equals(podKindObject)) {
continue;
}
// "metadata" contains "name", "uid" and "creationTimestamp"
Object metadataObject = pod.get("metadata");
if (!(metadataObject instanceof LinkedHashMap<?, ?>)) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "metadata"));
continue;
}
LinkedHashMap<String, Object> metadata = (LinkedHashMap<String, Object>) metadataObject;
Object nameObject = metadata.get("name");
if (nameObject == null) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "name"));
continue;
}
Object objectUid = metadata.get("uid");
Object creationTimestampObject = metadata.get("creationTimestamp");
if (creationTimestampObject == null) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "uid"));
continue;
}
String creationTimestamp = creationTimestampObject.toString();
// "status" contains "phase" (which must be "Running") and "podIP"
Object statusObject = pod.get("status");
if (!(statusObject instanceof LinkedHashMap<?, ?>)) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "status"));
continue;
}
LinkedHashMap<String, Object> status = (LinkedHashMap<String, Object>) statusObject;
if (!"Running".equals(status.get("phase"))) {
continue;
}
Object podIPObject = status.get("podIP");
if (podIPObject == null) {
log.warn(sm.getString("kubernetesMembershipProvider.invalidPod", "podIP"));
continue;
}
String podIP = podIPObject.toString();
String uid = (objectUid == null) ? podIP : objectUid.toString();
// We found ourselves, ignore
if (podIP.equals(localIp)) {
// Update the UID on initial lookup
Member localMember = service.getLocalMember(false);
if (localMember.getUniqueId() == CloudMembershipService.INITIAL_ID && localMember instanceof MemberImpl) {
byte[] id = md5.digest(uid.getBytes(StandardCharsets.US_ASCII));
((MemberImpl) localMember).setUniqueId(id);
}
continue;
}
long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).toMillis();
MemberImpl member = null;
try {
member = new MemberImpl(podIP, port, aliveTime);
} catch (IOException e) {
// Shouldn't happen:
// an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
continue;
}
byte[] id = md5.digest(uid.getBytes(StandardCharsets.US_ASCII));
member.setUniqueId(id);
members.add(member);
}
} catch (Exception e) {
log.error(sm.getString("kubernetesMembershipProvider.jsonError"), e);
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class AbstractReplicatedMap method leftOver.
/**
* If the reply has already been sent to the requesting thread,
* the rpc callback can handle any data that comes in after the fact.
* @param msg Serializable
* @param sender Member
*/
@Override
public void leftOver(Serializable msg, Member sender) {
// left over membership messages
if (!(msg instanceof MapMessage)) {
return;
}
MapMessage mapmsg = (MapMessage) msg;
try {
mapmsg.deserialize(getExternalLoaders());
if (mapmsg.getMsgType() == MapMessage.MSG_START) {
mapMemberAdded(mapmsg.getPrimary());
} else if (mapmsg.getMsgType() == MapMessage.MSG_INIT) {
memberAlive(mapmsg.getPrimary());
} else if (mapmsg.getMsgType() == MapMessage.MSG_PING) {
Member member = mapmsg.getPrimary();
if (log.isInfoEnabled()) {
log.info(sm.getString("abstractReplicatedMap.leftOver.pingMsg", member));
}
State state = (State) mapmsg.getValue();
if (state.isAvailable()) {
memberAlive(member);
}
} else {
// other messages are ignored.
if (log.isInfoEnabled()) {
log.info(sm.getString("abstractReplicatedMap.leftOver.ignored", mapmsg.getTypeDesc()));
}
}
} catch (IOException | ClassNotFoundException x) {
log.error(sm.getString("abstractReplicatedMap.unable.deserialize.MapMessage"), x);
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class AbstractReplicatedMap method mapMemberAdded.
public void mapMemberAdded(Member member) {
if (member.equals(getChannel().getLocalMember(false))) {
return;
}
boolean memberAdded = false;
// select a backup node if we don't have one
Member mapMember = getChannel().getMember(member);
if (mapMember == null) {
log.warn(sm.getString("abstractReplicatedMap.mapMemberAdded.nullMember", member));
return;
}
synchronized (mapMembers) {
if (!mapMembers.containsKey(mapMember)) {
if (log.isInfoEnabled()) {
log.info(sm.getString("abstractReplicatedMap.mapMemberAdded.added", mapMember));
}
mapMembers.put(mapMember, Long.valueOf(System.currentTimeMillis()));
memberAdded = true;
}
}
if (memberAdded) {
synchronized (stateMutex) {
for (Entry<K, MapEntry<K, V>> e : innerMap.entrySet()) {
MapEntry<K, V> entry = innerMap.get(e.getKey());
if (entry == null) {
continue;
}
if (entry.isPrimary() && (entry.getBackupNodes() == null || entry.getBackupNodes().length == 0)) {
try {
Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
entry.setBackupNodes(backup);
entry.setPrimary(channel.getLocalMember(false));
} catch (ChannelException x) {
log.error(sm.getString("abstractReplicatedMap.unableSelect.backup"), x);
}
// catch
}
// end if
}
// while
}
// synchronized
}
// end if
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class AbstractReplicatedMap method transferState.
public void transferState() {
try {
Member[] members = getMapMembers();
Member backup = members.length > 0 ? members[0] : null;
if (backup != null) {
MapMessage msg = new MapMessage(mapContextName, getStateMessageType(), false, null, null, null, null, null);
Response[] resp = rpcChannel.send(new Member[] { backup }, msg, RpcChannel.FIRST_REPLY, channelSendOptions, rpcTimeout);
if (resp.length > 0) {
synchronized (stateMutex) {
msg = (MapMessage) resp[0].getMessage();
msg.deserialize(getExternalLoaders());
ArrayList<?> list = (ArrayList<?>) msg.getValue();
for (Object o : list) {
messageReceived((Serializable) o, resp[0].getSource());
}
// for
}
stateTransferred = true;
} else {
log.warn(sm.getString("abstractReplicatedMap.transferState.noReplies"));
}
}
} catch (ChannelException | ClassNotFoundException | IOException x) {
log.error(sm.getString("abstractReplicatedMap.unable.transferState"), x);
}
this.state = State.STATETRANSFERRED;
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class Membership method memberAlive.
/**
* Notify the membership that this member has announced itself.
*
* @param member - the member that just pinged us
* @return - true if this member is new to the cluster, false otherwise.<br>
* - false if this member is the local member or updated.
*/
public boolean memberAlive(Member member) {
// Ignore ourselves
if (member.equals(local)) {
return false;
}
boolean result = false;
synchronized (membersLock) {
MbrEntry entry = map.get(member);
if (entry == null) {
entry = addMember(member);
result = true;
} else {
// Update the member alive time
Member updateMember = entry.getMember();
if (updateMember.getMemberAliveTime() != member.getMemberAliveTime()) {
// Update fields that can change
updateMember.setMemberAliveTime(member.getMemberAliveTime());
updateMember.setPayload(member.getPayload());
updateMember.setCommand(member.getCommand());
// Re-order. Can't sort in place since a call to
// getMembers() may then receive an intermediate result.
Member[] newMembers = members.clone();
Arrays.sort(newMembers, memberComparator);
members = newMembers;
}
}
entry.accessed();
}
return result;
}
Aggregations