Hi,

I'm getting an exception when doing many writes to a column with an
empty column name (i.e. empty byte buffer). The exception occurs during
compactation. It is reproducable given enough writes (around 1300000).
Is this a known issue? After the problem occurs cassandra will no longer
start up. It starts up again after I've manually deleted the commit log
files.

I have failed to reproduce the problem with a non empty byte array.

I'm using cassandra 0.7

Is there a way to recover from such errors without loosing the entries
in the commit log?

Regards

Mikael Wikblom



Here is my unit test, the exception and the yaml. I also provided the
stacktrace from the following startup exception

===unit test==============================

@Test
   public void testInvalidColumnNames()
         throws Exception
   {
      final Charset CHARSET = Charset.forName("UTF-8");

      int count = 1300000;
      for (int i = 0; i < count; i++)
      {
         List<RowMutation> mutations = new ArrayList<RowMutation>();
         RowMutation m = new RowMutation("Test",
ByteBuffer.wrap(("rowId").getBytes(CHARSET)));
         // QueryPath qp = new QueryPath("TestCassandra", null,
ByteBuffer.wrap(("test" + i).getBytes(CHARSET)));
         QueryPath qp = new QueryPath("TestCassandra", null,
FBUtilities.EMPTY_BYTE_BUFFER);

         m.add(qp, ByteBuffer.wrap("test".getBytes(CHARSET)),
System.currentTimeMillis());
         mutations.add(m);

         StorageProxy.mutate(mutations, ConsistencyLevel.ONE);
      }

      StorageService.instance.forceTableFlush(CassandraInitializer.KS,
"TestCassandra");

      Thread.sleep(30*1000);
   }


===exception when running test=========================================

13:54:38 ERROR [PrecompactedRow.<init>]  Skipping row
DecoratedKey(rowId, 726f774964) in
./target/test/cassandra/data/Test/TestCassandra-e-4-Data.db
org.apache.cassandra.db.ColumnSerializer$CorruptColumnException: invalid
column name length 0
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:68)
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:35)
    at
org.apache.cassandra.db.ColumnFamilySerializer.deserializeColumns(ColumnFamilySerializer.java:129)
    at
org.apache.cassandra.io.sstable.SSTableIdentityIterator.getColumnFamilyWithColumns(SSTableIdentityIterator.java:137)
    at
org.apache.cassandra.io.PrecompactedRow.<init>(PrecompactedRow.java:78)
    at
org.apache.cassandra.io.CompactionIterator.getCompactedRow(CompactionIterator.java:138)
    at
org.apache.cassandra.io.CompactionIterator.getReduced(CompactionIterator.java:107)
    at
org.apache.cassandra.io.CompactionIterator.getReduced(CompactionIterator.java:42)
    at
org.apache.cassandra.utils.ReducingIterator.computeNext(ReducingIterator.java:73)
    at
com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:137)
    at
com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:132)
    at
org.apache.commons.collections.iterators.FilterIterator.setNextObject(FilterIterator.java:183)
    at
org.apache.commons.collections.iterators.FilterIterator.hasNext(FilterIterator.java:94)
    at
org.apache.cassandra.db.CompactionManager.doCompaction(CompactionManager.java:312)
    at
org.apache.cassandra.db.CompactionManager$1.call(CompactionManager.java:122)
    at
org.apache.cassandra.db.CompactionManager$1.call(CompactionManager.java:92)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

===yaml file============================================

# Cassandra YAML generated from previous config
# Configuration wiki: http://wiki.apache.org/cassandra/StorageConfiguration
authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
auto_bootstrap: false
binary_memtable_throughput_in_mb: 256
cluster_name: CluperUnitTest
column_index_size_in_kb: 64
commitlog_directory: ./target/test/cassandra/commitlog
commitlog_rotation_threshold_in_mb: 128
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
compaction_thread_priority: 1
concurrent_reads: 8
concurrent_writes: 32
data_file_directories:
- ./target/test/cassandra/data
disk_access_mode: auto
dynamic_snitch: false
dynamic_snitch_badness_threshold: 0.0
dynamic_snitch_reset_interval_in_ms: 600000
dynamic_snitch_update_interval_in_ms: 100
endpoint_snitch: org.apache.cassandra.locator.RackInferringSnitch
hinted_handoff_enabled: true
in_memory_compaction_limit_in_mb: 256
index_interval: 128
saved_caches_directory: ./target/test/cassandra/saved_caches
keyspaces:
- column_families:
  - column_metadata: []
    column_type: Standard
    compare_with: UTF8Type
    gc_grace_seconds: 864000
    key_cache_save_period_in_seconds: 3600
    keys_cached: 200000.0
    max_compaction_threshold: 32
    memtable_flush_after_mins: 60
    memtable_operations_in_millions: 0.3
    memtable_throughput_in_mb: 64
    min_compaction_threshold: 4
    name: TestCassandra
    read_repair_chance: 1.0
    row_cache_save_period_in_seconds: 0
    rows_cached: 0.0
  name: Test
  replica_placement_strategy: org.apache.cassandra.locator.SimpleStrategy
  replication_factor: 1
