From 970f934341c2151a8b01707157d8f0f9d1e82817 Mon Sep 17 00:00:00 2001 From: Alexander Dejanovski Date: Fri, 26 Aug 2016 14:57:51 +0200 Subject: [PATCH] fix for getPendingTasks() that disappeared in C* 3.0 (using JMX directly to get pending compactions) disabled primary range repair for incremental repair as it leaves unrepaired data on disk --- .../spotify/reaper/cassandra/JmxProxy.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) 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()])); } }