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