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);