You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2015/01/28 23:51:20 UTC
[3/5] cassandra git commit: ninja add unit test for 7882
ninja add unit test for 7882
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/71ccc87a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/71ccc87a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/71ccc87a
Branch: refs/heads/trunk
Commit: 71ccc87a79d161cdf5cf219a276f5bd7313f9c80
Parents: 7cd1102
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Wed Jan 28 22:50:13 2015 +0000
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Wed Jan 28 22:50:13 2015 +0000
----------------------------------------------------------------------
.../utils/memory/NativeAllocatorTest.java | 111 +++++++++++++++++++
1 file changed, 111 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/71ccc87a/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java b/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
new file mode 100644
index 0000000..83d6c0c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
@@ -0,0 +1,111 @@
+/*
+* 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.utils.memory;
+
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.junit.Test;
+
+import junit.framework.Assert;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+
+public class NativeAllocatorTest
+{
+
+ @Test
+ public void testBookKeeping() throws ExecutionException, InterruptedException
+ {
+ {
+ final ScheduledExecutorService exec = Executors.newScheduledThreadPool(2);
+ final OpOrder order = new OpOrder();
+ final OpOrder.Group group = order.start();
+ final CountDownLatch canClean = new CountDownLatch(1);
+ final CountDownLatch isClean = new CountDownLatch(1);
+ final AtomicReference<NativeAllocator> allocatorRef = new AtomicReference<>();
+ final AtomicReference<OpOrder.Barrier> barrier = new AtomicReference<>();
+ final NativeAllocator allocator = new NativeAllocator(new NativePool(1, 100, 0.75f, new Runnable()
+ {
+ public void run()
+ {
+ try
+ {
+ canClean.await();
+ }
+ catch (InterruptedException e)
+ {
+ throw new AssertionError();
+ }
+ if (isClean.getCount() > 0)
+ {
+ allocatorRef.get().offHeap().release(80);
+ isClean.countDown();
+ }
+ }
+ }));
+ allocatorRef.set(allocator);
+ final Runnable markBlocking = new Runnable()
+ {
+
+ public void run()
+ {
+ barrier.set(order.newBarrier());
+ barrier.get().issue();
+ barrier.get().markBlocking();
+ }
+ };
+ final Runnable run = new Runnable()
+ {
+ public void run()
+ {
+ // allocate normal, check accounted and not cleaned
+ allocator.allocate(10, group);
+ Assert.assertEquals(10, allocator.offHeap().owns());
+ Uninterruptibles.sleepUninterruptibly(10L, TimeUnit.MILLISECONDS);
+ Assert.assertEquals(1, isClean.getCount());
+
+ // allocate above watermark, check cleaned
+ allocator.allocate(70, group);
+ Assert.assertEquals(80, allocator.offHeap().owns());
+ canClean.countDown();
+ try
+ {
+ isClean.await(10L, TimeUnit.MILLISECONDS);
+ }
+ catch (InterruptedException e)
+ {
+ throw new AssertionError();
+ }
+ Assert.assertEquals(0, isClean.getCount());
+ Assert.assertEquals(0, allocator.offHeap().owns());
+
+ // allocate above limit, check we block until "marked blocking"
+ exec.schedule(markBlocking, 10L, TimeUnit.MILLISECONDS);
+ allocator.allocate(110, group);
+ Assert.assertNotNull(barrier.get());
+ Assert.assertEquals(110, allocator.offHeap().owns());
+ }
+ };
+ exec.submit(run).get();
+ }
+ }
+
+}