Skip repair on system_trace and keyspaces with RF=1; patch by yukim reviewed by Sylvain Lebresne for CASSANDRA-4956
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/309666b4 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/309666b4 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/309666b4 Branch: refs/heads/trunk Commit: 309666b4dddd7e0292d8dfc5661901d9cb9fc549 Parents: c4cca2d Author: Yuki Morishita <yu...@apache.org> Authored: Thu Nov 15 10:59:48 2012 -0600 Committer: Yuki Morishita <yu...@apache.org> Committed: Thu Nov 15 10:59:48 2012 -0600 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/service/AntiEntropyService.java | 7 ++- .../apache/cassandra/service/StorageService.java | 69 ++++++--------- 3 files changed, 33 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/309666b4/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index fd6ab95..c499919 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,6 +13,7 @@ * Optimize mostRecentTomstone check in CC.collectAllData (CASSANDRA-4883) * Change stream session ID to UUID to avoid collision from same node (CASSANDRA-4813) * Use Stats.db when bulk loading if present (CASSANDRA-4957) + * Skip repair on system_trace and keyspaces with RF=1 (CASSANDRA-4956) Merged from 1.1: * reset getRangeSlice filter after finishing a row for get_paged_slice (CASSANDRA-4919) http://git-wip-us.apache.org/repos/asf/cassandra/blob/309666b4/src/java/org/apache/cassandra/service/AntiEntropyService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/AntiEntropyService.java b/src/java/org/apache/cassandra/service/AntiEntropyService.java index a7fa157..9f97f95 100644 --- a/src/java/org/apache/cassandra/service/AntiEntropyService.java +++ b/src/java/org/apache/cassandra/service/AntiEntropyService.java @@ -115,10 +115,15 @@ public class AntiEntropyService /** * Requests repairs for the given table and column families, and blocks until all repairs have been completed. + * + * @return Future for asynchronous call or null if there is no need to repair */ public RepairFuture submitRepairSession(Range<Token> range, String tablename, boolean isSequential, boolean isLocal, String... cfnames) { - RepairFuture futureTask = new RepairSession(range, tablename, isSequential, isLocal, cfnames).getFuture(); + RepairSession session = new RepairSession(range, tablename, isSequential, isLocal, cfnames); + if (session.endpoints.isEmpty()) + return null; + RepairFuture futureTask = session.getFuture(); executor.execute(futureTask); return futureTask; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/309666b4/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 0e6fd30..0206f40 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2223,10 +2223,29 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe */ public void forceTableRepair(final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException { - if (Table.SYSTEM_KS.equals(tableName)) + forceTableRepairRange(tableName, getLocalRanges(tableName), isSequential, isLocal, columnFamilies); + } + + public void forceTableRepairPrimaryRange(final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException + { + forceTableRepairRange(tableName, getLocalPrimaryRanges(), isSequential, isLocal, columnFamilies); + } + + public void forceTableRepairRange(String beginToken, String endToken, final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException + { + Token parsedBeginToken = getPartitioner().getTokenFactory().fromString(beginToken); + Token parsedEndToken = getPartitioner().getTokenFactory().fromString(endToken); + + logger.info("starting user-requested repair of range ({}, {}] for keyspace {} and column families {}", + parsedBeginToken, parsedEndToken, tableName, columnFamilies); + forceTableRepairRange(tableName, Collections.singleton(new Range<Token>(parsedBeginToken, parsedEndToken)), isSequential, isLocal, columnFamilies); + } + + public void forceTableRepairRange(final String tableName, final Collection<Range<Token>> ranges, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException + { + if (Table.SYSTEM_KS.equals(tableName) || Tracing.TRACE_KS.equals(tableName)) return; - Collection<Range<Token>> ranges = getLocalRanges(tableName); int cmd = nextRepairCommand.incrementAndGet(); logger.info("Starting repair command #{}, repairing {} ranges.", cmd, ranges.size()); @@ -2247,6 +2266,11 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe logger.error("Interrupted while waiting for the differencing of repair session " + future.session + " to be done. Repair may be imprecise.", e); } } + if (futures.isEmpty()) + { + logger.info("Nothing to repair on {} for command #{}", tableName, cmd); + return; + } boolean failedSession = false; @@ -2270,47 +2294,6 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe logger.info("Repair command #{} completed successfully", cmd); } - public void forceTableRepairPrimaryRange(final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException - { - if (Table.SYSTEM_KS.equals(tableName)) - return; - - List<AntiEntropyService.RepairFuture> futures = new ArrayList<AntiEntropyService.RepairFuture>(); - for (Range<Token> range : getLocalPrimaryRanges()) - { - RepairFuture future = forceTableRepair(range, tableName, isSequential, isLocal, columnFamilies); - if (future != null) - futures.add(future); - } - if (futures.isEmpty()) - return; - for (AntiEntropyService.RepairFuture future : futures) - FBUtilities.waitOnFuture(future); - } - - public void forceTableRepairRange(String beginToken, String endToken, final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException - { - if (Table.SYSTEM_KS.equals(tableName)) - return; - - Token parsedBeginToken = getPartitioner().getTokenFactory().fromString(beginToken); - Token parsedEndToken = getPartitioner().getTokenFactory().fromString(endToken); - - logger.info("starting user-requested repair of range ({}, {}] for keyspace {} and column families {}", - new Object[] {parsedBeginToken, parsedEndToken, tableName, columnFamilies}); - AntiEntropyService.RepairFuture future = forceTableRepair(new Range<Token>(parsedBeginToken, parsedEndToken), tableName, isSequential, isLocal, columnFamilies); - if (future == null) - return; - try - { - future.get(); - } - catch (Exception e) - { - logger.error("Repair session " + future.session.getName() + " failed.", e); - } - } - public AntiEntropyService.RepairFuture forceTableRepair(final Range<Token> range, final String tableName, boolean isSequential, boolean isLocal, final String... columnFamilies) throws IOException { ArrayList<String> names = new ArrayList<String>();