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