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:06 UTC

[1/9] ignite git commit: ignite-2333 : StripedCompositeReadWriteLock.

Repository: ignite
Updated Branches:
  refs/heads/ignite-2333 [created] 1d6f974c0


ignite-2333 : StripedCompositeReadWriteLock.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3a15b951
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3a15b951
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3a15b951

Branch: refs/heads/ignite-2333
Commit: 3a15b9514209d2f334985393e38bcadea733205b
Parents: d844e95
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Mon Feb 8 15:52:42 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Mon Feb 8 15:52:42 2016 +0300

----------------------------------------------------------------------
 .../dht/GridDhtPartitionTopologyImpl.java       |  14 ++-
 .../util/StripedCompositeReadWriteLock.java     | 109 +++++++++++++++++++
 2 files changed, 117 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3a15b951/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 0e579ac..2772276 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,6 +29,7 @@ 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;
@@ -44,6 +45,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.Gri
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture;
 import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.GridAtomicLong;
+import org.apache.ignite.internal.util.StripedCompositeReadWriteLock;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.X;
@@ -101,7 +103,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
     private final GridAtomicLong updateSeq = new GridAtomicLong(1);
 
     /** Lock. */
-    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+    private final ReadWriteLock lock = new StripedCompositeReadWriteLock(16);
 
     /** Partition update counter. */
     private Map<Integer, Long> cntrMap = new HashMap<>();
