Author: jbellis
Date: Mon Nov 29 19:36:08 2010
New Revision: 1040241
URL: http://svn.apache.org/viewvc?rev=1040241&view=rev
Log:
add ExpiringColumn support to sstable import/export
patch by Sylvain Lebresne; reviewed by jbellis for CASSANDRA-1754
Modified:
cassandra/branches/cassandra-0.7/CHANGES.txt
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Mon Nov 29 19:36:08 2010
@@ -17,6 +17,7 @@ dev
* Validate that column names in column_metadata are valid for the
defined comparator, and decode properly in cli (CASSANDRA-1773)
* use cross-platform newlines in cli (CASSANDRA-1786)
+ * add ExpiringColumn support to sstable import/export (CASSANDRA-1754)
0.7.0-rc1
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableExport.java
Mon Nov 29 19:36:08 2010
@@ -31,6 +31,7 @@ import org.apache.cassandra.config.Datab
import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.ExpiringColumn;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.io.sstable.*;
@@ -95,6 +96,12 @@ public class SSTableExport
json.append(column.timestamp());
json.append(", ");
json.append(column.isMarkedForDelete());
+ if (column instanceof ExpiringColumn) {
+ json.append(", ");
+ json.append(((ExpiringColumn)column).getTimeToLive());
+ json.append(", ");
+ json.append(((ExpiringColumn)column).getLocalDeletionTime());
+ }
json.append("]");
if (iter.hasNext())
json.append(", ");
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/SSTableImport.java
Mon Nov 29 19:36:08 2010
@@ -28,6 +28,7 @@ import org.apache.cassandra.config.Confi
import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.db.SuperColumn;
+import org.apache.cassandra.db.ExpiringColumn;
import org.apache.cassandra.db.ColumnFamilyType;
import org.apache.cassandra.db.filter.QueryPath;
import org.apache.cassandra.dht.IPartitioner;
@@ -68,15 +69,22 @@ public class SSTableImport
private String value;
private long timestamp;
private boolean isDeleted;
+ private int ttl;
+ private int localExpirationTime;
private JsonColumn(Object obj) throws ClassCastException
{
JSONArray colSpec = (JSONArray)obj;
- assert colSpec.size() == 4;
+ assert colSpec.size() == 4 || colSpec.size() == 6;
name = (String)colSpec.get(0);
value = (String)colSpec.get(1);
timestamp = (Long)colSpec.get(2);
isDeleted = (Boolean)colSpec.get(3);
+ if (colSpec.size() == 6)
+ {
+ ttl = (int)(long)((Long)colSpec.get(4));
+ localExpirationTime = (int)(long)((Long)colSpec.get(5));
+ }
}
}
@@ -94,9 +102,16 @@ public class SSTableImport
{
JsonColumn col = new JsonColumn(c);
QueryPath path = new QueryPath(cfm.cfName, null,
ByteBuffer.wrap(hexToBytes(col.name)));
- if (col.isDeleted) {
+ if (col.ttl > 0)
+ {
+ cfamily.addColumn(null, new
ExpiringColumn(ByteBuffer.wrap(hexToBytes(col.name)),
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp, col.ttl,
col.localExpirationTime));
+ }
+ else if (col.isDeleted)
+ {
cfamily.addTombstone(path,
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
- } else {
+ }
+ else
+ {
cfamily.addColumn(path,
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
}
}
@@ -124,9 +139,16 @@ public class SSTableImport
{
JsonColumn col = new JsonColumn(c);
QueryPath path = new QueryPath(cfm.cfName, superName,
ByteBuffer.wrap(hexToBytes(col.name)));
- if (col.isDeleted) {
+ if (col.ttl > 0)
+ {
+ cfamily.addColumn(superName, new
ExpiringColumn(ByteBuffer.wrap(hexToBytes(col.name)),
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp, col.ttl,
col.localExpirationTime));
+ }
+ else if (col.isDeleted)
+ {
cfamily.addTombstone(path,
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
- } else {
+ }
+ else
+ {
cfamily.addColumn(path,
ByteBuffer.wrap(hexToBytes(col.value)), col.timestamp);
}
}
Modified: cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json (original)
+++ cassandra/branches/cassandra-0.7/test/resources/SimpleCF.json Mon Nov 29
19:36:08 2010
@@ -1,4 +1,4 @@
{
- "726f7741": [["636f6c4141", "76616c4141", 1, false], ["636f6c4142",
"76616c4142", 1, false]],
+ "726f7741": [["636f6c4141", "76616c4141", 1, false], ["636f6c4142",
"76616c4142", 1, false], ["636f6c4143", "76616c4143", 1, false, 42, 2000000000
]],
"726f7742": [["636f6c4241", "76616c4241", 1, false], ["636f6c4242",
"76616c4242", 1, false]]
}
Modified:
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
(original)
+++
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
Mon Nov 29 19:36:08 2010
@@ -28,6 +28,7 @@ import java.util.Arrays;
import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.ExpiringColumn;
import org.apache.cassandra.db.filter.QueryFilter;
import org.apache.cassandra.db.filter.QueryPath;
import org.apache.cassandra.dht.IPartitioner;
@@ -90,13 +91,16 @@ public class SSTableExportTest extends S
}
@Test
- public void testExportSimpleCf() throws IOException {
+ public void testExportSimpleCf() throws IOException
+ {
File tempSS = tempSSTableFile("Keyspace1", "Standard1");
ColumnFamily cfamily = ColumnFamily.create("Keyspace1", "Standard1");
SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2);
+ int nowInSec = (int)(System.currentTimeMillis() / 1000);
// Add rowA
cfamily.addColumn(new QueryPath("Standard1", null,
ByteBufferUtil.bytes("colA")), ByteBufferUtil.bytes("valA"), 1);
+ cfamily.addColumn(null, new
ExpiringColumn(ByteBufferUtil.bytes("colExp"), ByteBufferUtil.bytes("valExp"),
1, 42, nowInSec));
writer.append(Util.dk("rowA"), cfamily);
cfamily.clear();
@@ -121,6 +125,10 @@ public class SSTableExportTest extends S
JSONArray rowA = (JSONArray)json.get(asHex("rowA"));
JSONArray colA = (JSONArray)rowA.get(0);
assert Arrays.equals(hexToBytes((String)colA.get(1)),
"valA".getBytes());
+
+ JSONArray colExp = (JSONArray)rowA.get(1);
+ assert ((Long)colExp.get(4)) == 42;
+ assert ((Long)colExp.get(5)) == nowInSec;
JSONArray rowB = (JSONArray)json.get(asHex("rowB"));
JSONArray colB = (JSONArray)rowB.get(0);
Modified:
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java?rev=1040241&r1=1040240&r2=1040241&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
(original)
+++
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/tools/SSTableImportTest.java
Mon Nov 29 19:36:08 2010
@@ -27,9 +27,11 @@ import org.apache.cassandra.SchemaLoader
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.DeletedColumn;
+import org.apache.cassandra.db.ExpiringColumn;
import org.apache.cassandra.db.IColumn;
import org.apache.cassandra.db.filter.QueryFilter;
import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.columniterator.IColumnIterator;
import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.sstable.SSTableReader;
import static org.apache.cassandra.utils.FBUtilities.hexToBytes;
@@ -41,6 +43,9 @@ import org.json.simple.parser.ParseExcep
import org.junit.Test;
import org.apache.cassandra.utils.ByteBufferUtil;
+
+import org.apache.cassandra.utils.FBUtilities;
+
public class SSTableImportTest extends SchemaLoader
{
@Test
@@ -53,10 +58,16 @@ public class SSTableImportTest extends S
// Verify results
SSTableReader reader =
SSTableReader.open(Descriptor.fromFilename(tempSS.getPath()));
- QueryFilter qf = QueryFilter.getNamesFilter(Util.dk("rowA"), new
QueryPath("Standard1", null, null), ByteBufferUtil.bytes("colAA"));
- ColumnFamily cf =
qf.getSSTableColumnIterator(reader).getColumnFamily();
+ QueryFilter qf = QueryFilter.getIdentityFilter(Util.dk("rowA"), new
QueryPath("Standard1"));
+ IColumnIterator iter = qf.getSSTableColumnIterator(reader);
+ ColumnFamily cf = iter.getColumnFamily();
+ while (iter.hasNext()) cf.addColumn(iter.next());
assert
cf.getColumn(ByteBufferUtil.bytes("colAA")).value().equals(ByteBuffer.wrap(hexToBytes("76616c4141")));
assert !(cf.getColumn(ByteBufferUtil.bytes("colAA")) instanceof
DeletedColumn);
+ IColumn expCol = cf.getColumn(ByteBufferUtil.bytes("colAC"));
+ assert
expCol.value().equals(ByteBuffer.wrap(hexToBytes("76616c4143")));
+ assert expCol instanceof ExpiringColumn;
+ assert ((ExpiringColumn)expCol).getTimeToLive() == 42 &&
((ExpiringColumn)expCol).getLocalDeletionTime() == 2000000000;
}
@Test