From 8fad4cd59ea5ef6d111cfe67d9a4c0345c4d7fd7 Mon Sep 17 00:00:00 2001 From: Blake Eggleston Date: Thu, 26 Oct 2017 11:05:02 -0700 Subject: [PATCH] fixing CASSANDRA-13123 test --- ... => CommitLogSegmentBackpressureTest.java} | 39 ++------ .../db/commitlog/CommitlogShutdownTest.java | 98 +++++++++++++++++++ 2 files changed, 104 insertions(+), 33 deletions(-) rename test/unit/org/apache/cassandra/db/commitlog/{CommitLogSegmentManagerTest.java => CommitLogSegmentBackpressureTest.java} (79%) create mode 100644 test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java similarity index 79% rename from test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerTest.java rename to test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java index 41f5ed5a7139..b65109801d3b 100644 --- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerTest.java +++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java @@ -20,10 +20,8 @@ */ package org.apache.cassandra.db.commitlog; -import java.io.File; import java.nio.ByteBuffer; import java.util.Random; -import java.util.UUID; import java.util.concurrent.Semaphore; import com.google.common.collect.ImmutableMap; @@ -49,8 +47,11 @@ import org.jboss.byteman.contrib.bmunit.BMRules; import org.jboss.byteman.contrib.bmunit.BMUnitRunner; +/** + * Since this test depends on byteman rules being setup during initialization, you shouldn't add tests to this class + */ @RunWith(BMUnitRunner.class) -public class CommitLogSegmentManagerTest +public class CommitLogSegmentBackpressureTest { //Block commit log service from syncing private static final Semaphore allowSync = new Semaphore(1); @@ -66,12 +67,12 @@ public class CommitLogSegmentManagerTest targetClass = "AbstractCommitLogService$1", targetMethod = "run", targetLocation = "AT INVOKE org.apache.cassandra.db.commitlog.CommitLog.sync", - action = "org.apache.cassandra.db.commitlog.CommitLogSegmentManagerTest.allowSync.acquire()"), + action = "org.apache.cassandra.db.commitlog.CommitLogSegmentBackpressureTest.allowSync.acquire()"), @BMRule(name = "Release Semaphore after sync", targetClass = "AbstractCommitLogService$1", targetMethod = "run", targetLocation = "AFTER INVOKE org.apache.cassandra.db.commitlog.CommitLog.sync", - action = "org.apache.cassandra.db.commitlog.CommitLogSegmentManagerTest.allowSync.release()")}) + action = "org.apache.cassandra.db.commitlog.CommitLogSegmentBackpressureTest.allowSync.release()")}) public void testCompressedCommitLogBackpressure() throws Throwable { // Perform all initialization before making CommitLog.Sync blocking @@ -136,32 +137,4 @@ public void testCompressedCommitLogBackpressure() throws Throwable Thread.currentThread().interrupt(); } } - - @Test - @BMRule(name = "Make removing commitlog segments slow", - targetClass = "CommitLogSegment", - targetMethod = "discard", - action = "Thread.sleep(50)") - public void testShutdownWithPendingTasks() throws Throwable { - CommitLog.instance.resetUnsafe(true); - ColumnFamilyStore cfs1 = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1); - - final Mutation m = new RowUpdateBuilder(cfs1.metadata, 0, "k") - .clustering("bytes") - .add("val", ByteBuffer.wrap(entropy)) - .build(); - - // force creating several commitlog files - for (int i = 0; i < 10; i++) { - CommitLog.instance.add(m); - } - - // schedule discarding completed segments and immediately issue a shutdown - UUID cfid = m.getColumnFamilyIds().iterator().next(); - CommitLog.instance.discardCompletedSegments(cfid, ReplayPosition.NONE, CommitLog.instance.getContext()); - CommitLog.instance.shutdownBlocking(); - - // the shutdown should block until all logs except the currently active one and perhaps a new, empty one are gone - Assert.assertTrue(new File(CommitLog.instance.location).listFiles().length <= 2); - } } diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java new file mode 100644 index 000000000000..ee3f11152fc0 --- /dev/null +++ b/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java @@ -0,0 +1,98 @@ +/* + * 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.commitlog; + +import java.io.File; +import java.nio.ByteBuffer; +import java.util.Random; +import java.util.UUID; + +import com.google.common.collect.ImmutableMap; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.Config; +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.ParameterizedClass; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.Mutation; +import org.apache.cassandra.db.RowUpdateBuilder; +import org.apache.cassandra.db.compaction.CompactionManager; +import org.apache.cassandra.db.marshal.AsciiType; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.schema.KeyspaceParams; +import org.jboss.byteman.contrib.bmunit.BMRule; +import org.jboss.byteman.contrib.bmunit.BMUnitRunner; + +/** + * Since this test depends on byteman rules being setup during initialization, you shouldn't add tests to this class + */ +@RunWith(BMUnitRunner.class) +public class CommitlogShutdownTest +{ + private static final String KEYSPACE1 = "CommitLogTest"; + private static final String STANDARD1 = "Standard1"; + + private final static byte[] entropy = new byte[1024 * 256]; + + @Test + @BMRule(name = "Make removing commitlog segments slow", + targetClass = "CommitLogSegment", + targetMethod = "discard", + action = "Thread.sleep(50)") + public void testShutdownWithPendingTasks() throws Exception + { + new Random().nextBytes(entropy); + DatabaseDescriptor.setCommitLogCompression(new ParameterizedClass("LZ4Compressor", ImmutableMap.of())); + DatabaseDescriptor.setCommitLogSegmentSize(1); + DatabaseDescriptor.setCommitLogSync(Config.CommitLogSync.periodic); + DatabaseDescriptor.setCommitLogSyncPeriod(10 * 1000); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + KeyspaceParams.simple(1), + SchemaLoader.standardCFMD(KEYSPACE1, STANDARD1, 0, AsciiType.instance, BytesType.instance)); + + CompactionManager.instance.disableAutoCompaction(); + + CommitLog.instance.resetUnsafe(true); + ColumnFamilyStore cfs1 = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1); + + final Mutation m = new RowUpdateBuilder(cfs1.metadata, 0, "k") + .clustering("bytes") + .add("val", ByteBuffer.wrap(entropy)) + .build(); + + // force creating several commitlog files + for (int i = 0; i < 10; i++) + { + CommitLog.instance.add(m); + } + + // schedule discarding completed segments and immediately issue a shutdown + UUID cfid = m.getColumnFamilyIds().iterator().next(); + CommitLog.instance.discardCompletedSegments(cfid, ReplayPosition.NONE, CommitLog.instance.getContext()); + CommitLog.instance.shutdownBlocking(); + + // the shutdown should block until all logs except the currently active one and perhaps a new, empty one are gone + Assert.assertTrue(new File(CommitLog.instance.location).listFiles().length <= 2); + } +}