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} */