Merge branch 'cassandra-2.2' into cassandra-3.0
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b0eba5f9 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b0eba5f9 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b0eba5f9 Branch: refs/heads/cassandra-3.11 Commit: b0eba5f9c64db18840a4b0e4d56a589c5f2e08cd Parents: f791c26 e80ede6 Author: Marcus Eriksson <marc...@apache.org> Authored: Mon Sep 4 15:02:53 2017 +0200 Committer: Marcus Eriksson <marc...@apache.org> Committed: Mon Sep 4 15:02:53 2017 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/ColumnFamilyStore.java | 2 +- .../db/compaction/CompactionManager.java | 4 +- .../db/compaction/CompactionExecutorTest.java | 107 +++++++++++++++++++ 4 files changed, 111 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/b0eba5f9/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index b405fdf,03a78fd..3baa63b --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -1,37 -1,8 +1,38 @@@ -2.2.11 +3.0.15 + * Better tolerate improperly formatted bcrypt hashes (CASSANDRA-13626) + * Fix race condition in read command serialization (CASSANDRA-13363) + * Enable segement creation before recovering commitlogs (CASSANDRA-13587) + * Fix AssertionError in short read protection (CASSANDRA-13747) + * Don't skip corrupted sstables on startup (CASSANDRA-13620) + * Fix the merging of cells with different user type versions (CASSANDRA-13776) + * Copy session properties on cqlsh.py do_login (CASSANDRA-13640) + * Potential AssertionError during ReadRepair of range tombstone and partition deletions (CASSANDRA-13719) + * Don't let stress write warmup data if n=0 (CASSANDRA-13773) + * Gossip thread slows down when using batch commit log (CASSANDRA-12966) + * Randomize batchlog endpoint selection with only 1 or 2 racks (CASSANDRA-12884) + * Fix digest calculation for counter cells (CASSANDRA-13750) + * Fix ColumnDefinition.cellValueType() for non-frozen collection and change SSTabledump to use type.toJSONString() (CASSANDRA-13573) + * Skip materialized view addition if the base table doesn't exist (CASSANDRA-13737) + * Drop table should remove corresponding entries in dropped_columns table (CASSANDRA-13730) + * Log warn message until legacy auth tables have been migrated (CASSANDRA-13371) + * Fix incorrect [2.1 <- 3.0] serialization of counter cells created in 2.0 (CASSANDRA-13691) + * Fix invalid writetime for null cells (CASSANDRA-13711) + * Fix ALTER TABLE statement to atomically propagate changes to the table and its MVs (CASSANDRA-12952) + * Fixed ambiguous output of nodetool tablestats command (CASSANDRA-13722) + * JMXEnabledThreadPoolExecutor with corePoolSize equal to maxPoolSize (Backport CASSANDRA-13329) + * Fix Digest mismatch Exception if hints file has UnknownColumnFamily (CASSANDRA-13696) + * Purge tombstones created by expired cells (CASSANDRA-13643) + * Make concat work with iterators that have different subsets of columns (CASSANDRA-13482) + * Set test.runners based on cores and memory size (CASSANDRA-13078) + * Allow different NUMACTL_ARGS to be passed in (CASSANDRA-13557) + * Allow native function calls in CQLSSTableWriter (CASSANDRA-12606) + * Fix secondary index queries on COMPACT tables (CASSANDRA-13627) + * Nodetool listsnapshots output is missing a newline, if there are no snapshots (CASSANDRA-13568) + * sstabledump reports incorrect usage for argument order (CASSANDRA-13532) +Merged from 2.2: + * Fix compaction and flush exception not captured (CASSANDRA-13833) - * Make BatchlogManagerMBean.forceBatchlogReplay() blocking (CASSANDRA-13809) * Uncaught exceptions in Netty pipeline (CASSANDRA-13649) - * Prevent integer overflow on exabyte filesystems (CASSANDRA-13067) + * Prevent integer overflow on exabyte filesystems (CASSANDRA-13067) * Fix queries with LIMIT and filtering on clustering columns (CASSANDRA-11223) * Fix potential NPE when resume bootstrap fails (CASSANDRA-13272) * Fix toJSONString for the UDT, tuple and collection types (CASSANDRA-13592) http://git-wip-us.apache.org/repos/asf/cassandra/blob/b0eba5f9/src/java/org/apache/cassandra/db/ColumnFamilyStore.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 7251244,7e36e11..183176c --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@@ -837,12 -899,33 +837,12 @@@ public class ColumnFamilyStore implemen { synchronized (data) { - if (previousFlushFailure != null) - throw new IllegalStateException("A flush previously failed with the error below. To prevent data loss, " - + "no flushes can be carried out until the node is restarted.", - previousFlushFailure); logFlush(); Flush flush = new Flush(false); - ListenableFutureTask<Void> flushTask = ListenableFutureTask.create(flush, null); - flushExecutor.execute(flushTask); + flushExecutor.execute(flush); ListenableFutureTask<ReplayPosition> task = ListenableFutureTask.create(flush.postFlush); - postFlushExecutor.submit(task); + postFlushExecutor.execute(task); - - @SuppressWarnings("unchecked") - ListenableFuture<ReplayPosition> future = - // If either of the two tasks errors out, resulting future must also error out. - // Combine the two futures and only return post-flush result after both have completed. - // Note that flushTask will always yield null, but Futures.allAsList is - // order preserving, which is why the transform function returns the result - // from item 1 in it's input list (i.e. what was yielded by task). - Futures.transform(Futures.allAsList(flushTask, task), - new Function<List<Object>, ReplayPosition>() - { - public ReplayPosition apply(List<Object> input) - { - return (ReplayPosition) input.get(1); - } - }); - return future; + return task; } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/b0eba5f9/src/java/org/apache/cassandra/db/compaction/CompactionManager.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/b0eba5f9/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java index 0000000,c6feb3f..9b07da9 mode 000000,100644..100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java @@@ -1,0 -1,131 +1,107 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + package org.apache.cassandra.db.compaction; + -import java.util.concurrent.Callable; + import java.util.concurrent.Future; + import java.util.concurrent.TimeUnit; + + import org.junit.After; + import org.junit.Before; + import org.junit.Test; + import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNotNull; + + public class CompactionExecutorTest + { + static Throwable testTaskThrowable = null; + private static class TestTaskExecutor extends CompactionManager.CompactionExecutor + { + @Override + public void afterExecute(Runnable r, Throwable t) + { + if (t == null) + { + t = DebuggableThreadPoolExecutor.extractThrowable(r); + } + testTaskThrowable = t; + } + @Override + protected void beforeExecute(Thread t, Runnable r) + { + } + } + private CompactionManager.CompactionExecutor executor; + + @Before + public void setup() + { + executor = new TestTaskExecutor(); + } + + @After + public void destroy() throws Exception + { + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.MINUTES); + } + + @Test + public void testFailedRunnable() throws Exception + { + testTaskThrowable = null; - + Future<?> tt = executor.submitIfRunning( - new Runnable() - { - @Override - public void run() - { - assert false : "testFailedRunnable"; - } - }, "compactionExecutorTest" - ); ++ () -> { assert false : "testFailedRunnable"; } ++ , "compactionExecutorTest"); + + while (!tt.isDone()) + Thread.sleep(10); + assertNotNull(testTaskThrowable); + assertEquals(testTaskThrowable.getMessage(), "testFailedRunnable"); + } + + @Test + public void testFailedCallable() throws Exception + { + testTaskThrowable = null; + Future<?> tt = executor.submitIfRunning( - new Callable<Integer>() - { - @Override - public Integer call() throws Exception - { - assert false : "testFailedCallable"; - return 1; - } - } ++ () -> { assert false : "testFailedCallable"; return 1; } + , "compactionExecutorTest"); + + while (!tt.isDone()) + Thread.sleep(10); + assertNotNull(testTaskThrowable); + assertEquals(testTaskThrowable.getMessage(), "testFailedCallable"); + } + + @Test + public void testExceptionRunnable() throws Exception + { + testTaskThrowable = null; + Future<?> tt = executor.submitIfRunning( - new Runnable() - { - @Override - public void run() - { - throw new RuntimeException("testExceptionRunnable"); - } - } ++ () -> { throw new RuntimeException("testExceptionRunnable"); } + , "compactionExecutorTest"); + + while (!tt.isDone()) + Thread.sleep(10); + assertNotNull(testTaskThrowable); + assertEquals(testTaskThrowable.getMessage(), "testExceptionRunnable"); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org