Author: jbellis
Date: Mon Feb 14 15:46:16 2011
New Revision: 1070530
URL: http://svn.apache.org/viewvc?rev=1070530&view=rev
Log:
merge from 0.7
Modified:
cassandra/trunk/ (props changed)
cassandra/trunk/CHANGES.txt
cassandra/trunk/NEWS.txt
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/gms/ApplicationState.java
cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
cassandra/trunk/src/java/org/apache/cassandra/gms/VersionedValue.java
cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7:1026516-1068562
/cassandra/branches/cassandra-0.7.0:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3:774578-796573
Modified: cassandra/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Mon Feb 14 15:46:16 2011
@@ -19,7 +19,7 @@
* buffer network stack to avoid inefficient small TCP messages while avoiding
the nagle/delayed ack problem (CASSANDRA-1896)
* check log4j configuration for changes every 10s (CASSANDRA-1525, 1907)
- * more-efficient cross-DC replication (CASSANDRA-1530, -2051)
+ * more-efficient cross-DC replication (CASSANDRA-1530, -2051, -2138)
* avoid polluting page cache with commitlog or sstable writes
and seq scan operations (CASSANDRA-1470)
* add RMI authentication options to nodetool (CASSANDRA-1921)
Modified: cassandra/trunk/NEWS.txt
URL:
http://svn.apache.org/viewvc/cassandra/trunk/NEWS.txt?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/NEWS.txt (original)
+++ cassandra/trunk/NEWS.txt Mon Feb 14 15:46:16 2011
@@ -24,6 +24,22 @@ JMX
- By default, JMX now listens on port 7199.
+0.7.1
+=====
+
+Uprading
+--------
+ - 0.7.1 is completely backwards compatible with 0.7.0. Just restart
+ each node with the new version, one at a time. (The cluster does
+ not all need to be upgraded simultaneously.)
+
+Features
+--------
+ - Cassandra can perform writes efficiently across datacenters by
+ sending a single copy of the mutation and having the recipient
+ forward that to other replicas in its datacenter.
+
+
0.7.0
=====
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1068562
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1068562
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1068562
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1068562
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 14 15:46:16 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1068505,1068562
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1068562
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
Modified:
cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java Mon
Feb 14 15:46:16 2011
@@ -28,6 +28,7 @@ public enum ApplicationState
SCHEMA,
DC,
RACK,
+ RELEASE_VERSION,
// pad to allow adding new states to existing cluster
X1,
X2,
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=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java Mon Feb 14
15:46:16 2011
@@ -488,6 +488,11 @@ public class Gossiper implements IFailur
return endpointStateMap.get(ep);
}
+ public Set<Entry<InetAddress, EndpointState>> getEndpointStates()
+ {
+ return endpointStateMap.entrySet();
+ }
+
EndpointState getStateForVersionBiggerThan(InetAddress forEndpoint, int
version)
{
EndpointState epState = endpointStateMap.get(forEndpoint);
Modified: cassandra/trunk/src/java/org/apache/cassandra/gms/VersionedValue.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/gms/VersionedValue.java?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/VersionedValue.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/VersionedValue.java Mon
Feb 14 15:46:16 2011
@@ -26,6 +26,7 @@ import java.util.UUID;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.ICompactSerializer;
+import org.apache.cassandra.utils.FBUtilities;
/**
@@ -142,6 +143,10 @@ public class VersionedValue implements C
return new VersionedValue(rackId);
}
+ public VersionedValue releaseVersion()
+ {
+ return new VersionedValue(FBUtilities.getReleaseVersionString());
+ }
}
private static class VersionedValueSerializer implements
ICompactSerializer<VersionedValue>
Modified:
cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java Mon
Feb 14 15:46:16 2011
@@ -284,9 +284,9 @@ public class StorageProxy implements Sto
// from previous loop iterations
message.removeHeader(RowMutation.FORWARD_HEADER);
- if (dataCenter.equals(localDataCenter))
+ if (dataCenter.equals(localDataCenter) ||
StorageService.instance.useEfficientCrossDCWrites())
{
- // direct writes to local DC
+ // direct writes to local DC or old Cassadra versions
for (InetAddress destination : messages.getValue())
MessagingService.instance().sendRR(message,
destination, handler);
}
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=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Mon Feb 14 15:46:16 2011
@@ -185,6 +185,8 @@ public class StorageService implements I
private boolean initialized;
private volatile boolean joined = false;
private String operationMode;
+
+ private volatile boolean efficientCrossDCWrites;
private MigrationManager migrationManager = new MigrationManager();
/* Used for tracking drain progress */
@@ -424,6 +426,7 @@ public class StorageService implements I
MessagingService.instance().listen(FBUtilities.getLocalAddress());
StorageLoadBalancer.instance.startBroadcasting();
MigrationManager.announce(DatabaseDescriptor.getDefsVersion(),
DatabaseDescriptor.getSeeds());
+
Gossiper.instance.addLocalApplicationState(ApplicationState.RELEASE_VERSION,
valueFactory.releaseVersion());
HintedHandOffManager.instance.registerMBean();
@@ -633,23 +636,46 @@ public class StorageService implements I
*/
public void onChange(InetAddress endpoint, ApplicationState state,
VersionedValue value)
{
- if (state != ApplicationState.STATUS)
- return;
+ switch (state)
+ {
+ case RELEASE_VERSION:
+ updateEfficientCrossDCWriteMode();
+ break;
+ case STATUS:
+ String apStateValue = value.value;
+ String[] pieces =
apStateValue.split(VersionedValue.DELIMITER_STR, -1);
+ assert (pieces.length > 0);
+
+ String moveName = pieces[0];
+
+ if (moveName.equals(VersionedValue.STATUS_BOOTSTRAPPING))
+ handleStateBootstrap(endpoint, pieces);
+ else if (moveName.equals(VersionedValue.STATUS_NORMAL))
+ handleStateNormal(endpoint, pieces);
+ else if (moveName.equals(VersionedValue.STATUS_LEAVING))
+ handleStateLeaving(endpoint, pieces);
+ else if (moveName.equals(VersionedValue.STATUS_LEFT))
+ handleStateLeft(endpoint, pieces);
+ }
+ }
+
+ /**
+ * We can remove this in 0.8, since mixing 0.7.0 with 0.8 is not supported
(0.7.1 is required)
+ */
+ private void updateEfficientCrossDCWriteMode()
+ {
+ for (Map.Entry<InetAddress, EndpointState> entry :
Gossiper.instance.getEndpointStates())
+ {
+ VersionedValue version =
entry.getValue().getApplicationState(ApplicationState.RELEASE_VERSION);
- String apStateValue = value.value;
- String[] pieces = apStateValue.split(VersionedValue.DELIMITER_STR, -1);
- assert (pieces.length > 0);
-
- String moveName = pieces[0];
-
- if (moveName.equals(VersionedValue.STATUS_BOOTSTRAPPING))
- handleStateBootstrap(endpoint, pieces);
- else if (moveName.equals(VersionedValue.STATUS_NORMAL))
- handleStateNormal(endpoint, pieces);
- else if (moveName.equals(VersionedValue.STATUS_LEAVING))
- handleStateLeaving(endpoint, pieces);
- else if (moveName.equals(VersionedValue.STATUS_LEFT))
- handleStateLeft(endpoint, pieces);
+ // no version means it's old code that doesn't gossip version, <
0.7.1.
+ if (version == null)
+ {
+ efficientCrossDCWrites = false;
+ return;
+ }
+ }
+ efficientCrossDCWrites = true;
}
/**
@@ -2146,4 +2172,9 @@ public class StorageService implements I
if (oldSnitch instanceof DynamicEndpointSnitch)
((DynamicEndpointSnitch)oldSnitch).unregisterMBean();
}
+
+ public boolean useEfficientCrossDCWrites()
+ {
+ return efficientCrossDCWrites;
+ }
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=1070530&r1=1070529&r2=1070530&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Mon
Feb 14 15:46:16 2011
@@ -37,6 +37,8 @@ import java.util.concurrent.atomic.Atomi
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.primitives.Ints;
import org.apache.commons.collections.iterators.CollatingIterator;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;