You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ab...@apache.org on 2016/02/03 03:14:50 UTC
[2/5] incubator-geode git commit: GEODE-894: Remove unused
concurrency utilities
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/743dce22/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/locks/ReentrantReadWriteWriteShareLockJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/locks/ReentrantReadWriteWriteShareLockJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/locks/ReentrantReadWriteWriteShareLockJUnitTest.java
deleted file mode 100644
index 1781ed3..0000000
--- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/locks/ReentrantReadWriteWriteShareLockJUnitTest.java
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * 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 com.gemstone.gemfire.distributed.internal.locks;
-
-import static org.junit.Assert.*;
-
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import com.gemstone.gemfire.InternalGemFireError;
-import com.gemstone.gemfire.internal.cache.locks.ReentrantReadWriteWriteShareLock;
-import com.gemstone.gemfire.test.junit.categories.UnitTest;
-
-@Category(UnitTest.class)
-public class ReentrantReadWriteWriteShareLockJUnitTest {
-
- // Neeraj: These variables are actually in
- // ReentrantReadWriteWriteShareLock.CASSync class
- // as static fields. But are not exposed so copied here.
- static final int READ_SHARED_BITS = 16;
-
- static final int WRITE_EXCLUSIVE_BITS = (Integer.SIZE - READ_SHARED_BITS) / 2;
-
- static final int WRITE_SHARED_BITS = WRITE_EXCLUSIVE_BITS;
-
- static final int READ_SHARED_MASK = (1 << READ_SHARED_BITS) - 1;
-
- static final int MAX_READ_SHARED_COUNT = READ_SHARED_MASK;
-
- static final int EXCLUSIVE_ONE = (1 << (READ_SHARED_BITS + WRITE_SHARED_BITS));
-
- static final int WRITE_SHARE_ONE = (1 << READ_SHARED_BITS);
-
- static final int MAX_WRITE_SHARED_COUNT = (1 << WRITE_SHARED_BITS) - 1;
-
- static final int MAX_EXCLUSIVE_COUNT = MAX_WRITE_SHARED_COUNT;
-
- @Test
- public void testMaxReadsMaxWritesAndMaxExclusive() throws Exception {
- Object id = new String("id");
- ReentrantReadWriteWriteShareLock lock = new ReentrantReadWriteWriteShareLock(
- true);
-
- // Take max possible read locks
- for (int i = 0; i < MAX_READ_SHARED_COUNT; i++) {
- assertTrue(lock.attemptReadLock(0));
- }
- try {
- lock.attemptReadLock(0);
- fail("attempt to acquire read lock after max possible read: "
- + MAX_READ_SHARED_COUNT + " should have failed");
- } catch (InternalGemFireError e) {
- // ignore expected exception
- }
-
- // Now release all the
- // Take max possible read locks
- for (int i = 0; i < MAX_READ_SHARED_COUNT; i++) {
- lock.releaseReadLock(false);
- }
- // Attempt to again release a read lock will throw
- // IllegalMonitorStateException
- try {
- lock.releaseReadLock(true);
- fail("attempt to release read lock when read count is 0 should have failed");
- } catch (IllegalMonitorStateException e) {
- // ignore expected exception
- }
-
- // Take max possible write share locks
- for (int i = 0; i < MAX_WRITE_SHARED_COUNT; i++) {
- assertTrue(lock.attemptWriteShareLock(0, id));
- }
- try {
- lock.attemptWriteShareLock(0, id);
- fail("attempt to acquire write share lock after max possible write share: "
- + MAX_WRITE_SHARED_COUNT + " should have failed");
- } catch (InternalGemFireError e) {
- // ignore expected exception
- }
-
- // Now release the write share lock
- lock.releaseWriteShareLock(true, id);
- // Attempt to again release a write share lock should throw
- // IllegalMonitorStateException
- try {
- lock.releaseWriteShareLock(false, id);
- fail("attempt to release write share lock when share counter is reset should have failed");
- } catch (IllegalMonitorStateException e) {
- // ignore expected exception
- }
-
- // Take max possible write ex locks
- for (int i = 0; i < MAX_EXCLUSIVE_COUNT; i++) {
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
- }
- try {
- lock.attemptWriteExclusiveLock(0, id);
- fail("attempt to acquire write ex lock after max possible write ex: "
- + MAX_EXCLUSIVE_COUNT + " should have failed");
- } catch (InternalGemFireError e) {
- // ignore expected exception
- }
-
- // Now release the write ex lock
- lock.releaseWriteExclusiveLock(true, id);
- // Attempt to again release a write ex lock will throw
- // IllegalMonitorStateException
- try {
- lock.releaseWriteExclusiveLock(true, id);
- fail("attempt to release write share lock when share counter is reset should have failed");
- } catch (IllegalMonitorStateException e) {
- // ignore expected exception
- }
- }
-
- @Test
- public void testLockBehaviourWithSameThread() throws Exception {
- Object id = new String("id");
- ReentrantReadWriteWriteShareLock lock = new ReentrantReadWriteWriteShareLock(
- true);
- assertTrue(lock.attemptReadLock(0));
- assertTrue(lock.attemptWriteShareLock(0, id));
- assertFalse(lock.attemptWriteExclusiveLock(0, id));
-
- lock.releaseReadLock(true);
- lock.releaseWriteShareLock(true, id);
-
- assertTrue(lock.attemptWriteShareLock(0, id));
- assertTrue(lock.attemptReadLock(0));
- assertFalse(lock.attemptWriteExclusiveLock(0, "newid"));
- assertFalse(lock.attemptWriteExclusiveLock(0, id));
- lock.releaseReadLock(false);
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
-
- lock.releaseWriteExclusiveLock(false, id);
-
- // try exclusive with releaseAll
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
- assertFalse(lock.attemptReadLock(0));
- assertFalse(lock.attemptWriteShareLock(0, id));
- assertFalse(lock.attemptWriteExclusiveLock(0, "newid"));
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
-
- lock.releaseWriteExclusiveLock(true, id);
- try {
- lock.releaseWriteExclusiveLock(true, id);
- fail("expected IllegalMonitorStateException");
- } catch (IllegalMonitorStateException ex) {
- // got expected exception
- }
- try {
- lock.releaseWriteExclusiveLock(false, id);
- fail("expected IllegalMonitorStateException");
- } catch (IllegalMonitorStateException ex) {
- // got expected exception
- }
-
- // try exclusive without releaseAll
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
- assertFalse(lock.attemptReadLock(0));
- assertFalse(lock.attemptWriteShareLock(0, id));
- assertFalse(lock.attemptWriteExclusiveLock(0, "newid"));
- assertTrue(lock.attemptWriteExclusiveLock(0, id));
-
- lock.releaseWriteExclusiveLock(false, id);
- lock.releaseWriteExclusiveLock(false, id);
- try {
- lock.releaseWriteExclusiveLock(false, id);
- fail("expected IllegalMonitorStateException");
- } catch (IllegalMonitorStateException ex) {
- // got expected exception
- }
- try {
- lock.releaseWriteExclusiveLock(true, id);
- fail("expected IllegalMonitorStateException");
- } catch (IllegalMonitorStateException ex) {
- // got expected exception
- }
- }
-
- @Test
- public void testLockBehaviourWithDIfferentThread() throws Exception {
- Object id = new String("id");
- ReentrantReadWriteWriteShareLock lock = new ReentrantReadWriteWriteShareLock(
- true);
- assertTrue(lock.attemptWriteShareLock(0, id));
-
- Locker locker = new Locker(lock, id, true, true, "R:S:E", "P:P:P");
- Thread t = new Thread(locker);
- t.start();
- t.join();
-
- // lock again as it would have been released
- assertTrue(lock.attemptWriteShareLock(0, id));
- locker = new Locker(lock, id, false, true, "R:S:E", "P:F:F");
- Thread t1 = new Thread(locker);
- t1.start();
- t1.join();
- }
-
- private static volatile boolean failed = false;
-
- @Ignore
- @Test
- public void testLockBehaviourQueue() throws Exception {
- Object id = new String("id");
- ReentrantReadWriteWriteShareLock lock = new ReentrantReadWriteWriteShareLock(
- true);
- assertTrue(lock.attemptWriteShareLock(0, id));
- assertTrue(lock.attemptReadLock(0));
- int shareCnt = 0;
- for (int i = 0; i < MAX_READ_SHARED_COUNT * 5; i++) {
- if (i % MAX_WRITE_SHARED_COUNT == 0) {
- // if (shareCnt == MAX_WRITE_SHARED_COUNT) {
- // continue;
- // }
- // shareCnt++;
- // Thread t = new Thread(new WriteShareLocker(lock, id));
- // t.start();
- }
- else {
- Thread t = new Thread(new ReadLocker(lock));
- t.start();
- }
- }
- Thread.sleep(5000);
- lock.releaseWriteShareLock(true, id);
- try {
- lock.releaseWriteShareLock(false, id);
- fail("write share release clears the write bits, so second attempt should fail");
- } catch (IllegalMonitorStateException e) {
- // ignore the exception as expected
- }
- assertFalse(failed);
- }
-
- private static class ReadLocker implements Runnable {
-
- private long sleepMillisAfterTakingLock = 2;
-
- private long waitMillisForTakingLock = 10;
-
- private ReentrantReadWriteWriteShareLock l;
-
- public ReadLocker(ReentrantReadWriteWriteShareLock lock) {
- this.l = lock;
- }
-
- public void run() {
- try {
- if (this.l.attemptReadLock(this.waitMillisForTakingLock)) {
- Thread.sleep(this.sleepMillisAfterTakingLock);
- }
- else {
- failed = true;
- }
- } catch (InterruptedException e) {
- fail("did not expect exception in taking read locks");
- }
- this.l.releaseReadLock(false);
- }
- }
-
- private static class WriteShareLocker implements Runnable {
-
- private long sleepMillisAfterTakingLock = 3;
-
- private long waitMillisForTakingLock = 6;
-
- private ReentrantReadWriteWriteShareLock l;
-
- private Object id;
-
- public WriteShareLocker(ReentrantReadWriteWriteShareLock lock, Object id) {
- this.l = lock;
- this.id = id;
- }
-
- public void run() {
- try {
- if (this.l.attemptWriteShareLock(waitMillisForTakingLock, this.id)) {
- failed = true;
- }
- } catch (InterruptedException e) {
- fail("did not expect exception in taking read locks");
- }
- // this.l.releaseReadLock();
- }
- }
-
- private static class Locker implements Runnable {
- private ReentrantReadWriteWriteShareLock l;
-
- private Object id;
-
- private boolean tryWithSameId;
-
- private String[] opsArr;
-
- private String[] resArr;
-
- private boolean releasing;
-
- public Locker(ReentrantReadWriteWriteShareLock lock, Object id,
- boolean sameId, boolean rel, String ops, String results) {
- this.l = lock;
- this.id = id;
- this.tryWithSameId = sameId;
- opsArr = ops.split(":");
- this.releasing = rel;
- this.resArr = results.split(":");
- }
-
- public void run() {
- try {
- for (int i = 0; i < this.opsArr.length; i++) {
- char ch = this.opsArr[i].charAt(0);
- boolean shouldPass = this.resArr[i].equals("P") ? true : false;
- switch (ch) {
- case 'R':
- if (shouldPass) {
- assertTrue(this.l.attemptReadLock(0));
- }
- else {
- assertFalse(this.l.attemptReadLock(0));
- }
- if (this.releasing && shouldPass) {
- this.l.releaseReadLock(false);
- }
- break;
-
- case 'S':
-
- if (shouldPass) {
- if (this.tryWithSameId) {
- assertTrue(this.l.attemptWriteShareLock(0, this.id));
- }
- else {
- assertTrue(this.l.attemptWriteShareLock(0, "someId"));
- }
- }
- else {
- assertFalse(this.l.attemptWriteShareLock(0, "someId"));
- }
- if (this.releasing && shouldPass) {
- this.l.releaseWriteShareLock(true, id);
- }
- break;
-
- case 'E':
-
- if (shouldPass) {
- if (this.tryWithSameId) {
- assertTrue(this.l.attemptWriteExclusiveLock(0, this.id));
- }
- else {
- assertTrue(this.l.attemptWriteExclusiveLock(0, "someid"));
- }
- }
- else {
- assertFalse(this.l.attemptWriteExclusiveLock(0, "someid"));
- }
- if (this.releasing && shouldPass) {
- this.l.releaseWriteExclusiveLock(true, id);
- }
- break;
-
- default:
- fail("not expected to come to default case");
- }
- }
- } catch (Exception e) {
- fail("not expected to get exception");
- }
- }
- }
-
- private static final class SharedStruct {
-
- long longVal;
-
- void init(long val) {
- this.longVal = val;
- }
- }
-
- private static final SharedStruct value = new SharedStruct();
-
- private static AtomicInteger tx1success = new AtomicInteger(0);
-
- @Ignore
- @Test
- public void testTransactionalBehaviour() throws Exception {
- ReentrantReadWriteWriteShareLock txlock = new ReentrantReadWriteWriteShareLock(true);
- ReadWriteLock readFailLock = new ReentrantReadWriteLock();
- boolean readFails = false;
-
- value.init(0);
-
- // 5 increments
- Runnable Tx1 = new Runnable() {
- private long startVal;
- private long thisTxVal;
- private Object id;
-
- public void run() {
- this.start();
- if (this.commit()) {
- tx1success.incrementAndGet();
- }
- }
-
- private boolean commit() {
- for(int i=0; i< 10; i++) {
-
- }
- return false;
- }
-
- private void start() {
- this.id = new Object();
- this.startVal = this.thisTxVal = value.longVal;
- }
- };
-
- Runnable writeTask = new Runnable() {
- public void run() {
- Object id = new Object();
- }
- };
-
- Runnable writeShareTask = new Runnable() {
- public void run() {
- }
- };
- }
-
-}