Search in sources :

Example 26 with Member

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);
    }
}
Also used : MemberImpl(org.apache.catalina.tribes.membership.MemberImpl) IOException(java.io.IOException) IOException(java.io.IOException) LinkedHashMap(java.util.LinkedHashMap) JSONParser(org.apache.tomcat.util.json.JSONParser) ArrayList(java.util.ArrayList) List(java.util.List) Member(org.apache.catalina.tribes.Member)

Example 27 with Member

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);
    }
}
Also used : IOException(java.io.IOException) FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) Member(org.apache.catalina.tribes.Member)

Example 28 with Member

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
}
Also used : FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) Member(org.apache.catalina.tribes.Member) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 29 with Member

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;
}
Also used : Response(org.apache.catalina.tribes.group.Response) ArrayList(java.util.ArrayList) IOException(java.io.IOException) FaultyMember(org.apache.catalina.tribes.ChannelException.FaultyMember) Member(org.apache.catalina.tribes.Member) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 30 with Member

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;
}
Also used : Member(org.apache.catalina.tribes.Member)

Aggregations

Member (org.apache.catalina.tribes.Member)93 ChannelException (org.apache.catalina.tribes.ChannelException)28 FaultyMember (org.apache.catalina.tribes.ChannelException.FaultyMember)17 Test (org.junit.Test)17 IOException (java.io.IOException)16 MemberImpl (org.apache.catalina.tribes.membership.MemberImpl)15 ReceiverBase (org.apache.catalina.tribes.transport.ReceiverBase)11 ArrayList (java.util.ArrayList)10 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)10 UniqueId (org.apache.catalina.tribes.UniqueId)9 Serializable (java.io.Serializable)6 BigDecimal (java.math.BigDecimal)6 DecimalFormat (java.text.DecimalFormat)6 Response (org.apache.catalina.tribes.group.Response)6 ChannelData (org.apache.catalina.tribes.io.ChannelData)6 XByteBuffer (org.apache.catalina.tribes.io.XByteBuffer)6 SelectionKey (java.nio.channels.SelectionKey)4 Selector (java.nio.channels.Selector)4 Membership (org.apache.catalina.tribes.membership.Membership)4 StaticMember (org.apache.catalina.tribes.membership.StaticMember)4