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;
}