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 2011/07/08 20:13:46 UTC

svn commit: r1144411 - in /cassandra/trunk: ./ contrib/ interface/thrift/gen-java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/cli/ src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/dht/...

Author: jbellis
Date: Fri Jul  8 18:13:45 2011
New Revision: 1144411

URL: http://svn.apache.org/viewvc?rev=1144411&view=rev
Log:
merge from 0.8

Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/contrib/   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java   (props changed)
    cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
    cassandra/trunk/src/java/org/apache/cassandra/cli/CliMain.java
    cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/Token.java
    cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
    cassandra/trunk/src/java/org/apache/cassandra/net/MessageDeliveryTask.java
    cassandra/trunk/src/java/org/apache/cassandra/net/MessagingService.java
    cassandra/trunk/src/java/org/apache/cassandra/net/MessagingServiceMBean.java
    cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
    cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java
    cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java
    cassandra/trunk/src/java/org/apache/cassandra/service/ReadCallback.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
    cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7:1026516-1144407
 /cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0:1125021-1130369
 /cassandra/branches/cassandra-0.8.1:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Fri Jul  8 18:13:45 2011
@@ -26,7 +26,23 @@
    (CASSANDRA-2823)
  * Fix race in SystemTable.getCurrentLocalNodeId (CASSANDRA-2824)
  * Correctly set default for replicate_on_write (CASSANDRA-2835)
+ * improve nodetool compactionstats formatting (CASSANDRA-2844)
+ * fix index-building status display (CASSANDRA-2853)
+ * fix CLI perpetuating obsolete KsDef.replication_factor (CASSANDRA-2846)
+ * improve cli treatment of multiline comments (CASSANDRA-2852)
  * handle row tombstones correctly in EchoedRow (CASSANDRA-2786)
+<<<<<<< .working
+ * add MessagingService.get[Recently]DroppedMessages and
+   StorageService.getExceptionCount (CASSANDRA-2804)
+ * fix possibility of spurious UnavailableException for LOCAL_QUORUM
+   reads with dynamic snitch + read repair disabled (CASSANDRA-2870)
+ * add ant-optional as dependence for the debian package (CASSANDRA-2164)
+ * add option to specify limit for get_slice in the CLI (CASSANDRA-2646)
+ * decrease HH page size (CASSANDRA-2832)
+=======
+ * add MessagingService.get[Recently]DroppedMessages and
+   StorageService.getExceptionCount (CASSANDRA-2804)
+>>>>>>> .merge-right.r1143437
 
 
 0.8.1
@@ -109,6 +125,7 @@
  * Always use even distribution for merkle tree with RandomPartitionner
    (CASSANDRA-2841)
  * fix describeOwnership for OPP (CASSANDRA-2800)
+ * ensure that string tokens do not contain commas (CASSANDRA-2762)
 
 
 0.8.0-final

Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/contrib:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jul  8 18:13:45 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1140567,1140928,1141129,1141213,1141217,1143437,1143444
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1144407
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1141220,1143352,1143438,1143445
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1144410
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689

Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java Fri Jul  8 18:13:45 2011
@@ -288,15 +288,21 @@ public class CliClient
         }
         catch (InvalidRequestException e)
         {
-            throw new RuntimeException(e.getWhy());
+        	RuntimeException rtEx = new RuntimeException(e.getWhy());
+            rtEx.initCause(e);
+            throw rtEx;
         }
         catch (SchemaDisagreementException e)
         {
-            throw new RuntimeException("schema does not match across nodes, (try again later).");
+        	RuntimeException rtEx = new RuntimeException("schema does not match across nodes, (try again later).");
+            rtEx.initCause(e);
+            throw new RuntimeException();
         }
         catch (Exception e)
         {
-            throw new RuntimeException(e.getMessage());
+            RuntimeException rtEx = new RuntimeException(e.getMessage());
+            rtEx.initCause(e);
+            throw rtEx;
         }
     }
 
