You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jm...@apache.org on 2014/12/15 18:35:58 UTC

[1/3] cassandra git commit: Clean up IsWindows check, add hasProc check

Repository: cassandra
Updated Branches:
  refs/heads/trunk 9acf97a89 -> 574e2652e


Clean up IsWindows check, add hasProc check

Patch by Blake Eggleston; reviewed by jmckenzie for CASSANDRA-8452


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6d8862b0
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6d8862b0
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6d8862b0

Branch: refs/heads/trunk
Commit: 6d8862b00ed60a24387beb642609c03fcee095e9
Parents: f0767fd
Author: Blake Eggleston <bd...@gmail.com>
Authored: Mon Dec 15 11:10:17 2014 -0600
Committer: Joshua McKenzie <jm...@apache.org>
Committed: Mon Dec 15 11:10:17 2014 -0600

----------------------------------------------------------------------
 .../apache/cassandra/io/sstable/SSTableRewriter.java   |  2 +-
 .../io/sstable/metadata/MetadataSerializer.java        |  2 +-
 .../org/apache/cassandra/service/CassandraDaemon.java  |  2 +-
 .../org/apache/cassandra/service/StorageService.java   |  4 ++--
 .../cassandra/utils/BackgroundActivityMonitor.java     |  4 ++--
 src/java/org/apache/cassandra/utils/FBUtilities.java   | 13 +++++++++++--
 6 files changed, 18 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
