You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/02/14 20:42:00 UTC

git commit: Revert "Staggering repair"

Updated Branches:
  refs/heads/trunk d56d74052 -> e28e7e967


Revert "Staggering repair"

This reverts commit 1ae32c93eca24a5bdab7332a56418a12b4e6586b.


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

Branch: refs/heads/trunk
Commit: e28e7e9675ddb3bd949d86e25b5a9f3638226c36
Parents: d56d740
Author: Jonathan Ellis <jb...@apache.org>
Authored: Tue Feb 14 13:41:37 2012 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Tue Feb 14 13:41:37 2012 -0600

----------------------------------------------------------------------
 .../org/apache/cassandra/db/ColumnFamilyStore.java |    8 -
 src/java/org/apache/cassandra/db/Directories.java  |   15 -
 .../cassandra/db/compaction/CompactionManager.java |   37 +--
 .../cassandra/service/AntiEntropyService.java      |  223 ++------------
 .../apache/cassandra/service/StorageService.java   |   13 +-
 .../cassandra/service/StorageServiceMBean.java     |    4 +-
 src/java/org/apache/cassandra/tools/NodeCmd.java   |    7 +-
 src/java/org/apache/cassandra/tools/NodeProbe.java |    8 +-
 8 files changed, 59 insertions(+), 256 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 218fadf..e4e3204 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -1423,14 +1423,6 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         }
     }
 
-    public List<SSTableReader> getSnapshotSSTableReader(String tag) throws IOException
-    {
-        List<SSTableReader> readers = new ArrayList<SSTableReader>();
-        for (Map.Entry<Descriptor, Set<Component>> entries : directories.sstableLister().snapshots(tag).list().entrySet())
-            readers.add(SSTableReader.open(entries.getKey(), entries.getValue(), metadata, partitioner));
-        return readers;
-    }
-
     /**
      * Take a snap shot of this columnfamily store.
      *

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/db/Directories.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java
index 7c51830..2afefd2 100644
--- a/src/java/org/apache/cassandra/db/Directories.java
+++ b/src/java/org/apache/cassandra/db/Directories.java
@@ -185,7 +185,6 @@ public class Directories
         private int nbFiles;
         private final Map<Descriptor, Set<Component>> components = new HashMap<Descriptor, Set<Component>>();
         private boolean filtered;
-        private String snapshotName;
 
         public SSTableLister skipCompacted(boolean b)
         {
@@ -220,14 +219,6 @@ public class Directories
             return this;
         }
 
-        public SSTableLister snapshots(String sn)
-        {
-            if (filtered)
-                throw new IllegalStateException("list() has already been called");
-            snapshotName = sn;
-            return this;
-        }
-
         public Map<Descriptor, Set<Component>> list()
         {
             filter();
@@ -255,12 +246,6 @@ public class Directories
 
             for (File location : sstableDirectories)
             {
-                if (snapshotName != null)
-                {
-                    new File(location, join(SNAPSHOT_SUBDIR, snapshotName)).listFiles(getFilter());
-                    continue;
-                }
-
                 if (!onlyBackups)
                     location.listFiles(getFilter());
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index ed699f2..f30510b 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -807,33 +807,23 @@ public class CompactionManager implements CompactionManagerMBean
         if (!cfs.isValid())
             return;
 
-        Collection<SSTableReader> sstables;
-        if (cfs.table.snapshotExists(validator.request.sessionid))
+        // flush first so everyone is validating data that is as similar as possible
+        try
         {
-            // If there is a snapshot created for the session then read from there.
-            sstables = cfs.getSnapshotSSTableReader(validator.request.sessionid);
+            StorageService.instance.forceTableFlush(cfs.table.name, cfs.getColumnFamilyName());
         }
-        else
+        catch (ExecutionException e)
         {
-            // flush first so everyone is validating data that is as similar as possible
-            try
-            {
-                StorageService.instance.forceTableFlush(cfs.table.name, cfs.getColumnFamilyName());
-            }
-            catch (ExecutionException e)
-            {
-                throw new IOException(e);
-            }
-            catch (InterruptedException e)
-            {
-                throw new AssertionError(e);
-            }
-
-            // we don't mark validating sstables as compacting in DataTracker, so we have to mark them referenced
-            // instead so they won't be cleaned up if they do get compacted during the validation
-            sstables = cfs.markCurrentSSTablesReferenced();
+            throw new IOException(e);
+        }
+        catch (InterruptedException e)
+        {
+            throw new AssertionError(e);
         }
 
+        // we don't mark validating sstables as compacting in DataTracker, so we have to mark them referenced
+        // instead so they won't be cleaned up if they do get compacted during the validation
+        Collection<SSTableReader> sstables = cfs.markCurrentSSTablesReferenced();
         CompactionIterable ci = new ValidationCompactionIterable(cfs, sstables, validator.request.range);
         CloseableIterator<AbstractCompactedRow> iter = ci.iterator();
         validationExecutor.beginCompaction(ci);
@@ -856,9 +846,6 @@ public class CompactionManager implements CompactionManagerMBean
         {
             SSTableReader.releaseReferences(sstables);
             iter.close();
-            if (cfs.table.snapshotExists(validator.request.sessionid))
-                cfs.table.clearSnapshot(validator.request.sessionid);
-
             validationExecutor.finishCompaction(ci);
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/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 10ea80c..812c23a 100644
--- a/src/java/org/apache/cassandra/service/AntiEntropyService.java
+++ b/src/java/org/apache/cassandra/service/AntiEntropyService.java
@@ -38,7 +38,6 @@ import org.apache.cassandra.db.compaction.AbstractCompactedRow;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.Table;
-import org.apache.cassandra.db.SnapshotCommand;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.RandomPartitioner;
 import org.apache.cassandra.dht.Range;
@@ -48,7 +47,6 @@ import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.FastByteArrayInputStream;
 import org.apache.cassandra.io.util.FastByteArrayOutputStream;
 import org.apache.cassandra.net.CompactEndpointSerializationHelper;
-import org.apache.cassandra.net.IAsyncCallback;
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
@@ -121,9 +119,9 @@ public class AntiEntropyService
     /**
      * Requests repairs for the given table and column families, and blocks until all repairs have been completed.
      */
