blob: 71fee7c991eed8f42616bce2f7a7006c58d0027c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.gms;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import org.apache.cassandra.diag.DiagnosticEvent;
import org.apache.cassandra.locator.InetAddressAndPort;
/**
* DiagnosticEvent implementation for {@link Gossiper} activities.
*/
public final class GossiperEvent extends DiagnosticEvent
{
private final InetAddressAndPort endpoint;
@Nullable
private final Long quarantineExpiration;
@Nullable
private final EndpointState localState;
private final Map<InetAddressAndPort, EndpointState> endpointStateMap;
private final boolean inShadowRound;
private final Map<InetAddressAndPort, Long> justRemovedEndpoints;
private final long lastProcessedMessageAt;
private final Set<InetAddressAndPort> liveEndpoints;
private final List<String> seeds;
private final Set<InetAddressAndPort> seedsInShadowRound;
private final Map<InetAddressAndPort, Long> unreachableEndpoints;
public enum GossiperEventType
{
MARKED_AS_SHUTDOWN,
CONVICTED,
REPLACEMENT_QUARANTINE,
REPLACED_ENDPOINT,
EVICTED_FROM_MEMBERSHIP,
REMOVED_ENDPOINT,
QUARANTINED_ENDPOINT,
MARKED_ALIVE,
REAL_MARKED_ALIVE,
MARKED_DEAD,
MAJOR_STATE_CHANGE_HANDLED,
SEND_GOSSIP_DIGEST_SYN
}
public GossiperEventType type;
GossiperEvent(GossiperEventType type, Gossiper gossiper, InetAddressAndPort endpoint,
@Nullable Long quarantineExpiration, @Nullable EndpointState localState)
{
this.type = type;
this.endpoint = endpoint;
this.quarantineExpiration = quarantineExpiration;
this.localState = localState;
this.endpointStateMap = gossiper.getEndpointStateMap();
this.inShadowRound = gossiper.isInShadowRound();
this.justRemovedEndpoints = gossiper.getJustRemovedEndpoints();
this.lastProcessedMessageAt = gossiper.getLastProcessedMessageAt();
this.liveEndpoints = gossiper.getLiveMembers();
this.seeds = gossiper.getSeeds();
this.seedsInShadowRound = gossiper.getSeedsInShadowRound();
this.unreachableEndpoints = gossiper.getUnreachableEndpoints();
}
public Enum<GossiperEventType> getType()
{
return type;
}
public HashMap<String, Serializable> toMap()
{
// be extra defensive against nulls and bugs
HashMap<String, Serializable> ret = new HashMap<>();
if (endpoint != null) ret.put("endpoint", endpoint.getHostAddressAndPort());
ret.put("quarantineExpiration", quarantineExpiration);
ret.put("localState", String.valueOf(localState));
ret.put("endpointStateMap", String.valueOf(endpointStateMap));
ret.put("inShadowRound", inShadowRound);
ret.put("justRemovedEndpoints", String.valueOf(justRemovedEndpoints));
ret.put("lastProcessedMessageAt", lastProcessedMessageAt);
ret.put("liveEndpoints", String.valueOf(liveEndpoints));
ret.put("seeds", String.valueOf(seeds));
ret.put("seedsInShadowRound", String.valueOf(seedsInShadowRound));
ret.put("unreachableEndpoints", String.valueOf(unreachableEndpoints));
return ret;
}
}