You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/03/01 10:39:14 UTC
[9/9] ignite git commit: IGNITE-2333: Review.
IGNITE-2333: Review.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1d6f974c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1d6f974c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1d6f974c
Branch: refs/heads/ignite-2333
Commit: 1d6f974c04dc0423a0f39306a4b32f813ab273b2
Parents: 93fbe50
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Mar 1 12:38:20 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Mar 1 12:38:20 2016 +0300
----------------------------------------------------------------------
.../dht/GridDhtPartitionTopologyImpl.java | 5 +-
.../util/StripedCompositeReadWriteLock.java | 164 ++++++-------------
2 files changed, 53 insertions(+), 116 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/1d6f974c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 6dc255b..b3786cd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -29,8 +29,6 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.cluster.ClusterNode;
@@ -103,7 +101,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
private final GridAtomicLong updateSeq = new GridAtomicLong(1);
/** Lock. */
- private final ReadWriteLock lock = new StripedCompositeReadWriteLock(16);
+ private final StripedCompositeReadWriteLock lock = new StripedCompositeReadWriteLock(16);
/** Partition update counter. */
private Map<Integer, Long> cntrMap = new HashMap<>();
@@ -1421,7 +1419,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
*/
private void consistencyCheck() {
if (CONSISTENCY_CHECK) {
-
if (node2part == null)
return;
http://git-wip-us.apache.org/repos/asf/ignite/blob/1d6f974c/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
index 4acc395..1b293fa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
@@ -19,8 +19,8 @@ package org.apache.ignite.internal.util;
import org.jetbrains.annotations.NotNull;
-import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@@ -34,24 +34,21 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
*/
public class StripedCompositeReadWriteLock implements ReadWriteLock {
- /**
- * Thread local index generator.
- */
+ /** Index generator. */
+ private static final AtomicInteger IDX_GEN = new AtomicInteger();
+
+ /** Index. */
private static final ThreadLocal<Integer> IDX = new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
- return ThreadLocalRandom.current().nextInt(100000);
+ return IDX_GEN.incrementAndGet();
}
};
- /**
- * Locks.
- */
+ /** Locks. */
private final ReentrantReadWriteLock[] locks;
- /**
- * Composite write lock.
- */
- private final CompositeWriteLock compositeWriteLock;
+ /** Composite write lock. */
+ private final WriteLock writeLock;
/**
* Creates a new instance with given concurrency level.
@@ -59,12 +56,12 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
* @param concurrencyLvl Number of internal read locks.
*/
public StripedCompositeReadWriteLock(int concurrencyLvl) {
- locks = new PaddedReentrantReadWriteLock[concurrencyLvl];
+ locks = new ReadLock[concurrencyLvl];
for (int i = 0; i < concurrencyLvl; i++)
- locks[i] = new PaddedReentrantReadWriteLock();
+ locks[i] = new ReadLock();
- compositeWriteLock = new CompositeWriteLock();
+ writeLock = new WriteLock();
}
/** {@inheritDoc} */
@@ -76,145 +73,88 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
/** {@inheritDoc} */
@NotNull @Override public Lock writeLock() {
- return compositeWriteLock;
+ return writeLock;
}
/**
- * {@inheritDoc}
- *
- * Compared to {@link ReentrantReadWriteLock}, this class contains padding to ensure that different instances will
- * always be located in different CPU cache lines.
+ * Read lock.
*/
- private static class PaddedReentrantReadWriteLock extends ReentrantReadWriteLock {
-
- /**
- *
- */
+ @SuppressWarnings("unused")
+ private static class ReadLock extends ReentrantReadWriteLock {
+ /** */
private static final long serialVersionUID = 0L;
- /**
- * Padding.
- */
+ /** Padding. */
private long p0, p1, p2, p3, p4, p5, p6, p7;
}
/**
- * {@inheritDoc}
- *
- * Methods of this class will lock all {@link #locks}.
+ * Write lock.
*/
- private class CompositeWriteLock implements Lock {
-
+ private class WriteLock implements Lock {
/** {@inheritDoc} */
@Override public void lock() {
try {
- lock(false);
+ lock0(false);
}
- catch (InterruptedException e) {
- // This should never happen.
- throw new RuntimeException(e);
+ catch (InterruptedException ignore) {
+ assert false : "Should never happen";
}
}
/** {@inheritDoc} */
@Override public void lockInterruptibly() throws InterruptedException {
- lock(true);
+ lock0(true);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unlock() {
+ unlock0(locks.length - 1);
}
/**
- * @param interruptibly true if {@link Thread#interrupt()} should be considered.
+ * Internal lock routine.
+ *
+ * @param canInterrupt Whether to acquire the lock interruptibly.
* @throws InterruptedException
*/
- private void lock(boolean interruptibly) throws InterruptedException {
+ private void lock0(boolean canInterrupt) throws InterruptedException {
int i = 0;
+
try {
- for (; i < locks.length; i++)
- if (interruptibly)
+ for (; i < locks.length; i++) {
+ if (canInterrupt)
locks[i].writeLock().lockInterruptibly();
else
locks[i].writeLock().lock();
+ }
}
- catch (Throwable e) {
- for (i--; i >= 0; i--)
- locks[i].writeLock().unlock();
+ catch (InterruptedException e) {
+ unlock0(i - 1);
throw e;
}
}
- /** {@inheritDoc} */
- @Override public boolean tryLock() {
- int i = 0;
-
- boolean unlock = false;
-
- try {
- for (; i < locks.length; i++)
- if (!locks[i].writeLock().tryLock()) {
- unlock = true;
- break;
- }
- }
- catch (Throwable e) {
- for (i--; i >= 0; i--)
- locks[i].writeLock().unlock();
-
- throw e;
- }
-
- if (unlock) {
- for (i--; i >= 0; i--)
- locks[i].writeLock().unlock();
-
- return false;
- }
-
- return true;
+ /**
+ * Internal unlock routine.
+ *
+ * @param fromIdx Start index.
+ */
+ private void unlock0(int fromIdx) {
+ for (int i = fromIdx; i >= 0; i--)
+ locks[i].writeLock().unlock();
}
/** {@inheritDoc} */
- @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
- long timeLeft = unit.convert(time, TimeUnit.NANOSECONDS);
-
- long prevTime = System.nanoTime();
-
- int i = 0;
-
- boolean unlock = false;
-
- try {
- for (; i < locks.length; i++) {
- if (timeLeft < 0 || !locks[i].writeLock().tryLock(timeLeft, TimeUnit.NANOSECONDS)) {
- unlock = true;
- break;
- }
-
- long currentTime = System.nanoTime();
- timeLeft -= (currentTime - prevTime);
- prevTime = currentTime;
- }
- }
- catch (Throwable e) {
- for (i--; i >= 0; i--)
- locks[i].writeLock().unlock();
-
- throw e;
- }
-
- if (unlock) {
- for (i--; i >= 0; i--)
- locks[i].writeLock().unlock();
-
- return false;
- }
-
- return true;
+ @Override public boolean tryLock() {
+ throw new UnsupportedOperationException();
}
/** {@inheritDoc} */
- @Override public void unlock() {
- for (int i = locks.length - 1; i >= 0; i--)
- locks[i].writeLock().unlock();
+ @SuppressWarnings("NullableProblems")
+ @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
+ throw new UnsupportedOperationException();
}
/** {@inheritDoc} */