index f9d2fe4..cd9435d 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
@@ -156,7 +156,7 @@ public class SSTableRewriter
 
     private void maybeReopenEarly(DecoratedKey key)
     {
-        if (FBUtilities.isUnix() && writer.getFilePointer() - currentlyOpenedEarlyAt > preemptiveOpenInterval)
+        if (!FBUtilities.isWindows() && writer.getFilePointer() - currentlyOpenedEarlyAt > preemptiveOpenInterval)
         {
             if (isOffline)
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
index 7414208..0dcd981 100644
--- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
@@ -154,7 +154,7 @@ public class MetadataSerializer implements IMetadataSerializer
             out.flush();
         }
         // we cant move a file on top of another file in windows:
-        if (!FBUtilities.isUnix())
+        if (FBUtilities.isWindows())
             FileUtils.delete(descriptor.filenameFor(Component.STATS));
         FileUtils.renameWithConfirm(tmpDescriptor.filenameFor(Component.STATS), descriptor.filenameFor(Component.STATS));
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/src/java/org/apache/cassandra/service/CassandraDaemon.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java
index 1c99348..c2b7b7d 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -430,7 +430,7 @@ public class CassandraDaemon
 
         // On windows, we need to stop the entire system as prunsrv doesn't have the jsvc hooks
         // We rely on the shutdown hook to drain the node
-        if (!FBUtilities.isUnix())
+        if (FBUtilities.isWindows())
             System.exit(0);
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/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 332fbe5..36fe377 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -2534,7 +2534,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         int cmd = nextRepairCommand.incrementAndGet();
         if (ranges.size() > 0)
         {
-            if (!FBUtilities.isUnix() && parallelismDegree != RepairParallelism.PARALLEL)
+            if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
             {
                 logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
                 parallelismDegree = RepairParallelism.PARALLEL;
@@ -2570,7 +2570,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
             return 0;
 
         int cmd = nextRepairCommand.incrementAndGet();
-        if (!FBUtilities.isUnix() && parallelismDegree != RepairParallelism.PARALLEL)
+        if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
         {
             logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
             parallelismDegree = RepairParallelism.PARALLEL;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/src/java/org/apache/cassandra/utils/BackgroundActivityMonitor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/BackgroundActivityMonitor.java b/src/java/org/apache/cassandra/utils/BackgroundActivityMonitor.java
index 43113fc..1799d10 100644
--- a/src/java/org/apache/cassandra/utils/BackgroundActivityMonitor.java
+++ b/src/java/org/apache/cassandra/utils/BackgroundActivityMonitor.java
@@ -71,7 +71,7 @@ public class BackgroundActivityMonitor
         }
         catch (IOException ex)
         {
-            if (FBUtilities.isUnix())
+            if (FBUtilities.hasProcFS())
                 logger.warn("Couldn't open /proc/stats");
             statsFile = null;
         }
@@ -155,7 +155,7 @@ public class BackgroundActivityMonitor
             catch (IOException e)
             {
                 // ignore;
-                if (FBUtilities.isUnix())
+                if (FBUtilities.hasProcFS())
                     logger.warn("Couldn't read /proc/stats");
             }
             if (report == -1d)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6d8862b0/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index 01b7923..4c81b2a 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -72,6 +72,10 @@ public class FBUtilities
 
     private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase();
 
+    private static final boolean IS_WINDOWS = OPERATING_SYSTEM.contains("windows");
+
+    private static final boolean HAS_PROCFS = !IS_WINDOWS && (new File(File.separator + "proc")).exists();
+
     private static volatile InetAddress localInetAddress;
     private static volatile InetAddress broadcastInetAddress;
 
@@ -676,9 +680,14 @@ public class FBUtilities
         return historyDir;
     }
 
-    public static boolean isUnix()
+    public static boolean isWindows()
+    {
+        return IS_WINDOWS;
+    }
+
+    public static boolean hasProcFS()
     {
-        return OPERATING_SYSTEM.contains("nix") || OPERATING_SYSTEM.contains("nux") || OPERATING_SYSTEM.contains("aix");
+        return HAS_PROCFS;
     }
 
     public static void updateWithShort(MessageDigest digest, int val)


[3/3] cassandra git commit: merge fixes for CASSANDRA-8452

Posted by jm...@apache.org.
merge fixes for CASSANDRA-8452


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/574e2652
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/574e2652
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/574e2652

Branch: refs/heads/trunk
Commit: 574e2652ef1c5bc8813ae48ebfe785424795e7b5
Parents: 3a0dc2c
Author: Joshua McKenzie <jm...@apache.org>
Authored: Mon Dec 15 11:33:18 2014 -0600
Committer: Joshua McKenzie <jm...@apache.org>
Committed: Mon Dec 15 11:33:18 2014 -0600

----------------------------------------------------------------------
 .../cassandra/config/DatabaseDescriptor.java      | 18 +++++++++---------
 .../apache/cassandra/service/StorageService.java  |  1 +
 .../org/apache/cassandra/utils/FBUtilities.java   |  2 +-
 .../org/apache/cassandra/utils/SigarLibrary.java  |  2 +-
 test/pig/org/apache/pig/test/MiniCluster.java     |  2 +-
 5 files changed, 13 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/574e2652/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index c34c6ea..958cf8c 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -177,7 +177,15 @@ public class DatabaseDescriptor
         if (conf.commitlog_total_space_in_mb == null)
             conf.commitlog_total_space_in_mb = hasLargeAddressSpace() ? 8192 : 32;
 
-        if (FBUtilities.isUnix())
+        // Always force standard mode access on Windows - CASSANDRA-6993. Windows won't allow deletion of hard-links to files that
+        // are memory-mapped which causes trouble with snapshots.
+        if (FBUtilities.isWindows())
+        {
+            conf.disk_access_mode = Config.DiskAccessMode.standard;
+            indexAccessMode = conf.disk_access_mode;
+            logger.info("Non-unix environment detected.  DiskAccessMode set to {}, indexAccessMode {}", conf.disk_access_mode, indexAccessMode);
+        }
+        else
         {
             /* evaluate the DiskAccessMode Config directive, which also affects indexAccessMode selection */
             if (conf.disk_access_mode == Config.DiskAccessMode.auto)
@@ -198,14 +206,6 @@ public class DatabaseDescriptor
                 logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode);
             }
         }
