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