@@ -1091,7 +1093,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      * @return Checks if any of the local partitions need to be evicted.
      */
     private boolean checkEvictions(long updateSeq) {
-        assert lock.isWriteLockedByCurrentThread();
+//        assert lock.isWriteLockedByCurrentThread();
 
         boolean changed = false;
 
@@ -1167,7 +1169,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     @SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
     private void updateLocal(int p, UUID nodeId, GridDhtPartitionState state, long updateSeq) {
-        assert lock.isWriteLockedByCurrentThread();
+//        assert lock.isWriteLockedByCurrentThread();
         assert nodeId.equals(cctx.nodeId());
 
         // In case if node joins, get topology at the time of joining node.
@@ -1221,7 +1223,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     private void removeNode(UUID nodeId) {
         assert nodeId != null;
-        assert lock.writeLock().isHeldByCurrentThread();
+//        assert lock.writeLock().isHeldByCurrentThread();
 
         ClusterNode oldest = CU.oldestAliveCacheServerNode(cctx.shared(), topVer);
 
@@ -1286,7 +1288,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
     /** {@inheritDoc} */
     @Override public void onEvicted(GridDhtLocalPartition part, boolean updateSeq) {
-        assert updateSeq || lock.isWriteLockedByCurrentThread();
+//        assert updateSeq || lock.isWriteLockedByCurrentThread();
 
         lock.writeLock().lock();
 
@@ -1420,7 +1422,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     private void consistencyCheck() {
         if (CONSISTENCY_CHECK) {
-            assert lock.writeLock().isHeldByCurrentThread();
+//            assert lock.writeLock().isHeldByCurrentThread();
 
             if (node2part == null)
                 return;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a15b951/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
new file mode 100644
index 0000000..db46ae7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
@@ -0,0 +1,109 @@
+package org.apache.ignite.internal.util;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * @author Ilya Lantukh
+ */
+public class StripedCompositeReadWriteLock implements ReadWriteLock {
+
+    private final ReadWriteLock[] locks;
+
+    private final CompositeWriteLock compositeWriteLock;
+
+    public StripedCompositeReadWriteLock(int concurrencyLevel) {
+        locks = new ReadWriteLock[concurrencyLevel];
+
+        for (int i = 0; i < concurrencyLevel; i++)
+            locks[i] = new ReentrantReadWriteLock();
+
+        compositeWriteLock = new CompositeWriteLock();
+    }
+
+    @NotNull @Override public Lock readLock() {
+        int idx = (int)Thread.currentThread().getId() % locks.length;
+        return locks[idx].readLock();
+    }
+
+    @NotNull @Override public Lock writeLock() {
+        return compositeWriteLock;
+    }
+
+    private class CompositeWriteLock implements Lock {
+
+        @Override public void lock() {
+            int i = 0;
+            try {
+                for (; i < locks.length; i++)
+                    locks[i].writeLock().lock();
+            }
+            catch (Throwable e) {
+                for (i--; i >= 0; i--)
+                    locks[i].writeLock().unlock();
+
+                throw e;
+            }
+        }
+
+        @Override public void lockInterruptibly() throws InterruptedException {
+            int i = 0;
+            try {
+                for (; i < locks.length; i++)
+                    locks[i].writeLock().lockInterruptibly();
+            }
+            catch (Throwable e) {
+                for (i--; i >= 0; i--)
+                    locks[i].writeLock().unlock();
+
+                throw e;
+            }
+        }
+
+        @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;
+        }
+
+        @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
+            return false;
+        }
+
+        @Override public void unlock() {
+            for (int i = locks.length - 1; i >= 0; i--)
+                locks[i].writeLock().unlock();
+        }
+
+        @NotNull @Override public Condition newCondition() {
+            return null;
+        }
+    }
+}


[6/9] ignite git commit: ignite-2333 : Reverted changes in index calculation.

Posted by vo...@apache.org.
ignite-2333 : Reverted changes in index calculation.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/46f3f6c0
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/46f3f6c0
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/46f3f6c0

Branch: refs/heads/ignite-2333
Commit: 46f3f6c068ff7815c3cb0305a5ba3b7e4191b4e0
Parents: 13b3f4b
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Wed Feb 24 12:15:19 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Wed Feb 24 12:15:19 2016 +0300

----------------------------------------------------------------------
 .../internal/util/StripedCompositeReadWriteLock.java | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/46f3f6c0/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 1a8ce2e..c1e32f5 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
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.util;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -45,18 +44,6 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
     private final CompositeWriteLock compositeWriteLock;
 
     /**
-     * Atomic field updated for {@link #counter}.
-     */
-    private static final AtomicIntegerFieldUpdater<StripedCompositeReadWriteLock> COUNTER_UPD =
-        AtomicIntegerFieldUpdater.newUpdater(StripedCompositeReadWriteLock.class, "counter");
-
-    /**
-     * Counter of {@link #readLock()} calls.
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    private volatile int counter = 0;
-
-    /**
      * Creates a new instance with given concurrency level.
      *
      * @param concurrencyLvl Number of internal read locks.
@@ -72,7 +59,7 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
     /** {@inheritDoc} */
     @NotNull @Override public Lock readLock() {
-        int idx = Math.abs(COUNTER_UPD.getAndIncrement(this) % locks.length);
+        int idx = (int) Thread.currentThread().getId() % locks.length;
 
         return locks[idx].readLock();
     }


[7/9] ignite git commit: ignite-2333 : Improved index calculation logic.

Posted by vo...@apache.org.
ignite-2333 : Improved index calculation logic.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/dfd026ca
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/dfd026ca
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/dfd026ca

Branch: refs/heads/ignite-2333
Commit: dfd026ca7fc31fd3cda08e8f2052118c697ef190
Parents: 46f3f6c
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Thu Feb 25 11:50:13 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Thu Feb 25 11:50:13 2016 +0300

----------------------------------------------------------------------
 .../internal/util/StripedCompositeReadWriteLock.java | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/dfd026ca/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 c1e32f5..4acc395 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,6 +19,7 @@ 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.locks.Condition;
 import java.util.concurrent.locks.Lock;
@@ -34,6 +35,15 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
     /**
+     * Thread local index generator.
+     */
+    private static final ThreadLocal<Integer> IDX = new ThreadLocal<Integer>() {
+        @Override protected Integer initialValue() {
+            return ThreadLocalRandom.current().nextInt(100000);
+        }
+    };
+
+    /**
      * Locks.
      */
     private final ReentrantReadWriteLock[] locks;
@@ -59,7 +69,7 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
     /** {@inheritDoc} */
     @NotNull @Override public Lock readLock() {
-        int idx = (int) Thread.currentThread().getId() % locks.length;
+        int idx = IDX.get() % locks.length;
 
         return locks[idx].readLock();
     }
@@ -99,7 +109,8 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
         @Override public void lock() {
             try {
                 lock(false);
-            } catch (InterruptedException e) {
+            }
+            catch (InterruptedException e) {
                 // This should never happen.
                 throw new RuntimeException(e);
             }


[2/9] ignite git commit: ignite-2333 : Minors.

Posted by vo...@apache.org.
ignite-2333 : Minors.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b96539de
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b96539de
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b96539de

Branch: refs/heads/ignite-2333
Commit: b96539de3a1db9fb77bbdab968ef30d92ef04594
Parents: 3a15b95
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Mon Feb 8 16:01:56 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Mon Feb 8 16:01:56 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/util/StripedCompositeReadWriteLock.java      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b96539de/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 db46ae7..cf5e762 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
@@ -94,7 +94,7 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
         }
 
         @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
-            return false;
+            throw new RuntimeException("Not supported");
         }
 
         @Override public void unlock() {
@@ -103,7 +103,7 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
         }
 
         @NotNull @Override public Condition newCondition() {
-            return null;
+            throw new RuntimeException("Not supported");
         }
     }
 }


[3/9] ignite git commit: ignite-2333 : Padding.

Posted by vo...@apache.org.
ignite-2333 : Padding.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/571579f9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/571579f9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/571579f9

Branch: refs/heads/ignite-2333
Commit: 571579f91c3cd94fff4f67ba78dfbf0221dd127f
Parents: b96539d
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Mon Feb 8 16:28:05 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Mon Feb 8 16:28:05 2016 +0300

----------------------------------------------------------------------
 .../distributed/dht/GridDhtPartitionTopologyImpl.java     |  7 -------
 .../internal/util/StripedCompositeReadWriteLock.java      | 10 +++++++---
 2 files changed, 7 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/571579f9/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 2772276..73a68ba 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
@@ -1093,8 +1093,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      * @return Checks if any of the local partitions need to be evicted.
      */
     private boolean checkEvictions(long updateSeq) {
-//        assert lock.isWriteLockedByCurrentThread();
-
         boolean changed = false;
 
         UUID locId = cctx.nodeId();
@@ -1169,7 +1167,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     @SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
     private void updateLocal(int p, UUID nodeId, GridDhtPartitionState state, long updateSeq) {
-//        assert lock.isWriteLockedByCurrentThread();
         assert nodeId.equals(cctx.nodeId());
 
         // In case if node joins, get topology at the time of joining node.
@@ -1223,7 +1220,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     private void removeNode(UUID nodeId) {
         assert nodeId != null;
-//        assert lock.writeLock().isHeldByCurrentThread();
 
         ClusterNode oldest = CU.oldestAliveCacheServerNode(cctx.shared(), topVer);
 
@@ -1288,8 +1284,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
     /** {@inheritDoc} */
     @Override public void onEvicted(GridDhtLocalPartition part, boolean updateSeq) {
-//        assert updateSeq || lock.isWriteLockedByCurrentThread();
-
         lock.writeLock().lock();
 
         try {
@@ -1422,7 +1416,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
      */
     private void consistencyCheck() {
         if (CONSISTENCY_CHECK) {
-//            assert lock.writeLock().isHeldByCurrentThread();
 
             if (node2part == null)
                 return;

http://git-wip-us.apache.org/repos/asf/ignite/blob/571579f9/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 cf5e762..1880f0f 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
@@ -13,15 +13,15 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
  */
 public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
-    private final ReadWriteLock[] locks;
+    private final PaddedReentrantReadWriteLock[] locks;
 
     private final CompositeWriteLock compositeWriteLock;
 
     public StripedCompositeReadWriteLock(int concurrencyLevel) {
-        locks = new ReadWriteLock[concurrencyLevel];
+        locks = new PaddedReentrantReadWriteLock[concurrencyLevel];
 
         for (int i = 0; i < concurrencyLevel; i++)
-            locks[i] = new ReentrantReadWriteLock();
+            locks[i] = new PaddedReentrantReadWriteLock();
 
         compositeWriteLock = new CompositeWriteLock();
     }
@@ -35,6 +35,10 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
         return compositeWriteLock;
     }
 
+    private static class PaddedReentrantReadWriteLock extends ReentrantReadWriteLock {
+        long p0, p1, p2, p3, p4, p5, p6, p7;
+    }
+
     private class CompositeWriteLock implements Lock {
 
         @Override public void lock() {


[5/9] ignite git commit: ignite-2333 : Fixed review remarks.

Posted by vo...@apache.org.
ignite-2333 : Fixed review remarks.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/13b3f4b9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/13b3f4b9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/13b3f4b9

Branch: refs/heads/ignite-2333
Commit: 13b3f4b961c2822cdfc70e1259d0f238d688ab57
Parents: f84d023
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Wed Feb 24 11:42:15 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Wed Feb 24 11:42:15 2016 +0300

----------------------------------------------------------------------
 .../util/StripedCompositeReadWriteLock.java     | 149 ++++++++++++++++---
 1 file changed, 130 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/13b3f4b9/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 ae95f6c..1a8ce2e 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
@@ -1,54 +1,140 @@
+/*
+ * 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.ignite.internal.util;
 
 import org.jetbrains.annotations.NotNull;
 
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
- * @author Ilya Lantukh
+ * ReadWriteLock with striping mechanics.
+ * Compared to {@link ReentrantReadWriteLock} it has slightly improved performance of {@link ReadWriteLock#readLock()}
+ * operations at the cost of {@link ReadWriteLock#writeLock()} operations and memory consumption.
+ * It also supports reentrancy semantics like {@link ReentrantReadWriteLock}.
  */
 public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
-    private final PaddedReentrantReadWriteLock[] locks;
+    /**
+     * Locks.
+     */
+    private final ReentrantReadWriteLock[] locks;
 
+    /**
+     * Composite write lock.
+     */
     private final CompositeWriteLock compositeWriteLock;
 
-    public StripedCompositeReadWriteLock(int concurrencyLevel) {
-        locks = new PaddedReentrantReadWriteLock[concurrencyLevel];
-
-        for (int i = 0; i < concurrencyLevel; i++)
+    /**
+     * Atomic field updated for {@link #counter}.
+     */
+    private static final AtomicIntegerFieldUpdater<StripedCompositeReadWriteLock> COUNTER_UPD =
+        AtomicIntegerFieldUpdater.newUpdater(StripedCompositeReadWriteLock.class, "counter");
+
+    /**
+     * Counter of {@link #readLock()} calls.
+     */
+    @SuppressWarnings("UnusedDeclaration")
+    private volatile int counter = 0;
+
+    /**
+     * Creates a new instance with given concurrency level.
+     *
+     * @param concurrencyLvl Number of internal read locks.
+     */
+    public StripedCompositeReadWriteLock(int concurrencyLvl) {
+        locks = new PaddedReentrantReadWriteLock[concurrencyLvl];
+
+        for (int i = 0; i < concurrencyLvl; i++)
             locks[i] = new PaddedReentrantReadWriteLock();
 
         compositeWriteLock = new CompositeWriteLock();
     }
 
+    /** {@inheritDoc} */
     @NotNull @Override public Lock readLock() {
-        int idx = (int)Thread.currentThread().getId() % locks.length;
+        int idx = Math.abs(COUNTER_UPD.getAndIncrement(this) % locks.length);
+
         return locks[idx].readLock();
     }
 
+    /** {@inheritDoc} */
     @NotNull @Override public Lock writeLock() {
         return compositeWriteLock;
     }
 
+    /**
+     * {@inheritDoc}
+     *
+     * Compared to {@link ReentrantReadWriteLock}, this class contains padding to ensure that different instances will
+     * always be located in different CPU cache lines.
+     */
     private static class PaddedReentrantReadWriteLock extends ReentrantReadWriteLock {
 
+        /**
+         *
+         */
         private static final long serialVersionUID = 0L;
 
-        long p0, p1, p2, p3, p4, p5, p6, p7;
+        /**
+         * Padding.
+         */
+        private long p0, p1, p2, p3, p4, p5, p6, p7;
     }
 
+    /**
+     * {@inheritDoc}
+     *
+     * Methods of this class will lock all {@link #locks}.
+     */
     private class CompositeWriteLock implements Lock {
 
+        /** {@inheritDoc} */
         @Override public void lock() {
+            try {
+                lock(false);
+            } catch (InterruptedException e) {
+                // This should never happen.
+                throw new RuntimeException(e);
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public void lockInterruptibly() throws InterruptedException {
+            lock(true);
+        }
+
+        /**
+         * @param interruptibly true if {@link Thread#interrupt()} should be considered.
+         * @throws InterruptedException
+         */
+        private void lock(boolean interruptibly) throws InterruptedException {
             int i = 0;
             try {
                 for (; i < locks.length; i++)
-                    locks[i].writeLock().lock();
+                    if (interruptibly)
+                        locks[i].writeLock().lockInterruptibly();
+                    else
+                        locks[i].writeLock().lock();
             }
             catch (Throwable e) {
                 for (i--; i >= 0; i--)
@@ -58,11 +144,18 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
             }
         }
 
-        @Override public void lockInterruptibly() throws InterruptedException {
+        /** {@inheritDoc} */
+        @Override public boolean tryLock() {
             int i = 0;
+
+            boolean unlock = false;
+
             try {
                 for (; i < locks.length; i++)
-                    locks[i].writeLock().lockInterruptibly();
+                    if (!locks[i].writeLock().tryLock()) {
+                        unlock = true;
+                        break;
+                    }
             }
             catch (Throwable e) {
                 for (i--; i >= 0; i--)
@@ -70,19 +163,38 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
 
                 throw e;
             }
+
+            if (unlock) {
+                for (i--; i >= 0; i--)
+                    locks[i].writeLock().unlock();
+
+                return false;
+            }
+
+            return true;
         }
 
-        @Override public boolean tryLock() {
+        /** {@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 (!locks[i].writeLock().tryLock()) {
+                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--)
@@ -94,23 +206,22 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
             if (unlock) {
                 for (i--; i >= 0; i--)
                     locks[i].writeLock().unlock();
+
                 return false;
             }
 
             return true;
         }
 
-        @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
-            throw new RuntimeException("Not supported");
-        }
-
+        /** {@inheritDoc} */
         @Override public void unlock() {
             for (int i = locks.length - 1; i >= 0; i--)
                 locks[i].writeLock().unlock();
         }
 
+        /** {@inheritDoc} */
         @NotNull @Override public Condition newCondition() {
-            throw new RuntimeException("Not supported");
+            throw new UnsupportedOperationException();
         }
     }
 }


[8/9] ignite git commit: Merge branch 'ignite-2333' of https://github.com/ilantukh/ignite into ignite-2333

Posted by vo...@apache.org.
Merge branch 'ignite-2333' of https://github.com/ilantukh/ignite into ignite-2333


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/93fbe508
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/93fbe508
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/93fbe508

Branch: refs/heads/ignite-2333
Commit: 93fbe50805c77703b2b0f7489a258009a8e37bf4
Parents: c4d6f3c dfd026c
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Mar 1 12:21:50 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Mar 1 12:21:50 2016 +0300

----------------------------------------------------------------------
 .../dht/GridDhtPartitionTopologyImpl.java       |  11 +-
 .../util/StripedCompositeReadWriteLock.java     | 225 +++++++++++++++++++
 2 files changed, 228 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/93fbe508/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------


[9/9] ignite git commit: IGNITE-2333: Review.

Posted by vo...@apache.org.
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} */


[4/9] ignite git commit: ignite-2333 : Serial version UUID.

Posted by vo...@apache.org.
ignite-2333 : Serial version UUID.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f84d0238
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f84d0238
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f84d0238

Branch: refs/heads/ignite-2333
Commit: f84d0238a50b22825e43e494613afe62e482a7cf
Parents: 571579f
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Mon Feb 8 16:57:52 2016 +0300
Committer: Ilya Lantukh <il...@gridgain.com>
Committed: Mon Feb 8 16:57:52 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/util/StripedCompositeReadWriteLock.java       | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f84d0238/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 1880f0f..ae95f6c 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
@@ -36,6 +36,9 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
     }
 
     private static class PaddedReentrantReadWriteLock extends ReentrantReadWriteLock {
+
+        private static final long serialVersionUID = 0L;
+
         long p0, p1, p2, p3, p4, p5, p6, p7;
     }