-        // Always force standard mode access on Windows - CASSANDRA-6993. Windows won't allow deletion of hard-links to files that
-        // are memory-mapped which causes trouble with snapshots.
-        else
-        {
-            conf.disk_access_mode = Config.DiskAccessMode.standard;
-            indexAccessMode = conf.disk_access_mode;
-            logger.info("Non-unix environment detected.  DiskAccessMode set to {}, indexAccessMode {}", conf.disk_access_mode, indexAccessMode);
-        }
 
         /* Authentication and authorization backend, implementing IAuthenticator and IAuthorizer */
         if (conf.authenticator != null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/574e2652/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 f646d87..999d6b6 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -2536,6 +2536,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
                                      boolean fullRepair,
                                      String... columnFamilies)
     {
+        if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
         {
             logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
             parallelismDegree = RepairParallelism.PARALLEL;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/574e2652/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index c41a6c0..8077df8 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -70,8 +70,8 @@ public class FBUtilities
     public static final BigInteger TWO = new BigInteger("2");
     private static final String DEFAULT_TRIGGER_DIR = "triggers";
 
+    private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase();
     private static final boolean IS_WINDOWS = OPERATING_SYSTEM.contains("windows");
-
     private static final boolean HAS_PROCFS = !IS_WINDOWS && (new File(File.separator + "proc")).exists();
 
     private static volatile InetAddress localInetAddress;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/574e2652/src/java/org/apache/cassandra/utils/SigarLibrary.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java
index bcfa58e..fb3d3ae 100644
--- a/src/java/org/apache/cassandra/utils/SigarLibrary.java
+++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java
@@ -110,7 +110,7 @@ public class SigarLibrary
     private boolean hasAcceptableAddressSpace()
     {
         // Check is invalid on Windows
-        if (!FBUtilities.isUnix())
+        if (FBUtilities.isWindows())
             return true;
 
         try

http://git-wip-us.apache.org/repos/asf/cassandra/blob/574e2652/test/pig/org/apache/pig/test/MiniCluster.java
----------------------------------------------------------------------
diff --git a/test/pig/org/apache/pig/test/MiniCluster.java b/test/pig/org/apache/pig/test/MiniCluster.java
index ad50f69..aa03861 100644
--- a/test/pig/org/apache/pig/test/MiniCluster.java
+++ b/test/pig/org/apache/pig/test/MiniCluster.java
@@ -50,7 +50,7 @@ public class MiniCluster extends MiniGenericCluster {
 
             // Builds and starts the mini dfs and mapreduce clusters
             Configuration config = new Configuration();
-            if (!FBUtilities.isUnix())
+            if (FBUtilities.isWindows())
                 config.set("fs.file.impl", WindowsLocalFileSystem.class.getName());
             m_dfs = new MiniDFSCluster(config, dataNodes, true, null);
             m_fileSys = m_dfs.getFileSystem();


[2/3] cassandra git commit: Merge branch 'cassandra-2.1' into trunk

Posted by jm...@apache.org.
Merge branch 'cassandra-2.1' into trunk

Conflicts:
	src/java/org/apache/cassandra/service/StorageService.java
	src/java/org/apache/cassandra/utils/FBUtilities.java


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3a0dc2c0
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3a0dc2c0
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3a0dc2c0

Branch: refs/heads/trunk
Commit: 3a0dc2c0f7bbbbbb7c4976b8b99903149f3202e9
Parents: 9acf97a 6d8862b
Author: Joshua McKenzie <jm...@apache.org>
Authored: Mon Dec 15 11:31:48 2014 -0600
Committer: Joshua McKenzie <jm...@apache.org>
Committed: Mon Dec 15 11:31:48 2014 -0600

----------------------------------------------------------------------
 .../apache/cassandra/io/sstable/SSTableRewriter.java |  2 +-
 .../io/sstable/metadata/MetadataSerializer.java      |  2 +-
 .../apache/cassandra/service/CassandraDaemon.java    |  2 +-
 .../org/apache/cassandra/service/StorageService.java |  3 +--
 .../cassandra/utils/BackgroundActivityMonitor.java   |  4 ++--
 src/java/org/apache/cassandra/utils/FBUtilities.java | 15 +++++++++++----
 6 files changed, 17 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3a0dc2c0/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3a0dc2c0/src/java/org/apache/cassandra/service/CassandraDaemon.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3a0dc2c0/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageService.java
index 4ec23a6,36fe377..f646d87
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@@ -2429,114 -2494,83 +2429,113 @@@ public class StorageService extends Not
          sendNotification(jmxNotification);
      }
  
 -    public int forceRepairAsync(String keyspace, boolean isSequential, Collection<String> dataCenters, Collection<String> hosts, boolean primaryRange, boolean fullRepair, String... columnFamilies) throws IOException
 -    {
 -        return forceRepairAsync(keyspace, isSequential ? RepairParallelism.SEQUENTIAL : RepairParallelism.PARALLEL, dataCenters, hosts, primaryRange, fullRepair, columnFamilies);
 -    }
 -
 -    public int forceRepairAsync(String keyspace, RepairParallelism parallelismDegree, Collection<String> dataCenters, Collection<String> hosts, boolean primaryRange, boolean fullRepair, String... columnFamilies)
 +    public int repairAsync(String keyspace, Map<String, String> repairSpec)
      {
 -        Collection<Range<Token>> ranges;
 -        if (primaryRange)
 +        RepairOption option = RepairOption.parse(repairSpec, getPartitioner());
 +        // if ranges are not specified
 +        if (option.getRanges().isEmpty())
          {
 -            // when repairing only primary range, neither dataCenters nor hosts can be set
 -            if (dataCenters == null && hosts == null)
 -                ranges = getPrimaryRanges(keyspace);
 -            // except dataCenters only contain local DC (i.e. -local)
 -            else if (dataCenters != null && dataCenters.size() == 1 && dataCenters.contains(DatabaseDescriptor.getLocalDataCenter()))
 -                ranges = getPrimaryRangesWithinDC(keyspace);
 +            if (option.isPrimaryRange())
 +            {
 +                // when repairing only primary range, neither dataCenters nor hosts can be set
 +                if (option.getDataCenters().isEmpty() && option.getHosts().isEmpty())
 +                    option.getRanges().addAll(getPrimaryRanges(keyspace));
 +                    // except dataCenters only contain local DC (i.e. -local)
 +                else if (option.getDataCenters().size() == 1 && option.getDataCenters().contains(DatabaseDescriptor.getLocalDataCenter()))
 +                    option.getRanges().addAll(getPrimaryRangesWithinDC(keyspace));
 +                else
 +                    throw new IllegalArgumentException("You need to run primary range repair on all nodes in the cluster.");
 +            }
              else
 -                throw new IllegalArgumentException("You need to run primary range repair on all nodes in the cluster.");
 -        }
 -        else
 -        {
 -             ranges = getLocalRanges(keyspace);
 +            {
 +                option.getRanges().addAll(getLocalRanges(keyspace));
 +            }
          }
 -
 -        return forceRepairAsync(keyspace, parallelismDegree, dataCenters, hosts, ranges, fullRepair, columnFamilies);
 +        return forceRepairAsync(keyspace, option);
      }
  
 -    public int forceRepairAsync(String keyspace, boolean isSequential, Collection<String> dataCenters, Collection<String> hosts, Collection<Range<Token>> ranges, boolean fullRepair, String... columnFamilies)
 +    @Deprecated
 +    public int forceRepairAsync(String keyspace,
 +                                boolean isSequential,
 +                                Collection<String> dataCenters,
 +                                Collection<String> hosts,
 +                                boolean primaryRange,
 +                                boolean fullRepair,
 +                                String... columnFamilies)
      {
 -        return forceRepairAsync(keyspace, isSequential ? RepairParallelism.SEQUENTIAL : RepairParallelism.PARALLEL, dataCenters, hosts, ranges, fullRepair, columnFamilies);
 +        return forceRepairAsync(keyspace, isSequential ? RepairParallelism.SEQUENTIAL : RepairParallelism.PARALLEL, dataCenters, hosts, primaryRange, fullRepair, columnFamilies);
      }
  
 -    public int forceRepairAsync(String keyspace, RepairParallelism parallelismDegree, Collection<String> dataCenters, Collection<String> hosts, Collection<Range<Token>> ranges, boolean fullRepair, String... columnFamilies)
 +    @Deprecated
 +    public int forceRepairAsync(String keyspace,
 +                                RepairParallelism parallelismDegree,
 +                                Collection<String> dataCenters,
 +                                Collection<String> hosts,
 +                                boolean primaryRange,
 +                                boolean fullRepair,
 +                                String... columnFamilies)
      {
-         if (!FBUtilities.isUnix() && parallelismDegree != RepairParallelism.PARALLEL)
 -        if (ranges.isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor() < 2)
 -            return 0;
++        if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
 +        {
 +            logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
 +            parallelismDegree = RepairParallelism.PARALLEL;
 +        }
  
 -        int cmd = nextRepairCommand.incrementAndGet();
 -        if (ranges.size() > 0)
 +        RepairOption options = new RepairOption(parallelismDegree, primaryRange, !fullRepair, false, 1, Collections.<Range<Token>>emptyList());
 +        if (dataCenters != null)
          {
 -            if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
 +            options.getDataCenters().addAll(dataCenters);
 +        }
 +        if (hosts != null)
 +        {
 +            options.getHosts().addAll(hosts);
 +        }
 +        if (columnFamilies != null)
 +        {
 +            for (String columnFamily : columnFamilies)
              {
 -                logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
 -                parallelismDegree = RepairParallelism.PARALLEL;
 +                options.getColumnFamilies().add(columnFamily);
              }
 -            new Thread(createRepairTask(cmd, keyspace, ranges, parallelismDegree, dataCenters, hosts, fullRepair, columnFamilies)).start();
          }
 -        return cmd;
 +        return forceRepairAsync(keyspace, options);
      }
  
 -    public int forceRepairAsync(String keyspace, boolean isSequential, boolean isLocal, boolean primaryRange, boolean fullRepair, String... columnFamilies)
 +    public int forceRepairAsync(String keyspace,
 +                                boolean isSequential,
 +                                boolean isLocal,
 +                                boolean primaryRange,
 +                                boolean fullRepair,
 +                                String... columnFamilies)
      {
 -        Collection<Range<Token>> ranges;
 -        if (primaryRange)
 -        {
 -            ranges = isLocal ? getPrimaryRangesWithinDC(keyspace) : getPrimaryRanges(keyspace);
 -        }
 -        else
 +        Set<String> dataCenters = null;
 +        if (isLocal)
          {
 -            ranges = getLocalRanges(keyspace);
 +            dataCenters = Sets.newHashSet(DatabaseDescriptor.getLocalDataCenter());
          }
 -
 -        return forceRepairAsync(keyspace, isSequential, isLocal, ranges, fullRepair, columnFamilies);
 +        return forceRepairAsync(keyspace, isSequential, dataCenters, null, primaryRange, fullRepair, columnFamilies);
      }
  
 -    public int forceRepairAsync(String keyspace, boolean isSequential, boolean isLocal, Collection<Range<Token>> ranges, boolean fullRepair, String... columnFamilies)
 +    public int forceRepairRangeAsync(String beginToken,
 +                                     String endToken,
 +                                     String keyspaceName,
 +                                     boolean isSequential,
 +                                     Collection<String> dataCenters,
 +                                     Collection<String> hosts,
 +                                     boolean fullRepair,
 +                                     String... columnFamilies)
      {
 -        return forceRepairAsync(keyspace, isSequential ? RepairParallelism.SEQUENTIAL : RepairParallelism.PARALLEL, isLocal, ranges, fullRepair, columnFamilies);
 +        return forceRepairRangeAsync(beginToken, endToken, keyspaceName, isSequential ? RepairParallelism.SEQUENTIAL : RepairParallelism.PARALLEL, dataCenters, hosts, fullRepair, columnFamilies);
      }
  
 -    public int forceRepairAsync(String keyspace, RepairParallelism parallelismDegree, boolean isLocal, Collection<Range<Token>> ranges, boolean fullRepair, String... columnFamilies)
 +    public int forceRepairRangeAsync(String beginToken,
 +                                     String endToken,
 +                                     String keyspaceName,
 +                                     RepairParallelism parallelismDegree,
 +                                     Collection<String> dataCenters,
 +                                     Collection<String> hosts,
 +                                     boolean fullRepair,
 +                                     String... columnFamilies)
      {
-         if (!FBUtilities.isUnix() && parallelismDegree != RepairParallelism.PARALLEL)
 -        if (ranges.isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor() < 2)
 -            return 0;
 -
 -        int cmd = nextRepairCommand.incrementAndGet();
 -        if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL)
          {
              logger.warn("Snapshot-based repair is not yet supported on Windows.  Reverting to parallel repair.");
              parallelismDegree = RepairParallelism.PARALLEL;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3a0dc2c0/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/utils/FBUtilities.java
index acd19ad,4c81b2a..c41a6c0
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@@ -70,6 -70,12 +70,10 @@@ public class FBUtilitie
      public static final BigInteger TWO = new BigInteger("2");
      private static final String DEFAULT_TRIGGER_DIR = "triggers";
  
 -    private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase();
 -
+     private static final boolean IS_WINDOWS = OPERATING_SYSTEM.contains("windows");
+ 
+     private static final boolean HAS_PROCFS = !IS_WINDOWS && (new File(File.separator + "proc")).exists();
+ 
      private static volatile InetAddress localInetAddress;
      private static volatile InetAddress broadcastInetAddress;