-    public RepairFuture submitRepairSession(Range<Token> range, String tablename, boolean isSequential, String... cfnames)
+    public RepairFuture submitRepairSession(Range<Token> range, String tablename, String... cfnames)
     {
-        RepairFuture futureTask = new RepairSession(range, tablename, isSequential, cfnames).getFuture();
+        RepairFuture futureTask = new RepairSession(range, tablename, cfnames).getFuture();
         executor.execute(futureTask);
         return futureTask;
     }
@@ -211,6 +209,16 @@ public class AntiEntropyService
     }
 
     /**
+     * Requests a tree from the given node, and returns the request that was sent.
+     */
+    TreeRequest request(String sessionid, InetAddress remote, Range<Token> range, String ksname, String cfname)
+    {
+        TreeRequest request = new TreeRequest(sessionid, remote, range, new CFPair(ksname, cfname));
+        MessagingService.instance().sendOneWay(TreeRequestVerbHandler.makeVerb(request, Gossiper.instance.getVersion(remote)), remote);
+        return request;
+    }
+
+    /**
      * Responds to the node that requested the given valid tree.
      * @param validator A locally generated validator
      * @param local localhost (parameterized for testing)
@@ -590,7 +598,6 @@ public class AntiEntropyService
     static class RepairSession extends WrappedRunnable implements IEndpointStateChangeSubscriber, IFailureDetectionEventListener
     {
         private final String sessionName;
-        private final boolean isSequential;
         private final String tablename;
         private final String[] cfnames;
         private final Range<Token> range;
@@ -608,19 +615,18 @@ public class AntiEntropyService
 
         public RepairSession(TreeRequest req, String tablename, String... cfnames)
         {
-            this(req.sessionid, req.range, tablename, false, cfnames);
+            this(req.sessionid, req.range, tablename, cfnames);
             AntiEntropyService.instance.sessions.put(getName(), this);
         }
 
-        public RepairSession(Range<Token> range, String tablename, boolean isSequential, String... cfnames)
+        public RepairSession(Range<Token> range, String tablename, String... cfnames)
         {
-            this(UUIDGen.makeType1UUIDFromHost(FBUtilities.getBroadcastAddress()).toString(), range, tablename, isSequential, cfnames);
+            this(UUIDGen.makeType1UUIDFromHost(FBUtilities.getBroadcastAddress()).toString(), range, tablename, cfnames);
         }
 
-        private RepairSession(String id, Range<Token> range, String tablename, boolean isSequential, String[] cfnames)
+        private RepairSession(String id, Range<Token> range, String tablename, String[] cfnames)
         {
             this.sessionName = id;
-            this.isSequential = isSequential;
             this.tablename = tablename;
             this.cfnames = cfnames;
             assert cfnames.length > 0 : "Repairing no column families seems pointless, doesn't it";
@@ -668,12 +674,6 @@ public class AntiEntropyService
                     logger.info(String.format("[repair #%s] Cannot proceed on repair because a neighbor (%s) is dead: session failed", getName(), endpoint));
                     return;
                 }
-
-                if (Gossiper.instance.getVersion(endpoint) < MessagingService.VERSION_11 && isSequential)
-                {
-                    logger.info(String.format("[repair #%s] Cannot repair using snapshots as node %s is pre-1.1", getName(), endpoint));
-                    return;
-                }
             }
 
             AntiEntropyService.instance.sessions.put(getName(), this);
@@ -729,8 +729,6 @@ public class AntiEntropyService
         public void terminate()
         {
             terminated = true;
-            for (RepairJob job : jobs)
-                job.terminate();
             jobs.clear();
             activeJobs.clear();
         }
@@ -812,32 +810,17 @@ public class AntiEntropyService
         {
             private final String cfname;
             // first we send tree requests.  this tracks the endpoints remaining to hear from
-            private final RequestCoordinator<TreeRequest> treeRequests;
+            private final Set<InetAddress> remainingEndpoints = new HashSet<InetAddress>();
             // tree responses are then tracked here
             private final List<TreeResponse> trees = new ArrayList<TreeResponse>(endpoints.size() + 1);
             // once all responses are received, each tree is compared with each other, and differencer tasks
             // are submitted.  the job is done when all differencers are complete.
-            private final RequestCoordinator<Differencer> differencers;
+            private final Set<Differencer> remainingDifferencers = new HashSet<Differencer>();
             private final Condition requestsSent = new SimpleCondition();
-            private CountDownLatch snapshotLatch = null;
 
             public RepairJob(String cfname)
             {
                 this.cfname = cfname;
-                this.treeRequests = new RequestCoordinator<TreeRequest>(isSequential)
-                {
-                    public void send(TreeRequest r)
-                    {
-                        MessagingService.instance().sendOneWay(TreeRequestVerbHandler.makeVerb(r, Gossiper.instance.getVersion(r.endpoint)), r.endpoint);
-                    }
-                };
-                this.differencers = new RequestCoordinator<Differencer>(isSequential)
-                {
-                    public void send(Differencer d)
-                    {
-                        StageManager.getStage(Stage.ANTI_ENTROPY).execute(d);
-                    }
-                };
             }
 
             /**
@@ -845,51 +828,17 @@ public class AntiEntropyService
              */
             public void sendTreeRequests()
             {
-                // send requests to all nodes
-                List<InetAddress> allEndpoints = new ArrayList<InetAddress>(endpoints);
-                allEndpoints.add(FBUtilities.getBroadcastAddress());
+                remainingEndpoints.addAll(endpoints);
+                remainingEndpoints.add(FBUtilities.getBroadcastAddress());
 
-                if (isSequential)
-                    makeSnapshots(endpoints);
-
-                for (InetAddress endpoint : allEndpoints)
-                    treeRequests.add(new TreeRequest(getName(), endpoint, range, new CFPair(tablename, cfname)));
+                // send requests to all nodes
+                for (InetAddress endpoint : remainingEndpoints)
+                    AntiEntropyService.instance.request(getName(), endpoint, range, tablename, cfname);
 
-                logger.info(String.format("[repair #%s] requesting merkle trees for %s (to %s)", getName(), cfname, allEndpoints));
-                treeRequests.start();
+                logger.info(String.format("[repair #%s] requests for merkle tree sent for %s (to %s)", getName(), cfname, remainingEndpoints));
                 requestsSent.signalAll();
             }
 
