diff --git a/src/main/java/org/apache/cassandra/gms/FailureDetector.java b/src/main/java/org/apache/cassandra/gms/FailureDetector.java index e1a3012..3762100 100644 --- a/src/main/java/org/apache/cassandra/gms/FailureDetector.java +++ b/src/main/java/org/apache/cassandra/gms/FailureDetector.java @@ -26,12 +26,23 @@ package org.apache.cassandra.gms; import java.lang.management.ManagementFactory; import java.net.UnknownHostException; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import javax.json.JsonArray; import javax.json.JsonObject; +import javax.json.JsonValue; import javax.management.MBeanServer; import javax.management.ObjectName; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; import com.scylladb.jmx.api.APIClient; @@ -62,19 +73,23 @@ public class FailureDetector implements FailureDetectorMBean { } } + @Override public void dumpInterArrivalTimes() { log(" dumpInterArrivalTimes()"); } + @Override public void setPhiConvictThreshold(double phi) { log(" setPhiConvictThreshold(double phi)"); } + @Override public double getPhiConvictThreshold() { log(" getPhiConvictThreshold()"); return c.getDoubleValue("/failure_detector/phi"); } + @Override public String getAllEndpointStates() { log(" getAllEndpointStates()"); @@ -117,24 +132,60 @@ public class FailureDetector implements FailureDetectorMBean { return res; } + @Override public String getEndpointState(String address) throws UnknownHostException { log(" getEndpointState(String address) throws UnknownHostException"); return c.getStringValue("/failure_detector/endpoints/states/" + address); } + @Override public Map getSimpleStates() { log(" getSimpleStates()"); return c.getMapStrValue("/failure_detector/simple_states"); } + @Override public int getDownEndpointCount() { log(" getDownEndpointCount()"); return c.getIntValue("/failure_detector/count/endpoint/down"); } + @Override public int getUpEndpointCount() { log(" getUpEndpointCount()"); return c.getIntValue("/failure_detector/count/endpoint/up"); } + // From origin: + // this is useless except to provide backwards compatibility in phi_convict_threshold, + // because everyone seems pretty accustomed to the default of 8, and users who have + // already tuned their phi_convict_threshold for their own environments won't need to + // change. + private final double PHI_FACTOR = 1.0 / Math.log(10.0); // 0.434... + + @Override + public TabularData getPhiValues() throws OpenDataException { + final CompositeType ct = new CompositeType("Node", "Node", new String[] { "Endpoint", "PHI" }, + new String[] { "IP of the endpoint", "PHI value" }, + new OpenType[] { SimpleType.STRING, SimpleType.DOUBLE }); + final TabularDataSupport results = new TabularDataSupport( + new TabularType("PhiList", "PhiList", ct, new String[] { "Endpoint" })); + final JsonArray arr = c.getJsonArray("/failure_detector/endpoint_phi_values"); + + for (JsonValue v : arr) { + JsonObject o = (JsonObject) v; + String endpoint = o.getString("endpoint"); + double phi = Double.parseDouble(o.getString("phi")); + + if (phi != Double.MIN_VALUE) { + // returned values are scaled by PHI_FACTOR so that the are on + // the same scale as PhiConvictThreshold + final CompositeData data = new CompositeDataSupport(ct, new String[] { "Endpoint", "PHI" }, + new Object[] { endpoint, phi * PHI_FACTOR }); + results.put(data); + } + } + + return results; + } } diff --git a/src/main/java/org/apache/cassandra/gms/FailureDetectorMBean.java b/src/main/java/org/apache/cassandra/gms/FailureDetectorMBean.java index 45250b4..23fae3a 100644 --- a/src/main/java/org/apache/cassandra/gms/FailureDetectorMBean.java +++ b/src/main/java/org/apache/cassandra/gms/FailureDetectorMBean.java @@ -20,6 +20,9 @@ package org.apache.cassandra.gms; import java.net.UnknownHostException; import java.util.Map; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.TabularData; + public interface FailureDetectorMBean { public void dumpInterArrivalTimes(); @@ -37,4 +40,6 @@ public interface FailureDetectorMBean public int getDownEndpointCount(); public int getUpEndpointCount(); + + public TabularData getPhiValues() throws OpenDataException; }