Author: jbellis
Date: Thu Nov 10 05:19:02 2011
New Revision: 1200154

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

Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/contrib/   (props changed)
    cassandra/trunk/debian/control
    
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/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java
    cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java
    cassandra/trunk/src/java/org/apache/cassandra/service/LoadBroadcaster.java
    cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamIn.java
    
cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
    cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 /cassandra/branches/cassandra-0.8.0:1125021-1130369
 /cassandra/branches/cassandra-0.8.1:1101014-1125018
-/cassandra/branches/cassandra-1.0:1167085-1199877
+/cassandra/branches/cassandra-1.0:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
 /cassandra/tags/cassandra-0.8.0-rc1:1102511-1125020

Modified: cassandra/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Thu Nov 10 05:19:02 2011
@@ -15,6 +15,7 @@
    subcolumns or old subcolumn versions (CASSANDRA-3446)
  * automatically compute sha1 sum for uncompressed data files (CASSANDRA-3456)
  * fix reading metadata/statistics component for version < h (CASSANDRA-3474)
+ * add sstable forward-compatibility (CASSANDRA-3478)
 Merged from 0.8:
  * Make counter shard merging thread safe (CASSANDRA-3178)
  * fix updating CF row_cache_provider (CASSANDRA-3414)

Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
-/cassandra/branches/cassandra-1.0/contrib:1167085-1199877
+/cassandra/branches/cassandra-1.0/contrib:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/contrib:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689
 /cassandra/tags/cassandra-0.8.0-rc1/contrib:1102511-1125020

Modified: cassandra/trunk/debian/control
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/debian/control?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/debian/control (original)
+++ cassandra/trunk/debian/control Thu Nov 10 05:19:02 2011
@@ -11,6 +11,8 @@ Standards-Version: 3.8.3
 Package: cassandra
 Architecture: all
 Depends: openjdk-6-jre-headless (>= 6b11) | java6-runtime, jsvc (>= 1.0), 
libcommons-daemon-java (>= 1.0), adduser, libjna-java
+Conflicts: apache-cassandra1
+Replaces: apache-cassandra1
 Description: distributed storage system for structured data
  Cassandra is a distributed (peer-to-peer) system for the management
  and storage of structured data.

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 
/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/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1199877
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
 
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1102511-1125020

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 
/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/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1199877
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
 
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1102511-1125020

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 
/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/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1199877
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
 
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1102511-1125020

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 
/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/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1199877
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
 
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1102511-1125020

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 10 05:19:02 2011
@@ -4,7 +4,7 @@
 
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1198724,1198726-1199259,1199284
 
/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/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1199877
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1200153
 
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
 
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
 
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1102511-1125020

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Thu 
Nov 10 05:19:02 2011
@@ -321,11 +321,9 @@ public class ColumnFamilyStore implement
                 if (!desc.cfname.equals(columnFamily))
                     continue;
                 generations.add(desc.generation);
-                if (desc.isFromTheFuture())
-                {
-                    throw new RuntimeException(String.format("Can't open 
sstables from the future! Current version %s, found file: %s",
+                if (!desc.isCompatible())
+                    throw new RuntimeException(String.format("Can't open 
incompatible SSTable! Current version %s, found file: %s",
                                                              
Descriptor.CURRENT_VERSION, desc));
-                }
             }
         }
         Collections.sort(generations);
@@ -548,8 +546,8 @@ public class ColumnFamilyStore implement
             if (!descriptor.cfname.equals(columnFamily))
                 continue;
 