-            public void makeSnapshots(Collection<InetAddress> endpoints)
-            {
-                try
-                {
-                    snapshotLatch = new CountDownLatch(endpoints.size());
-                    IAsyncCallback callback = new IAsyncCallback()
-                    {
-                        @Override
-                            public boolean isLatencyForSnitch()
-                            {
-                                return false;
-                            }
-
-                        @Override
-                            public void response(Message msg)
-                            {
-                                RepairJob.this.snapshotLatch.countDown();
-                            }
-                    };
-                    for (InetAddress endpoint : endpoints)
-                        MessagingService.instance().sendRR(new SnapshotCommand(tablename, cfname, sessionName, false), endpoint, callback);
-                    snapshotLatch.await();
-                    snapshotLatch = null;
-                }
-                catch (InterruptedException e)
-                {
-                    throw new RuntimeException(e);
-                }
-            }
-
             /**
              * Add a new received tree and return the number of remaining tree to
              * be received for the job to be complete.
@@ -910,7 +859,8 @@ public class AntiEntropyService
 
                 assert request.cf.right.equals(cfname);
                 trees.add(new TreeResponse(request.endpoint, tree));
-                return treeRequests.completed(request);
+                remainingEndpoints.remove(request.endpoint);
+                return remainingEndpoints.size();
             }
 
             /**
@@ -919,6 +869,8 @@ public class AntiEntropyService
              */
             public void submitDifferencers()
             {
+                assert remainingEndpoints.isEmpty();
+
                 // We need to difference all trees one against another
                 for (int i = 0; i < trees.size() - 1; ++i)
                 {
@@ -928,10 +880,10 @@ public class AntiEntropyService
                         TreeResponse r2 = trees.get(j);
                         Differencer differencer = new Differencer(cfname, r1, r2);
                         logger.debug("Queueing comparison {}", differencer);
-                        differencers.add(differencer);
+                        remainingDifferencers.add(differencer);
+                        StageManager.getStage(Stage.ANTI_ENTROPY).execute(differencer);
                     }
                 }
