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;


Reply via email to