-            if (descriptor.isFromTheFuture())
-                throw new RuntimeException(String.format("Can't open sstables 
from the future! Current version %s, found file: %s",
+            if (!descriptor.isCompatible())
+                throw new RuntimeException(String.format("Can't open 
incompatible SSTable! Current version %s, found file: %s",
                                                          
Descriptor.CURRENT_VERSION,
                                                          descriptor));
 

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java 
Thu Nov 10 05:19:02 2011
@@ -40,6 +40,14 @@ import static org.apache.cassandra.io.ss
  */
 public class Descriptor
 {
+    // versions are denoted as [major][minor].  Minor versions must be 
forward-compatible:
+    // new fields are allowed in e.g. the metadata component, but fields can't 
be removed
+    // or have their size changed.
+    //
+    // Minor versions were introduced with version "hb" for Cassandra 1.0.3; 
prior to that,
+    // we always incremented the major version.  In particular, versions g and 
h are
+    // forwards-compatible with version f, so if the above convention had been 
followed,
+    // we would have labeled them fb and fc.
     public static final String LEGACY_VERSION = "a"; // "pre-history"
     // b (0.7.0): added version to sstable filenames
     // c (0.7.0): bloom filter component computes hashes over raw key bytes 
instead of strings
@@ -51,6 +59,7 @@ public class Descriptor
     public static final String CURRENT_VERSION = "h";
 
     public final File directory;
+    /** version has the following format: <code>[a-z]+</code> */
     public final String version;
     public final String ksname;
     public final String cfname;
@@ -242,21 +251,34 @@ public class Descriptor
 
     /**
      * @param ver SSTable version
-     * @return True if the given version string is not empty, and
-     * contains all lowercase letters, as defined by java.lang.Character.
+     * @return True if the given version string matches the format.
+     * @see #version
      */
     static boolean versionValidate(String ver)
     {
-        if (ver.length() < 1) return false;
-        for (char ch : ver.toCharArray())
-            if (!Character.isLetter(ch) || !Character.isLowerCase(ch))
-                return false;
-        return true;
+        return ver != null && ver.matches("[a-z]+");
     }
 
-    public boolean isFromTheFuture()
+    /**
+     * @return true if the current Cassandra version can read the given 
sstable version
+     */
+    public boolean isCompatible()
+    {
+        return version.charAt(0) <= CURRENT_VERSION.charAt(0);
+    }
+
+    /**
+     * @return true if the current Cassandra version can stream the given 
sstable version
+     * from another node.  This is stricter than opening it locally 
[isCompatible] because
+     * streaming needs to rebuild all the non-data components, and it only 
knows how to write
+     * the latest version.
+     */
+    public boolean isStreamCompatible()
     {
-        return version.compareTo(CURRENT_VERSION) > 0;
+        // we could add compatibility for earlier versions with the new 
single-pass streaming
+        // (see SSTableWriter.appendFromStream) but versions earlier than 
0.7.1 don't have the
+        // MessagingService version awareness anyway so there's no point.
+        return isCompatible() && version.charAt(0) >= 'f';
     }
 
     @Override

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/net/IncomingTcpConnection.java 
Thu Nov 10 05:19:02 2011
@@ -113,7 +113,7 @@ public class IncomingTcpConnection exten
                 header = input.readInt();
                 assert isStream == (MessagingService.getBits(header, 3, 1) == 
1) : "Connections cannot change type: " + isStream;
                 version = MessagingService.getBits(header, 15, 8);
-                logger.debug("Version is now {}", version);
+                logger.trace("Version is now {}", version);
                 receiveMessage(input, version);
             }
         } 

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/LoadBroadcaster.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/LoadBroadcaster.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/LoadBroadcaster.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/LoadBroadcaster.java 
Thu Nov 10 05:19:02 2011
@@ -64,7 +64,10 @@ public class LoadBroadcaster implements 
 
     public void onRestart(InetAddress endpoint, EndpointState state) {}
 
-    public void onRemove(InetAddress endpoint) {}
+    public void onRemove(InetAddress endpoint)
+    {
+        loadInfo_.remove(endpoint);
+    }
 
     public Map<InetAddress, Double> getLoadInfo()
     {

Modified: cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamIn.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamIn.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamIn.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamIn.java Thu 
Nov 10 05:19:02 2011
@@ -82,6 +82,9 @@ public class StreamIn
     {
         /* Create a local sstable for each remote sstable */
         Descriptor remotedesc = remote.desc;
+        if (!remotedesc.isStreamCompatible())
+            throw new UnsupportedOperationException(String.format("SSTable %s 
is not compatible with current version %s",
+                                                                  
remote.getFilename(), Descriptor.CURRENT_VERSION));
 
         // new local sstable
         Table table = Table.open(remotedesc.ksname);

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java 
(original)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java 
Thu Nov 10 05:19:02 2011
@@ -49,6 +49,25 @@ public class DescriptorTest
         assertKeyspace("Keyspace11", dirPath);
     }
 
+    @Test
+    public void testVersion()
+    {
+        // letter only
+        Descriptor desc = Descriptor.fromFilename(new File("Keyspace1"), 
"Standard1-h-1-Data.db").left;
+        assert "h".equals(desc.version);
+        assert desc.tracksMaxTimestamp;
+
+        // multiple letters
+        desc = Descriptor.fromFilename(new File("Keyspace1"), 
"Standard1-ha-1-Data.db").left;
+        assert "ha".equals(desc.version);
+        assert desc.tracksMaxTimestamp;
+
+        // hypothetical two-letter g version
+        desc = Descriptor.fromFilename(new File("Keyspace1"), 
"Standard1-gz-1-Data.db").left;
+        assert "gz".equals(desc.version);
+        assert !desc.tracksMaxTimestamp;
+    }
+
     private void assertKeyspace(String expectedKsName, String dirPath) {
         File dir = new File(dirPath);
         dir.deleteOnExit();

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java?rev=1200154&r1=1200153&r2=1200154&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java 
(original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java 
Thu Nov 10 05:19:02 2011
@@ -36,8 +36,8 @@ public class BootstrapTest extends Schem
     @Test
     public void testGetNewNames() throws IOException
     {
-        Descriptor desc = Descriptor.fromFilename(new File("Keyspace1", 
"Standard1-500-Data.db").toString());
-        assert !desc.isLatestVersion; // deliberately test old version; see 
CASSANDRA-2283
+        Descriptor desc = Descriptor.fromFilename(new File("Keyspace1", 
"Standard1-f-500-Data.db").toString());
+        assert !desc.isLatestVersion; // deliberately test old version
         PendingFile inContext = new PendingFile(null, desc, "Data.db", 
Arrays.asList(new Pair<Long,Long>(0L, 1L)), OperationType.BOOTSTRAP);
 
         PendingFile outContext = StreamIn.getContextMapping(inContext);


Reply via email to