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 <[email protected]> Authored: Tue Mar 1 12:38:20 2016 +0300 Committer: vozerov-gridgain <[email protected]> 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} */
