From 134e8c78d2acff21d960b8d78c7efd6bff5c6b29 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Tue, 18 Dec 2012 14:49:38 -0600 Subject: [PATCH] fix multithreaded compaction deadlock patch by Carl Yeksigian; reviewed by jbellis for CASSANDRA-4492 --- CHANGES.txt | 4 ++++ conf/cassandra.yaml | 15 ++++++--------- .../db/compaction/AbstractCompactedRow.java | 3 ++- .../cassandra/db/compaction/CompactionTask.java | 3 +++ .../db/compaction/LazilyCompactedRow.java | 2 +- .../cassandra/db/compaction/PrecompactedRow.java | 2 ++ 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 03b62c8d8e..cc75791a17 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +1.1.9 + * fix multithreaded compaction deadlock (CASSANDRA-4492) + + 1.1.8 * reset getRangeSlice filter after finishing a row for get_paged_slice (CASSANDRA-4919) diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 543ad65477..c4732db6fa 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -381,15 +381,12 @@ in_memory_compaction_limit_in_mb: 64 # Uncomment to make compaction mono-threaded, the pre-0.8 default. #concurrent_compactors: 1 -# multithreaded_compaction: false. When enabled, each compaction will -# use up to one thread per core, plus one thread per sstable being -# merged. This is usually only useful for SSD-based hardware: -# otherwise, your concern is usually to get compaction to do LESS i/o -# (see: compaction_throughput_mb_per_sec), not more. -# -# WARNING: this setting has caused compaction deadlocks for multiple -# users (see CASSANDRA-4492). It is recommended to leave this off -# unless you are prepared to help troubleshoot. +# Multi-threaded compaction. When enabled, each compaction will use +# up to one thread per core, plus one thread per sstable being merged. +# This is usually only useful for SSD-based hardware: otherwise, +# your concern is usually to get compaction to do LESS i/o (see: +# compaction_throughput_mb_per_sec), not more. +multithreaded_compaction: false # Throttles compaction to the given total throughput across the entire # system. The faster you insert data, the faster you need to compact in diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java index 40c4e97a5c..b7e4c1ee40 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java @@ -21,6 +21,7 @@ package org.apache.cassandra.db.compaction; */ +import java.io.Closeable; import java.io.DataOutput; import java.io.IOException; import java.security.MessageDigest; @@ -32,7 +33,7 @@ import org.apache.cassandra.db.DecoratedKey; * and can write a compacted version of those rows to an output stream. It does * NOT necessarily require creating a merged CF object in memory. */ -public abstract class AbstractCompactedRow +public abstract class AbstractCompactedRow implements Closeable { public final DecoratedKey key; diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index e9fcdcd5dc..b252bc53f5 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -154,7 +154,10 @@ public class CompactionTask extends AbstractCompactionTask AbstractCompactedRow row = nni.next(); if (row.isEmpty()) + { + row.close(); continue; + } long position = writer.append(row); totalkeysWritten++; diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index ec1dd83129..d82abf8e68 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -193,7 +193,7 @@ public class LazilyCompactedRow extends AbstractCompactedRow implements IIterabl return maxTimestamp; } - private void close() + public void close() { for (IColumnIterator row : rows) { diff --git a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java index 8ed21caf7d..c66867af98 100644 --- a/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java @@ -185,4 +185,6 @@ public class PrecompactedRow extends AbstractCompactedRow { return compactedCf; } + + public void close() { } }