listen_address: localhost
partitioner: org.apache.cassandra.dht.OrderPreservingPartitioner
phi_convict_threshold: 8
rpc_keepalive: true
rpc_port: 9161
rpc_timeout_in_ms: 10000
seeds:
- 127.0.0.1
sliced_buffer_size_in_kb: 64
snapshot_before_compaction: false
storage_port: 7012
thrift_framed_transport_size_in_mb: 15
thrift_max_message_length_in_mb: 16

===start up exception after unit test===================================

14:16:14 ERROR [AbstractCassandraDaemon.activate]  Exception encountered
during startup.
org.apache.cassandra.db.ColumnSerializer$CorruptColumnException: invalid
column name length 0
org.apache.cassandra.db.ColumnSerializer$CorruptColumnException: invalid
column name length 0
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:68)
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:35)
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:68)
    at
org.apache.cassandra.db.ColumnFamilySerializer.deserializeColumns(ColumnFamilySerializer.java:129)
    at
org.apache.cassandra.db.ColumnSerializer.deserialize(ColumnSerializer.java:35)
    at
org.apache.cassandra.db.ColumnFamilySerializer.deserialize(ColumnFamilySerializer.java:120)
    at
org.apache.cassandra.db.ColumnFamilySerializer.deserializeColumns(ColumnFamilySerializer.java:129)
    at
org.apache.cassandra.db.RowMutationSerializer.defreezeTheMaps(RowMutation.java:385)
    at
org.apache.cassandra.db.ColumnFamilySerializer.deserialize(ColumnFamilySerializer.java:120)
    at
org.apache.cassandra.db.RowMutationSerializer.deserialize(RowMutation.java:395)
    at
org.apache.cassandra.db.RowMutationSerializer.defreezeTheMaps(RowMutation.java:385)
    at
org.apache.cassandra.db.RowMutationSerializer.deserialize(RowMutation.java:353)
    at
org.apache.cassandra.db.RowMutationSerializer.deserialize(RowMutation.java:395)
    at
org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:283)
    at
org.apache.cassandra.db.RowMutationSerializer.deserialize(RowMutation.java:353)
    at
org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:194)
    at
org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:283)
    at
org.apache.cassandra.service.AbstractCassandraDaemon.setup(AbstractCassandraDaemon.java:143)
    at
org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:194)
    at
org.apache.cassandra.thrift.CassandraDaemon.setup(CassandraDaemon.java:55)
    at
org.apache.cassandra.service.AbstractCassandraDaemon.setup(AbstractCassandraDaemon.java:143)
    at
org.apache.cassandra.service.AbstractCassandraDaemon.activate(AbstractCassandraDaemon.java:217)
    at
org.apache.cassandra.thrift.CassandraDaemon.setup(CassandraDaemon.java:55)
    at
senselogic.cluper.cassandra.CassandraInitializer$1.run(CassandraInitializer.java:67)
    at
org.apache.cassandra.service.AbstractCassandraDaemon.activate(AbstractCassandraDaemon.java:217)
    at java.lang.Thread.run(Thread.java:662)
    at
senselogic.cluper.cassandra.CassandraInitializer$1.run(CassandraInitializer.java:67)
Exception encountered during startup.
    at java.lang.Thread.run(Thread.java:662)'

===ls of the commit log directory after the error=================

mikael@mikael2:~/projects/sitevision/trunk/framework/sitevision-framework-core/target/test-classes/target/test/cassandra/commitlog>
ls -ltr
total 187936
-rw-r--r-- 1 mikael wheel 134217730 2011-02-01 14:13
CommitLog-1296565996491.log
-rw-r--r-- 1 mikael wheel        28 2011-02-01 14:13
CommitLog-1296566017932.log.header
-rw-r--r-- 1 mikael wheel        52 2011-02-01 14:13
CommitLog-1296565996491.log.header
-rw-r--r-- 1 mikael wheel  58211952 2011-02-01 14:13
CommitLog-1296566017932.log
-rw-r--r-- 1 mikael wheel         0 2011-02-01 14:16
CommitLog-1296566174499.log
-rw-r--r-- 1 mikael wheel        20 2011-02-01 14:16
CommitLog-1296566174499.log.header

-- 
Mikael Wikblom
Software Architect
SiteVision AB
019-217058
mikael.wikb...@sitevision.se
http://www.sitevision.se

Reply via email to