Repository: cassandra Updated Branches: refs/heads/trunk e739f6057 -> b210bd234
Store repair options in parent_repair_history Patch by marcuse; reviewed by Stefania Alborghetti for CASSANDRA-11244 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b210bd23 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b210bd23 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b210bd23 Branch: refs/heads/trunk Commit: b210bd2344b93ea6f7f95cecc1e5514ecff547df Parents: e739f60 Author: Marcus Eriksson <[email protected]> Authored: Thu Mar 17 10:41:08 2016 +0100 Committer: Marcus Eriksson <[email protected]> Committed: Thu Mar 17 12:52:47 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/repair/RepairRunnable.java | 2 +- .../repair/SystemDistributedKeyspace.java | 38 +++++++++++++++++--- .../cassandra/repair/messages/RepairOption.java | 19 +++++++++- 4 files changed, 53 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/b210bd23/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 0779083..311c1fa 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.6 + * Store repair options in parent_repair_history (CASSANDRA-11244) * Print current leveling in sstableofflinerelevel (CASSANDRA-9588) * Remove hard-coded SSL cipher suites and protocols (CASSANDRA-10508) * Improve concurrency in CompactionStrategyManager (CASSANDRA-10099) http://git-wip-us.apache.org/repos/asf/cassandra/blob/b210bd23/src/java/org/apache/cassandra/repair/RepairRunnable.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/repair/RepairRunnable.java b/src/java/org/apache/cassandra/repair/RepairRunnable.java index eb25457..2f54cf8 100644 --- a/src/java/org/apache/cassandra/repair/RepairRunnable.java +++ b/src/java/org/apache/cassandra/repair/RepairRunnable.java @@ -189,7 +189,7 @@ public class RepairRunnable extends WrappedRunnable implements ProgressEventNoti } final UUID parentSession = UUIDGen.getTimeUUID(); - SystemDistributedKeyspace.startParentRepair(parentSession, keyspace, cfnames, options.getRanges()); + SystemDistributedKeyspace.startParentRepair(parentSession, keyspace, cfnames, options); long repairedAt; try { http://git-wip-us.apache.org/repos/asf/cassandra/blob/b210bd23/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java b/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java index 9cf6c3e..2a479b4 100644 --- a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java +++ b/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java @@ -24,6 +24,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -38,6 +39,7 @@ import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.schema.KeyspaceMetadata; import org.apache.cassandra.schema.KeyspaceParams; import org.apache.cassandra.schema.Tables; @@ -90,6 +92,7 @@ public final class SystemDistributedKeyspace + "exception_stacktrace text," + "requested_ranges set<text>," + "successful_ranges set<text>," + + "options map<text, text>," + "PRIMARY KEY (parent_id))"); private static CFMetaData compile(String name, String description, String schema) @@ -103,15 +106,40 @@ public final class SystemDistributedKeyspace return KeyspaceMetadata.create(NAME, KeyspaceParams.simple(3), Tables.of(RepairHistory, ParentRepairHistory)); } - public static void startParentRepair(UUID parent_id, String keyspaceName, String[] cfnames, Collection<Range<Token>> ranges) + public static void startParentRepair(UUID parent_id, String keyspaceName, String[] cfnames, RepairOption options) { - - String query = "INSERT INTO %s.%s (parent_id, keyspace_name, columnfamily_names, requested_ranges, started_at)"+ - " VALUES (%s, '%s', { '%s' }, { '%s' }, toTimestamp(now()))"; - String fmtQry = String.format(query, NAME, PARENT_REPAIR_HISTORY, parent_id.toString(), keyspaceName, Joiner.on("','").join(cfnames), Joiner.on("','").join(ranges)); + Collection<Range<Token>> ranges = options.getRanges(); + String query = "INSERT INTO %s.%s (parent_id, keyspace_name, columnfamily_names, requested_ranges, started_at, options)"+ + " VALUES (%s, '%s', { '%s' }, { '%s' }, toTimestamp(now()), { %s })"; + String fmtQry = String.format(query, + NAME, + PARENT_REPAIR_HISTORY, + parent_id.toString(), + keyspaceName, + Joiner.on("','").join(cfnames), + Joiner.on("','").join(ranges), + toCQLMap(options.asMap(), RepairOption.RANGES_KEY, RepairOption.COLUMNFAMILIES_KEY)); processSilent(fmtQry); } + private static String toCQLMap(Map<String, String> options, String ... ignore) + { + Set<String> toIgnore = Sets.newHashSet(ignore); + StringBuilder map = new StringBuilder(); + boolean first = true; + for (Map.Entry<String, String> entry : options.entrySet()) + { + if (!toIgnore.contains(entry.getKey())) + { + if (!first) + map.append(','); + first = false; + map.append(String.format("'%s': '%s'", entry.getKey(), entry.getValue())); + } + } + return map.toString(); + } + public static void failParentRepair(UUID parent_id, Throwable t) { String query = "UPDATE %s.%s SET finished_at = toTimestamp(now()), exception_message=?, exception_stacktrace=? WHERE parent_id=%s"; http://git-wip-us.apache.org/repos/asf/cassandra/blob/b210bd23/src/java/org/apache/cassandra/repair/messages/RepairOption.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java index d50a2ed..843efde 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -19,6 +19,7 @@ package org.apache.cassandra.repair.messages; import java.util.*; +import com.google.common.base.Joiner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,6 @@ import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.repair.RepairParallelism; -import org.apache.cassandra.tools.nodetool.Repair; import org.apache.cassandra.utils.FBUtilities; /** @@ -45,6 +45,7 @@ public class RepairOption public static final String DATACENTERS_KEY = "dataCenters"; public static final String HOSTS_KEY = "hosts"; public static final String TRACE_KEY = "trace"; + public static final String SUB_RANGE_REPAIR_KEY = "sub_range_repair"; // we don't want to push nodes too much for repair public static final int MAX_JOB_THREADS = 4; @@ -317,4 +318,20 @@ public class RepairOption ", # of ranges: " + ranges.size() + ')'; } + + public Map<String, String> asMap() + { + Map<String, String> options = new HashMap<>(); + options.put(PARALLELISM_KEY, parallelism.toString()); + options.put(PRIMARY_RANGE_KEY, Boolean.toString(primaryRange)); + options.put(INCREMENTAL_KEY, Boolean.toString(incremental)); + options.put(JOB_THREADS_KEY, Integer.toString(jobThreads)); + options.put(COLUMNFAMILIES_KEY, Joiner.on(",").join(columnFamilies)); + options.put(DATACENTERS_KEY, Joiner.on(",").join(dataCenters)); + options.put(HOSTS_KEY, Joiner.on(",").join(hosts)); + options.put(SUB_RANGE_REPAIR_KEY, Boolean.toString(isSubrangeRepair)); + options.put(TRACE_KEY, Boolean.toString(trace)); + options.put(RANGES_KEY, Joiner.on(",").join(ranges)); + return options; + } }