@@ -1073,7 +1079,10 @@ public class CliClient
     private KsDef updateKsDefAttributes(Tree statement, KsDef ksDefToUpdate)
     {
         KsDef ksDef = new KsDef(ksDefToUpdate);
-        
+        // server helpfully sets deprecated replication factor when it sends a KsDef back, for older clients.
+        // we need to unset that on the new KsDef we create to avoid being treated as a legacy client in return.
+        ksDef.unsetReplication_factor();
+
         // removing all column definitions - thrift system_update_keyspace method requires that 
         ksDef.setCf_defs(new LinkedList<CfDef>());
         

Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/CliMain.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/CliMain.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cli/CliMain.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cli/CliMain.java Fri Jul  8 18:13:45 2011
@@ -359,6 +359,8 @@ public class CliMain
         String line = "";
         String currentStatement = "";
 
+        boolean commentedBlock = false;
+
         while ((line = reader.readLine()) != null)
         {
             line = line.trim();
@@ -367,6 +369,18 @@ public class CliMain
             if (line.isEmpty() || line.startsWith("--"))
                 continue;
 
+            if (line.startsWith("/*"))
+                commentedBlock = true;
+
+            if (line.startsWith("*/") || line.endsWith("*/"))
+            {
+                commentedBlock = false;
+                continue;
+            }
+
+            if (commentedBlock) // skip commented lines
+                continue;
+
             currentStatement += line;
 
             if (line.endsWith(";"))

Modified: cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Fri Jul  8 18:13:45 2011
@@ -41,6 +41,8 @@ import org.apache.cassandra.db.marshal.A
 import org.apache.cassandra.db.marshal.TypeParser;
 import org.apache.cassandra.db.migration.Migration;
 import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.*;
@@ -388,6 +390,9 @@ public class DatabaseDescriptor
                     throw new ConfigurationException("saved_caches_directory missing");
             }
 
+            if (conf.initial_token != null)
+                partitioner.getTokenFactory().validate(conf.initial_token);
+
             // Hardcoded system tables
             KSMetaData systemMeta = new KSMetaData(Table.SYSTEM_TABLE,
                                                    LocalStrategy.class,

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Fri Jul  8 18:13:45 2011
@@ -621,8 +621,8 @@ public class Table
             return new CompactionInfo(cfs.table.name,
                                       cfs.columnFamily,
                                       CompactionType.INDEX_BUILD,
-                                      iter.getTotalBytes(),
-                                      iter.getBytesRead());
+                                      iter.getBytesRead(),
+                                      iter.getTotalBytes());
         }
 
         public void build()

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java Fri Jul  8 18:13:45 2011
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.commons.lang.ArrayUtils;
 
@@ -151,6 +152,18 @@ public abstract class AbstractByteOrdere
             return FBUtilities.bytesToHex(bytesToken.token);
         }
 
+        public void validate(String token) throws ConfigurationException
+        {
+            try
+            {
+                FBUtilities.hexToBytes(token);
+            }
+            catch (NumberFormatException e)
+            {
+                throw new ConfigurationException("Token " + token + " contains non-hex digits");
+            }
+        }
+
         public Token<byte[]> fromString(String string)
         {
             return new BytesToken(FBUtilities.hexToBytes(string));

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java Fri Jul  8 18:13:45 2011
@@ -24,8 +24,10 @@ import java.nio.charset.CharacterCodingE
 import java.util.*;
 
 import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
@@ -136,6 +138,12 @@ public class OrderPreservingPartitioner 
             return stringToken.token;
         }
 
+        public void validate(String token) throws ConfigurationException
+        {
+            if (token.contains(VersionedValue.DELIMITER_STR))
+                throw new ConfigurationException("Tokens may not contain the character " + VersionedValue.DELIMITER_STR);
+        }
+
         public Token<String> fromString(String string)
         {
             return new StringToken(string);

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java Fri Jul  8 18:13:45 2011
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.util.*;
 
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
@@ -113,6 +114,18 @@ public class RandomPartitioner implement
             return bigIntegerToken.token.toString();
         }
 
+        public void validate(String token) throws ConfigurationException
+        {
+            try
+            {
+                new BigInteger(token);
+            }
+            catch (NumberFormatException e)
+            {
+                throw new ConfigurationException(e.getMessage());
+            }
+        }
+
         public Token<BigInteger> fromString(String string)
         {
             return new BigIntegerToken(new BigInteger(string));

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/Token.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/Token.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/Token.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/Token.java Fri Jul  8 18:13:45 2011
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.io.ICompactSerializer2;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -74,6 +75,8 @@ public abstract class Token<T> implement
         public abstract Token<T> fromByteArray(ByteBuffer bytes);
         public abstract String toString(Token<T> token); // serialize as string, not necessarily human-readable
         public abstract Token<T> fromString(String string); // deserialize
+
+        public abstract void validate(String token) throws ConfigurationException;
     }
 
     public static class TokenSerializer implements ICompactSerializer2<Token>

