Repository: cassandra Updated Branches: refs/heads/trunk 90476352a -> 774bd0bce
Follow-up #2 for 9104. Fix SchemaLoader + EmbeddedCassandraServer recover case Patch by jmckenzie; reviewed by branimir for CASSANDRA-9104 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/774bd0bc Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/774bd0bc Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/774bd0bc Branch: refs/heads/trunk Commit: 774bd0bceeee56abd97a122c563852210cf54bbc Parents: 9047635 Author: Josh McKenzie <[email protected]> Authored: Thu Apr 30 11:13:23 2015 -0500 Committer: Josh McKenzie <[email protected]> Committed: Thu Apr 30 11:16:05 2015 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/db/commitlog/CommitLog.java | 10 ++++++---- .../db/commitlog/CommitLogSegmentManager.java | 2 +- test/unit/org/apache/cassandra/SchemaLoader.java | 15 +++++++++++---- .../cassandra/config/DatabaseDescriptorTest.java | 3 ++- .../dht/OrderPreservingPartitionerTest.java | 4 +++- 5 files changed, 23 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/774bd0bc/src/java/org/apache/cassandra/db/commitlog/CommitLog.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java index 37a709c..a8dda28 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java @@ -119,7 +119,9 @@ public class CommitLog implements CommitLogMBean */ public int recover() throws IOException { - assert !allocator.createReserveSegments; + // If createReserveSegments is already flipped, the CLSM is running and recovery has already taken place. + if (allocator.createReserveSegments) + return 0; // Allocator could be in the process of initial startup with 0 active and available segments. We need to wait for // the allocation manager to finish allocation and add it to available segments so we don't get an invalid response @@ -384,8 +386,7 @@ public class CommitLog implements CommitLogMBean public int resetUnsafe(boolean deleteSegments) throws IOException { stopUnsafe(deleteSegments); - startUnsafe(); - return recover(); + return startUnsafe(); } /** @@ -408,10 +409,11 @@ public class CommitLog implements CommitLogMBean /** * FOR TESTING PURPOSES. See CommitLogAllocator */ - public void startUnsafe() + public int startUnsafe() throws IOException { allocator.startUnsafe(); executor.startUnsafe(); + return recover(); } /** http://git-wip-us.apache.org/repos/asf/cassandra/blob/774bd0bc/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java index 5a9e375..5301e1b 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java @@ -413,7 +413,7 @@ public class CommitLogSegmentManager * Throws a flag that enables the behavior of keeping at least one spare segment * available at all times. */ - public void enableReserveSegmentCreation() + void enableReserveSegmentCreation() { createReserveSegments = true; wakeManager(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/774bd0bc/test/unit/org/apache/cassandra/SchemaLoader.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index eb260c4..8f9df8f 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -18,6 +18,7 @@ package org.apache.cassandra; import java.io.File; +import java.io.IOException; import java.nio.ByteBuffer; import java.util.*; @@ -71,9 +72,15 @@ public class SchemaLoader public static void prepareServer() { // Cleanup first - cleanupAndLeaveDirs(); - - CommitLog.instance.allocator.enableReserveSegmentCreation(); + try + { + cleanupAndLeaveDirs(); + } + catch (IOException e) + { + logger.error("Failed to cleanup and recreate directories and files."); + throw new RuntimeException(e); + } Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @@ -444,7 +451,7 @@ public class SchemaLoader return new CompressionParameters(null); } - public static void cleanupAndLeaveDirs() + public static void cleanupAndLeaveDirs() throws IOException { // We need to stop and unmap all CLS instances prior to cleanup() or we'll get failures on Windows. CommitLog.instance.stopUnsafe(true); http://git-wip-us.apache.org/repos/asf/cassandra/blob/774bd0bc/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java index 57c4194..5f231c3 100644 --- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java +++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java @@ -18,6 +18,7 @@ */ package org.apache.cassandra.config; +import java.io.IOException; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -76,7 +77,7 @@ public class DatabaseDescriptorTest // this came as a result of CASSANDRA-995 @Test - public void testTransKsMigration() throws ConfigurationException + public void testTransKsMigration() throws ConfigurationException, IOException { SchemaLoader.cleanupAndLeaveDirs(); Schema.instance.loadFromDisk(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/774bd0bc/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java b/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java index 397d7cc..0449258 100644 --- a/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java +++ b/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java @@ -18,6 +18,8 @@ */ package org.apache.cassandra.dht; +import java.io.IOException; + import org.junit.BeforeClass; import org.junit.Test; @@ -26,7 +28,7 @@ import org.apache.cassandra.SchemaLoader; public class OrderPreservingPartitionerTest extends PartitionerTestCase { @BeforeClass - public static void cleanStatesFromPreviousTest() + public static void cleanStatesFromPreviousTest() throws IOException { // Since OrderPreservingPartitioner#describeOwnership tries to read SSTables, // we need to clear data dir to clear garbage from previous test before running tests.