-                differencers.start();
                 trees.clear(); // allows gc to do its thing
             }
 
@@ -940,16 +892,8 @@ public class AntiEntropyService
              */
             synchronized boolean completedSynchronization(Differencer differencer)
             {
-                return differencers.completed(differencer) == 0;
-            }
-
-            public void terminate()
-            {
-                if (snapshotLatch != null)
-                {
-                    while (snapshotLatch.getCount() > 0)
-                        snapshotLatch.countDown();
-                }
+                remainingDifferencers.remove(differencer);
+                return remainingDifferencers.isEmpty();
             }
         }
 
@@ -1048,107 +992,4 @@ public class AntiEntropyService
             this.session = session;
         }
     }
-
-    public static abstract class RequestCoordinator<R>
-    {
-        private final Order<R> orderer;
-
-        protected RequestCoordinator(boolean isSequential)
-        {
-            this.orderer = isSequential ? new SequentialOrder<R>(this) : new ParallelOrder<R>(this);
-        }
-
-        public abstract void send(R request);
-
-        public void add(R request)
-        {
-            orderer.add(request);
-        }
-
-        public void start()
-        {
-            orderer.start();
-        }
-
-        // Returns how many request remains
-        public int completed(R request)
-        {
-            return orderer.completed(request);
-        }
-
-        private static abstract class Order<R>
-        {
-            protected final RequestCoordinator<R> coordinator;
-
-            Order(RequestCoordinator<R> coordinator)
-            {
-                this.coordinator = coordinator;
-            }
-
-            public abstract void add(R request);
-            public abstract void start();
-            public abstract int completed(R request);
-        }
-
-        private static class SequentialOrder<R> extends Order<R>
-        {
-            private final Queue<R> requests = new LinkedList<R>();
-
-            SequentialOrder(RequestCoordinator<R> coordinator)
-            {
-                super(coordinator);
-            }
-
-            public void add(R request)
-            {
-                requests.add(request);
-            }
-
-            public void start()
-            {
-                if (requests.isEmpty())
-                    return;
-
-                coordinator.send(requests.peek());
-            }
-
-            public int completed(R request)
-            {
-                assert request.equals(requests.peek());
-                requests.poll();
-                int remaining = requests.size();
-                if (remaining != 0)
-                    coordinator.send(requests.peek());
-                return remaining;
-            }
-        }
-
-        private static class ParallelOrder<R> extends Order<R>
-        {
-            private final Set<R> requests = new HashSet<R>();
-
-            ParallelOrder(RequestCoordinator<R> coordinator)
-            {
-                super(coordinator);
-            }
-
-            public void add(R request)
-            {
-                requests.add(request);
-            }
-
-            public void start()
-            {
-                for (R request : requests)
-                    coordinator.send(request);
-            }
-
-            public int completed(R request)
-            {
-                requests.remove(request);
-                return requests.size();
-            }
-        }
-
-    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/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 ed33b44..d06b4a2 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1826,11 +1826,12 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
      * @param columnFamilies
      * @throws IOException
      */
-    public void forceTableRepair(final String tableName, boolean isSequential, final String... columnFamilies) throws IOException
+    public void forceTableRepair(final String tableName, final String... columnFamilies) throws IOException
     {
         if (Table.SYSTEM_TABLE.equals(tableName))
             return;
 
+
         Collection<Range<Token>> ranges = getLocalRanges(tableName);
         int cmd = nextRepairCommand.incrementAndGet();
         logger_.info("Starting repair command #{}, repairing {} ranges.", cmd, ranges.size());
@@ -1838,7 +1839,7 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
         List<AntiEntropyService.RepairFuture> futures = new ArrayList<AntiEntropyService.RepairFuture>(ranges.size());
         for (Range<Token> range : ranges)
         {
-            AntiEntropyService.RepairFuture future = forceTableRepair(range, tableName, isSequential, columnFamilies);
+            AntiEntropyService.RepairFuture future = forceTableRepair(range, tableName, columnFamilies);
             futures.add(future);
             // wait for a session to be done with its differencing before starting the next one
             try
@@ -1873,12 +1874,12 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
             logger_.info("Repair command #{} completed successfully", cmd);
     }
 
-    public void forceTableRepairPrimaryRange(final String tableName, boolean isSequential, final String... columnFamilies) throws IOException
+    public void forceTableRepairPrimaryRange(final String tableName, final String... columnFamilies) throws IOException
     {
         if (Table.SYSTEM_TABLE.equals(tableName))
             return;
 
-        AntiEntropyService.RepairFuture future = forceTableRepair(getLocalPrimaryRange(), tableName, isSequential, columnFamilies);
+        AntiEntropyService.RepairFuture future = forceTableRepair(getLocalPrimaryRange(), tableName, columnFamilies);
         try
         {
             future.get();
@@ -1890,7 +1891,7 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
         }
     }
 
-    public AntiEntropyService.RepairFuture forceTableRepair(final Range<Token> range, final String tableName, boolean isSequential, final String... columnFamilies) throws IOException
+    public AntiEntropyService.RepairFuture forceTableRepair(final Range<Token> range, final String tableName, final String... columnFamilies) throws IOException
     {
         ArrayList<String> names = new ArrayList<String>();
         for (ColumnFamilyStore cfStore : getValidColumnFamilies(tableName, columnFamilies))
@@ -1898,7 +1899,7 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
             names.add(cfStore.getColumnFamilyName());
         }
 
-        return AntiEntropyService.instance.submitRepairSession(range, tableName, isSequential, names.toArray(new String[names.size()]));
+        return AntiEntropyService.instance.submitRepairSession(range, tableName, names.toArray(new String[names.size()]));
     }
 
     public void forceTerminateAllRepairSessions() {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/service/StorageServiceMBean.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
index c5aa9fd..6af63b7 100644
--- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java
+++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
@@ -231,12 +231,12 @@ public interface StorageServiceMBean
      * @param columnFamilies
      * @throws IOException
      */
-    public void forceTableRepair(String tableName, boolean isSequential, String... columnFamilies) throws IOException;
+    public void forceTableRepair(String tableName, String... columnFamilies) throws IOException;
 
     /**
      * Triggers proactive repair but only for the node primary range.
      */
-    public void forceTableRepairPrimaryRange(String tableName, boolean isSequential, String... columnFamilies) throws IOException;
+    public void forceTableRepairPrimaryRange(String tableName, String... columnFamilies) throws IOException;
 
     public void forceTerminateAllRepairSessions();
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/tools/NodeCmd.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java
index e5ed0b7..d1648a1 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -53,7 +53,6 @@ public class NodeCmd
     private static final Pair<String, String> PASSWORD_OPT = new Pair<String, String>("pw", "password");
     private static final Pair<String, String> TAG_OPT = new Pair<String, String>("t", "tag");
     private static final Pair<String, String> PRIMARY_RANGE_OPT = new Pair<String, String>("pr", "partitioner-range");
-    private static final Pair<String, String> SNAPSHOT_REPAIR_OPT = new Pair<String, String>("snapshot", "with-snapshot");
 
     private static final String DEFAULT_HOST = "127.0.0.1";
     private static final int DEFAULT_PORT = 7199;
@@ -72,7 +71,6 @@ public class NodeCmd
         options.addOption(PASSWORD_OPT, true, "remote jmx agent password");
         options.addOption(TAG_OPT,      true, "optional name to give a snapshot");
         options.addOption(PRIMARY_RANGE_OPT, false, "only repair the first range returned by the partitioner for the node");
-        options.addOption(SNAPSHOT_REPAIR_OPT, false, "repair one node at a time using snapshots");
     }
     
     public NodeCmd(NodeProbe probe)
@@ -923,11 +921,10 @@ public class NodeCmd
             switch (nc)
             {
                 case REPAIR  :
-                    boolean snapshot = cmd.hasOption(SNAPSHOT_REPAIR_OPT.left);
                     if (cmd.hasOption(PRIMARY_RANGE_OPT.left))
-                        probe.forceTableRepairPrimaryRange(keyspace, snapshot, columnFamilies);
+                        probe.forceTableRepairPrimaryRange(keyspace, columnFamilies);
                     else
-                        probe.forceTableRepair(keyspace, snapshot, columnFamilies);
+                        probe.forceTableRepair(keyspace, columnFamilies);
                     break;
                 case FLUSH   :
                     try { probe.forceTableFlush(keyspace, columnFamilies); }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e28e7e96/src/java/org/apache/cassandra/tools/NodeProbe.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index 8739745..46d4c63 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -202,14 +202,14 @@ public class NodeProbe
         ssProxy.forceTableFlush(tableName, columnFamilies);
     }
 
-    public void forceTableRepair(String tableName, boolean isSequential, String... columnFamilies) throws IOException
+    public void forceTableRepair(String tableName, String... columnFamilies) throws IOException
     {
-        ssProxy.forceTableRepair(tableName, isSequential, columnFamilies);
+        ssProxy.forceTableRepair(tableName, columnFamilies);
     }
 
-    public void forceTableRepairPrimaryRange(String tableName, boolean isSequential, String... columnFamilies) throws IOException
+    public void forceTableRepairPrimaryRange(String tableName, String... columnFamilies) throws IOException
     {
-        ssProxy.forceTableRepairPrimaryRange(tableName, isSequential, columnFamilies);
+        ssProxy.forceTableRepairPrimaryRange(tableName, columnFamilies);
     }
 
     public void invalidateKeyCache() throws IOException