Modified: cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java Fri Jul  8 18:13:45 2011
@@ -29,6 +29,7 @@ import java.util.concurrent.*;
 
 import org.apache.cassandra.db.SystemTable;
 import org.apache.cassandra.net.MessageProducer;
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.utils.FBUtilities;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 import org.slf4j.Logger;

Modified: cassandra/trunk/src/java/org/apache/cassandra/net/MessageDeliveryTask.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/MessageDeliveryTask.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/net/MessageDeliveryTask.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/net/MessageDeliveryTask.java Fri Jul  8 18:13:45 2011
@@ -42,33 +42,20 @@ public class MessageDeliveryTask impleme
     public void run()
     { 
         StorageService.Verb verb = message.getVerb();
-        switch (verb)
+        if (MessagingService.DROPPABLE_VERBS.contains(verb)
+            && System.currentTimeMillis() > constructionTime + DatabaseDescriptor.getRpcTimeout())
         {
-            case BINARY:
-            case MUTATION:
-            case READ:
-            case RANGE_SLICE:
-            case READ_REPAIR:
-            case REQUEST_RESPONSE:
-                if (System.currentTimeMillis() > constructionTime + DatabaseDescriptor.getRpcTimeout())
-                {
-                    MessagingService.instance().incrementDroppedMessages(verb);
-                    return;
-                }
-                break;
-            
-            // don't bother.
-            case UNUSED_1:
-            case UNUSED_2:
-            case UNUSED_3:
-                return;
-            
-            default:
-                break;
+            MessagingService.instance().incrementDroppedMessages(verb);
+            return;
         }
 
         IVerbHandler verbHandler = MessagingService.instance().getVerbHandler(verb);
-        assert verbHandler != null : "unknown verb " + verb;
+        if (verbHandler == null)
+        {
+            logger_.debug("Unknown verb {}", verb);
+            return;
+        }
+
         verbHandler.doVerb(message, id);
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/net/MessagingService.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/MessagingService.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/net/MessagingService.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/net/MessagingService.java Fri Jul  8 18:13:45 2011
@@ -57,6 +57,8 @@ import org.cliffc.high_scale_lib.NonBloc
 
 public final class MessagingService implements MessagingServiceMBean
 {
+    public static final String MBEAN_NAME = "org.apache.cassandra.net:type=MessagingService";
+
     public static final int VERSION_07 = 1;
     public static final int VERSION_080 = 2;
     public static final int version_ = 3; // 8 bits, so don't waste versions
@@ -83,13 +85,33 @@ public final class MessagingService impl
 
     private SocketThread socketThread;
     private final SimpleCondition listenGate;
+
+    /**
+     * Verbs it's okay to drop if the request has been queued longer than RPC_TIMEOUT.  These
+     * all correspond to client requests or something triggered by them; we don't want to
+     * drop internal messages like bootstrap or repair notifications.
+     */
+    public static final EnumSet<StorageService.Verb> DROPPABLE_VERBS = EnumSet.of(StorageService.Verb.BINARY,
+                                                                                  StorageService.Verb.MUTATION,
+                                                                                  StorageService.Verb.READ_REPAIR,
+                                                                                  StorageService.Verb.READ,
+                                                                                  StorageService.Verb.RANGE_SLICE,
+                                                                                  StorageService.Verb.REQUEST_RESPONSE);
+
+    // total dropped message counts for server lifetime
     private final Map<StorageService.Verb, AtomicInteger> droppedMessages = new EnumMap<StorageService.Verb, AtomicInteger>(StorageService.Verb.class);
+    // dropped count when last requested for the Recent api.  high concurrency isn't necessary here.
+    private final Map<StorageService.Verb, Integer> lastDropped = Collections.synchronizedMap(new EnumMap<StorageService.Verb, Integer>(StorageService.Verb.class));
+
     private final List<ILatencySubscriber> subscribers = new ArrayList<ILatencySubscriber>();
     private static final long DEFAULT_CALLBACK_TIMEOUT = (long) (1.1 * DatabaseDescriptor.getRpcTimeout());
 
     {
-        for (StorageService.Verb verb : StorageService.Verb.values())
+        for (StorageService.Verb verb : DROPPABLE_VERBS)
+        {
             droppedMessages.put(verb, new AtomicInteger());
+            lastDropped.put(verb, 0);
+        }
     }
 
     private static class MSHandle
@@ -129,7 +151,7 @@ public final class MessagingService impl
         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
         try
         {
-            mbs.registerMBean(this, new ObjectName("org.apache.cassandra.net:type=MessagingService"));
+            mbs.registerMBean(this, new ObjectName(MBEAN_NAME));
         }
         catch (Exception e)
         {
@@ -548,9 +570,10 @@ public final class MessagingService impl
         return buffer;
     }
 
-    public int incrementDroppedMessages(StorageService.Verb verb)
+    public void incrementDroppedMessages(StorageService.Verb verb)
     {
-        return droppedMessages.get(verb).incrementAndGet();
+        assert DROPPABLE_VERBS.contains(verb) : "Verb " + verb + " should not legally be dropped";
+        droppedMessages.get(verb).incrementAndGet();
     }
 
     private void logDroppedMessages()
@@ -562,10 +585,9 @@ public final class MessagingService impl
             if (dropped.get() > 0)
             {
                 logTpstats = true;
-                logger_.warn("Dropped {} {} messages in the last {}ms",
-                             new Object[] {dropped, entry.getKey(), LOG_DROPPED_INTERVAL_IN_MS});
+                logger_.info("{} {} messages dropped in server lifetime",
+                             dropped, entry.getKey());
             }
-            dropped.set(0);
         }
 
         if (logTpstats)
@@ -646,4 +668,26 @@ public final class MessagingService impl
     {
         return DEFAULT_CALLBACK_TIMEOUT;
     }
+
+    public Map<String, Integer> getDroppedMessages()
+    {
+        Map<String, Integer> map = new HashMap<String, Integer>();
+        for (Map.Entry<StorageService.Verb, AtomicInteger> entry : droppedMessages.entrySet())
+            map.put(entry.getKey().toString(), entry.getValue().get());
+        return map;
+    }
+
+    public Map<String, Integer> getRecentlyDroppedMessages()
+    {
+        Map<String, Integer> map = new HashMap<String, Integer>();
+        for (Map.Entry<StorageService.Verb, AtomicInteger> entry : droppedMessages.entrySet())
+        {
+            StorageService.Verb verb = entry.getKey();
+            Integer dropped = entry.getValue().get();
+            Integer recentlyDropped = dropped - lastDropped.get(verb);
+            map.put(verb.toString(), recentlyDropped);
+            lastDropped.put(verb, dropped);
+        }
+        return map;
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/net/MessagingServiceMBean.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/MessagingServiceMBean.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/net/MessagingServiceMBean.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/net/MessagingServiceMBean.java Fri Jul  8 18:13:45 2011
@@ -49,4 +49,14 @@ public interface MessagingServiceMBean
      * Completed tasks for Response(GOSSIP & RESPONSE) TCP Connections
      */
     public Map<String, Long> getResponseCompletedTasks();
+
+    /**
+     * dropped message counts for server lifetime
+     */
+    public Map<String, Integer> getDroppedMessages();
+
+    /**
+     * dropped message counts since last called
+     */
+    public Map<String, Integer> getRecentlyDroppedMessages();
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java Fri Jul  8 18:13:45 2011
@@ -20,6 +20,7 @@ package org.apache.cassandra.service;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -28,6 +29,10 @@ import java.util.concurrent.RejectedExec
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
 
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.log4j.PropertyConfigurator;
@@ -78,6 +83,8 @@ public abstract class AbstractCassandraD
     }
 
     private static Logger logger = LoggerFactory.getLogger(AbstractCassandraDaemon.class);
+
+    static final AtomicInteger exceptions = new AtomicInteger();
     
     protected InetAddress listenAddr;
     protected int listenPort;
@@ -98,18 +105,18 @@ public abstract class AbstractCassandraD
 
         listenPort = DatabaseDescriptor.getRpcPort();
         listenAddr = DatabaseDescriptor.getRpcAddress();
-        
         /* 
          * If ThriftAddress was left completely unconfigured, then assume
          * the same default as ListenAddress
          */
         if (listenAddr == null)
             listenAddr = FBUtilities.getLocalAddress();
-        
+
         Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
         {
             public void uncaughtException(Thread t, Throwable e)
             {
+                exceptions.incrementAndGet();
                 logger.error("Fatal exception in thread " + t, e);
                 if (e instanceof OutOfMemoryError)
                 {

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java Fri Jul  8 18:13:45 2011
@@ -22,6 +22,7 @@ package org.apache.cassandra.service;
 
 
 import java.net.InetAddress;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -48,6 +49,20 @@ public class DatacenterReadCallback<T> e
     }
 
     @Override
+    protected List<InetAddress> preferredEndpoints(List<InetAddress> endpoints)
+    {
+        ArrayList<InetAddress> preferred = new ArrayList<InetAddress>(blockfor);
+        for (InetAddress endpoint : endpoints)
+        {
+            if (localdc.equals(snitch.getDatacenter(endpoint)))
+                preferred.add(endpoint);
+            if (preferred.size() == blockfor)
+                break;
+        }
+        return preferred;
+    }
+
+    @Override
     protected boolean waitingFor(Message message)
     {
         return localdc.equals(snitch.getDatacenter(message.getFrom()));
@@ -77,8 +92,22 @@ public class DatacenterReadCallback<T> e
             if (localdc.equals(snitch.getDatacenter(endpoint)))
                 localEndpoints++;
         }
-        
-        if(localEndpoints < blockfor)
+
+        if (localEndpoints < blockfor)
+        {
+            if (logger.isDebugEnabled())
+            {
+                StringBuilder builder = new StringBuilder("Local replicas [");
+                for (InetAddress endpoint : endpoints)
+                {
+                    if (localdc.equals(snitch.getDatacenter(endpoint)))
+                        builder.append(endpoint).append(",");
+                }
+                builder.append("] are insufficient to satisfy LOCAL_QUORUM requirement of ").append(blockfor).append(" live nodes in '").append(localdc).append("'");
+                logger.debug(builder.toString());
+            }
+
             throw new UnavailableException();
+        }
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java Fri Jul  8 18:13:45 2011
@@ -104,7 +104,7 @@ public class GCInspector
                 continue;
 
             Long previous = gctimes.get(gcw.getName());
-            if (previous != null && previous.longValue() == gcw.getCollectionTime().longValue())            
+            if (previous != null && previous.longValue() == gcw.getCollectionTime().longValue())
                 continue;
             gctimes.put(gcw.getName(), gcw.getCollectionTime());
 
@@ -124,7 +124,7 @@ public class GCInspector
 
             String st = String.format("GC for %s: %s ms, %s reclaimed leaving %s used; max is %s",
                                       gcw.getName(), gcw.getDuration(), previousMemoryUsed - memoryUsed, memoryUsed, memoryMax);
-            if (gcw.getDuration() > MIN_DURATION)                          
+            if (gcw.getDuration() > MIN_DURATION)
                 logger.info(st);
             else if (logger.isDebugEnabled())
                 logger.debug(st);

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/ReadCallback.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/ReadCallback.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/ReadCallback.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/ReadCallback.java Fri Jul  8 18:13:45 2011
@@ -78,13 +78,18 @@ public class ReadCallback<T> implements 
         boolean repair = randomlyReadRepair();
         this.endpoints = repair || resolver instanceof RowRepairResolver
                        ? endpoints
-                       : endpoints.subList(0, Math.min(endpoints.size(), blockfor)); // min so as to not throw exception until assureSufficient is called
+                       : preferredEndpoints(endpoints);
 
         if (logger.isDebugEnabled())
             logger.debug(String.format("Blockfor/repair is %s/%s; setting up requests to %s",
                                        blockfor, repair, StringUtils.join(this.endpoints, ",")));
     }
-    
+
+    protected List<InetAddress> preferredEndpoints(List<InetAddress> endpoints)
+    {
+        return endpoints.subList(0, Math.min(endpoints.size(), blockfor)); // min so as to not throw exception until assureSufficient is called
+    }
+
     private boolean randomlyReadRepair()
     {
         if (resolver instanceof RowDigestResolver)
@@ -202,7 +207,11 @@ public class ReadCallback<T> implements 
     public void assureSufficientLiveNodes() throws UnavailableException
     {
         if (endpoints.size() < blockfor)
+        {
+            logger.debug("Live nodes {} do not satisfy ConsistencyLevel ({} required)",
+                         StringUtils.join(endpoints, ", "), blockfor);
             throw new UnavailableException();
+        }
     }
 
     public boolean isLatencyForSnitch()

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Fri Jul  8 18:13:45 2011
@@ -33,6 +33,7 @@ import javax.management.ObjectName;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
+import org.apache.log4j.Level;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,15 +41,12 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.concurrent.RetryingScheduledThreadPoolExecutor;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.concurrent.StageManager;
-import org.apache.cassandra.config.*;
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.ConfigurationException;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.db.migration.AddKeyspace;
-import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.dht.BootStrapper;
-import org.apache.cassandra.dht.IPartitioner;
-import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.dht.*;
 import org.apache.cassandra.gms.*;
 import org.apache.cassandra.io.DeletionService;
 import org.apache.cassandra.io.sstable.SSTableLoader;
@@ -65,12 +63,10 @@ import org.apache.cassandra.service.Anti
 import org.apache.cassandra.streaming.*;
 import org.apache.cassandra.thrift.Constants;
 import org.apache.cassandra.thrift.UnavailableException;
-import org.apache.cassandra.utils.*;
-import org.apache.log4j.Level;
-import org.yaml.snakeyaml.Dumper;
-import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.nodes.Tag;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.NodeId;
+import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.WrappedRunnable;
 
 /*
  * This abstraction contains the token/identifier of this node
@@ -1704,10 +1700,17 @@ public class StorageService implements I
         }
         FBUtilities.sortSampledKeys(keys, range);
 
-        if (keys.size() < 3)
-            return partitioner.midpoint(range.left, range.right);
-        else
-            return keys.get(keys.size() / 2).token;
+        Token token = keys.size() < 3
+                    ? partitioner.midpoint(range.left, range.right)
+                    : keys.get(keys.size() / 2).token;
+        // Hack to prevent giving nodes tokens with DELIMITER_STR in them (which is fine in a row key/token)
+        if (token instanceof StringToken)
+        {
+            token = new StringToken(((String)token.token).replaceAll(VersionedValue.DELIMITER_STR, ""));
+            if (tokenMetadata_.getTokenToEndpointMap().containsKey(token))
+                throw new RuntimeException("Unable to compute unique token for new node -- specify one manually with initial_token");
+        }
+        return token;
     }
 
     /**
@@ -1803,8 +1806,9 @@ public class StorageService implements I
         onFinish.run();
     }
 
-    public void move(String newToken) throws IOException, InterruptedException
+    public void move(String newToken) throws IOException, InterruptedException, ConfigurationException
     {
+        partitioner.getTokenFactory().validate(newToken);
         move(partitioner.getTokenFactory().fromString(newToken));
     }
 
@@ -2468,4 +2472,9 @@ public class StorageService implements I
             throw new RuntimeException(e);
         }
     }
+
+    public int getExceptionCount()
+    {
+        return AbstractCassandraDaemon.exceptions.get();
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java Fri Jul  8 18:13:45 2011
@@ -197,7 +197,7 @@ public interface StorageServiceMBean
      * @param newToken token to move this node to.
      * This node will unload its data onto its neighbors, and bootstrap to the new token.
      */
-    public void move(String newToken) throws IOException, InterruptedException;
+    public void move(String newToken) throws IOException, InterruptedException, ConfigurationException;
 
     /**
      * removeToken removes token (and all data associated with
@@ -291,6 +291,8 @@ public interface StorageServiceMBean
     public void joinRing() throws IOException, org.apache.cassandra.config.ConfigurationException;
     public boolean isJoined();
 
+    public int getExceptionCount();
+
     public void setCompactionThroughputMbPerSec(int value);
 
     public void bulkLoad(String directory);

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java Fri Jul  8 18:13:45 2011
@@ -31,19 +31,18 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 
-import org.apache.cassandra.db.compaction.CompactionInfo;
-import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.config.ConfigurationException;
-
 import org.apache.commons.cli.*;
 
 import org.apache.cassandra.cache.InstrumentingCacheMBean;
 import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean;
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
+import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionManagerMBean;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.net.MessagingServiceMBean;
 import org.apache.cassandra.utils.EstimatedHistogram;
+import org.apache.cassandra.utils.Pair;
 
 public class NodeCmd
 {
@@ -238,6 +237,10 @@ public class NodeCmd
                         threadPoolProxy.getCurrentlyBlockedTasks(),
                         threadPoolProxy.getTotalBlockedTasks());
         }
+
+        outs.printf("%n%-20s%10s%n", "Message type", "Dropped");
+        for (Entry<String, Integer> entry : probe.getDroppedMessages().entrySet())
+            outs.printf("%-20s%10s%n", entry.getKey(), entry.getValue());
     }
 
     /**
@@ -248,7 +251,7 @@ public class NodeCmd
     public void printInfo(PrintStream outs)
     {
         boolean gossipInitialized = probe.isInitialized();
-        outs.println(probe.getToken());
+        outs.printf("%-17s: %s%n", "Token", probe.getToken());
         outs.printf("%-17s: %s%n", "Gossip active", gossipInitialized);
         outs.printf("%-17s: %s%n", "Load", probe.getLoadString());
         if (gossipInitialized)
@@ -269,6 +272,9 @@ public class NodeCmd
         // Data Center/Rack
         outs.printf("%-17s: %s%n", "Data Center", probe.getDataCenter());
         outs.printf("%-17s: %s%n", "Rack", probe.getRack());
+
+        // Exceptions
+        outs.printf("%-17s: %s%n", "Exceptions", probe.getExceptionCount());
     }
 
     public void printReleaseVersion(PrintStream outs)
@@ -329,7 +335,7 @@ public class NodeCmd
             }
         }
 
-        MessagingServiceMBean ms = probe.getMsProxy();
+        MessagingServiceMBean ms = probe.msProxy;
         outs.printf("%-25s", "Pool Name");
         outs.printf("%10s", "Active");
         outs.printf("%10s", "Pending");
@@ -354,26 +360,22 @@ public class NodeCmd
             completed += n;
         outs.printf("%-25s%10s%10s%15s%n", "Responses", "n/a", pending, completed);
     }
-   
+
     public void printCompactionStats(PrintStream outs)
     {
         CompactionManagerMBean cm = probe.getCompactionManagerProxy();
+        outs.println("pending tasks: " + cm.getPendingTasks());
+        if (cm.getCompactions().size() > 0)
+            outs.printf("%25s%16s%16s%16s%16s%10s%n", "compaction type", "keyspace", "column family", "bytes compacted", "bytes total", "progress");
         for (CompactionInfo c : cm.getCompactions())
         {
-            outs.println("compaction type: " + c.getTaskType());
-            outs.println("keyspace: " + c.getKeyspace());
-            outs.println("column family: " + c.getColumnFamily());
-            outs.println("bytes compacted: " + c.getBytesComplete());
-            outs.println("bytes total: " + c.getTotalBytes());
             String percentComplete = c.getTotalBytes() == 0
                                    ? "n/a"
-                                   : new DecimalFormat("#.##").format((double) c.getBytesComplete() / c.getTotalBytes() * 100) + "%";
-            outs.println("compaction progress: " + percentComplete);
-            outs.println("-----------------");
+                                   : new DecimalFormat("0.00").format((double) c.getBytesComplete() / c.getTotalBytes() * 100) + "%";
+            outs.printf("%25s%16s%16s%16s%16s%10s%n", c.getTaskType(), c.getKeyspace(), c.getColumnFamily(), c.getBytesComplete(), c.getTotalBytes(), percentComplete);
         }
-        outs.println("pending tasks: " + cm.getPendingTasks());
     }
- 
+
     public void printColumnFamilyStats(PrintStream outs)
     {
         Map <String, List <ColumnFamilyStoreMBean>> cfstoreMap = new HashMap <String, List <ColumnFamilyStoreMBean>>();

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java Fri Jul  8 18:13:45 2011
@@ -26,7 +26,6 @@ import java.lang.management.MemoryUsage;
 import java.lang.management.RuntimeMXBean;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
@@ -43,23 +42,19 @@ import com.google.common.collect.Iterabl
 
 import org.apache.cassandra.cache.InstrumentingCacheMBean;
 import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean;
-import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.compaction.CompactionManagerMBean;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.EndpointSnitchInfoMBean;
+import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.MessagingServiceMBean;
 import org.apache.cassandra.service.StorageServiceMBean;
 import org.apache.cassandra.streaming.StreamingService;
 import org.apache.cassandra.streaming.StreamingServiceMBean;
 import org.apache.cassandra.thrift.UnavailableException;
 
-import static com.google.common.base.Charsets.UTF_8;
-
 /**
  * JMX client operations for Cassandra.
  */
@@ -80,7 +75,8 @@ public class NodeProbe
     private MemoryMXBean memProxy;
     private RuntimeMXBean runtimeProxy;
     private StreamingServiceMBean streamProxy;
-    
+    public MessagingServiceMBean msProxy;
+
     /**
      * Creates a NodeProbe using the specified JMX host, port, username, and password.
      *
@@ -148,6 +144,8 @@ public class NodeProbe
         {
             ObjectName name = new ObjectName(ssObjName);
             ssProxy = JMX.newMBeanProxy(mbeanServerConn, name, StorageServiceMBean.class);
+            name = new ObjectName(MessagingService.MBEAN_NAME);
+            msProxy = JMX.newMBeanProxy(mbeanServerConn, name, MessagingServiceMBean.class);
             name = new ObjectName(StreamingService.MBEAN_OBJECT_NAME);
             streamProxy = JMX.newMBeanProxy(mbeanServerConn, name, StreamingServiceMBean.class);
             name = new ObjectName(CompactionManager.MBEAN_OBJECT_NAME);
@@ -359,7 +357,7 @@ public class NodeProbe
         ssProxy.decommission();
     }
 
-    public void move(String newToken) throws IOException, InterruptedException
+    public void move(String newToken) throws IOException, InterruptedException, ConfigurationException
     {
         ssProxy.move(newToken);
     }
@@ -502,18 +500,6 @@ public class NodeProbe
         }
     }
     
-    public MessagingServiceMBean getMsProxy()
-    {
-        try
-        {
-            return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.net:type=MessagingService"), MessagingServiceMBean.class);
-        }
-        catch (MalformedObjectNameException e)
-        {
-            throw new RuntimeException(e);
-        }
-    }
-    
     public ColumnFamilyStoreMBean getCfsProxy(String ks, String cf)
     {
         ColumnFamilyStoreMBean cfsProxy = null;
@@ -595,6 +581,16 @@ public class NodeProbe
     {
         ssProxy.setCompactionThroughputMbPerSec(value);
     }
+
+    public int getExceptionCount()
+    {
+        return ssProxy.getExceptionCount();
+    }
+
+    public Map<String, Integer> getDroppedMessages()
+    {
+        return msProxy.getDroppedMessages();
+    }
 }
 
 class ColumnFamilyStoreMBeanIterator implements Iterator<Map.Entry<String, ColumnFamilyStoreMBean>>

Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=1144411&r1=1144410&r2=1144411&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Fri Jul  8 18:13:45 2011
@@ -316,6 +316,24 @@ public class ColumnFamilyStoreTest exten
         rm.apply();
         rows = cfs.scan(clause, range, filter);
         assert rows.isEmpty() : StringUtils.join(rows, ",");
+
+        // try insert followed by row delete in the same mutation
+        rm = new RowMutation("Keyspace3", ByteBufferUtil.bytes("k1"));
+        rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(1L), 1);
+        rm.delete(new QueryPath("Indexed1"), 2);
+        rm.apply();
+        rows = cfs.scan(clause, range, filter);
+        assert rows.isEmpty() : StringUtils.join(rows, ",");
+
+        // try row delete followed by insert in the same mutation
+        rm = new RowMutation("Keyspace3", ByteBufferUtil.bytes("k1"));
+        rm.delete(new QueryPath("Indexed1"), 3);
+        rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(1L), 4);
+        rm.apply();
+        rows = cfs.scan(clause, range, filter);
+        assert rows.size() == 1 : StringUtils.join(rows, ",");
+        key = new String(rows.get(0).key.key.array(),rows.get(0).key.key.position(),rows.get(0).key.key.remaining());
+        assert "k1".equals( key );
     }
 
     @Test