diff --git a/src/main/java/com/spotify/reaper/cassandra/JmxProxy.java b/src/main/java/com/spotify/reaper/cassandra/JmxProxy.java index 2bac76af4..83232cbbc 100644 --- a/src/main/java/com/spotify/reaper/cassandra/JmxProxy.java +++ b/src/main/java/com/spotify/reaper/cassandra/JmxProxy.java @@ -65,6 +65,8 @@ public class JmxProxy implements NotificationListener, AutoCloseable { private static final String SS_OBJECT_NAME = "org.apache.cassandra.db:type=StorageService"; private static final String AES_OBJECT_NAME = "org.apache.cassandra.internal:type=AntiEntropySessions"; + private static final String COMP_OBJECT_NAME = + "org.apache.cassandra.metrics:type=Compaction"; private final JMXConnector jmxConnector; private final ObjectName ssMbeanName; @@ -255,7 +257,23 @@ public Set getTableNamesForKeyspace(String keyspace) throws ReaperExcept */ public int getPendingCompactions() { checkNotNull(cmProxy, "Looks like the proxy is not connected"); - return cmProxy.getPendingTasks(); + try { + ObjectName name = new ObjectName(COMP_OBJECT_NAME); + int pendingCount = (int) mbeanServer.getAttribute(name, "PendingTasks"); + return pendingCount; + } catch (IOException ignored) { + LOG.warn("Failed to connect to " + host + " using JMX"); + } catch (MalformedObjectNameException ignored) { + LOG.error("Internal error, malformed name"); + } catch (InstanceNotFoundException e) { + // This happens if no repair has yet been run on the node + // The AntiEntropySessions object is created on the first repair + return 0; + } catch (Exception e) { + LOG.error("Error getting attribute from JMX", e); + } + // If uncertain, assume it's running + return 0; } /** @@ -365,7 +383,7 @@ public int triggerRepair(BigInteger beginToken, BigInteger endToken, String keys columnFamilies.toArray(new String[columnFamilies.size()])); } else { - return ssProxy.forceRepairAsync(keyspace, Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, fullRepair, columnFamilies.toArray(new String[columnFamilies.size()])); + return ssProxy.forceRepairAsync(keyspace, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, fullRepair, columnFamilies.toArray(new String[columnFamilies.size()])); } }