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/08/10 09:37:48 UTC
ignite git commit: IGNITE-2545 : Allocate ArrayList for futures only
after second future is added. This closes #929.
Repository: ignite
Updated Branches:
refs/heads/master ae04efba8 -> e5ae9fcad
IGNITE-2545 : Allocate ArrayList for futures only after second future is added. This closes #929.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e5ae9fca
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e5ae9fca
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e5ae9fca
Branch: refs/heads/master
Commit: e5ae9fcad5f75dd0bc2225132da926e8985d18e0
Parents: ae04efb
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Aug 10 12:37:34 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Aug 10 12:37:34 2016 +0300
----------------------------------------------------------------------
.../distributed/GridCacheTxRecoveryFuture.java | 6 +-
.../cache/distributed/dht/GridDhtGetFuture.java | 4 +-
.../distributed/dht/GridDhtLockFuture.java | 6 +-
.../distributed/dht/GridDhtTxPrepareFuture.java | 6 +-
.../colocated/GridDhtColocatedLockFuture.java | 6 +-
.../distributed/near/GridNearLockFuture.java | 6 +-
...arOptimisticSerializableTxPrepareFuture.java | 6 +-
.../near/GridNearOptimisticTxPrepareFuture.java | 6 +-
.../GridNearPessimisticTxPrepareFuture.java | 6 +-
.../near/GridNearTxFinishFuture.java | 6 +-
.../util/future/GridCompoundFuture.java | 90 +++++++++++++++-----
11 files changed, 98 insertions(+), 50 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryFuture.java
index 7312386..c07a817 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTxRecoveryFuture.java
@@ -426,10 +426,10 @@ public class GridCacheTxRecoveryFuture extends GridCompoundIdentityFuture<Boolea
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<Boolean> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<Boolean> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
index 913580f..d2a3b3c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
@@ -29,7 +29,6 @@ import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.NodeStoppingException;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -50,7 +49,6 @@ import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiClosure;
import org.apache.ignite.lang.IgniteUuid;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -277,7 +275,7 @@ public final class GridDhtGetFuture<K, V> extends GridCompoundIdentityFuture<Col
// Optimization to avoid going through compound future,
// if getAsync() has been completed and no other futures added to this
// compound future.
- if (fut.isDone() && futuresSize() == 0) {
+ if (fut.isDone() && futuresCount() == 0) {
if (fut.error() != null)
onDone(fut.error());
else
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java
index 64b8745..187c8a4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java
@@ -546,10 +546,10 @@ public final class GridDhtLockFuture extends GridCompoundIdentityFuture<Boolean>
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- MiniFuture mini = (MiniFuture)futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ MiniFuture mini = (MiniFuture) future(i);
if (mini.futureId().equals(miniId)) {
if (!mini.isDone())
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index e9805aa..2800897 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -526,10 +526,10 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<IgniteInternalTx> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<IgniteInternalTx> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java
index f77efee..05b4a2b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java
@@ -471,10 +471,10 @@ public final class GridDhtColocatedLockFuture extends GridCompoundIdentityFuture
@SuppressWarnings({"ForLoopReplaceableByForEach", "IfMayBeConditional"})
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<Boolean> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<Boolean> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
index 4b6448b..3b53c5e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java
@@ -489,10 +489,10 @@ public final class GridNearLockFuture extends GridCompoundIdentityFuture<Boolean
@SuppressWarnings({"ForLoopReplaceableByForEach", "IfMayBeConditional"})
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<Boolean> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<Boolean> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
index 6515140..cd0ce44 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
@@ -229,10 +229,10 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<GridNearTxPrepareResponse> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<GridNearTxPrepareResponse> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
index 1ea99c4..7a49422 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
@@ -190,10 +190,10 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<GridNearTxPrepareResponse> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<GridNearTxPrepareResponse> fut = future(i);
if (!isMini(fut))
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
index 5d347d7..a353ed5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
@@ -132,10 +132,10 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
@SuppressWarnings("ForLoopReplaceableByForEach")
private MiniFuture miniFuture(IgniteUuid miniId) {
// We iterate directly over the futs collection here to avoid copy.
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation.
- for (int i = 0; i < futs.size(); i++) {
- MiniFuture mini = (MiniFuture)futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ MiniFuture mini = (MiniFuture) future(i);
if (mini.futureId().equals(miniId)) {
if (!mini.isDone())
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
index 39f3ff3..c96651c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
@@ -195,9 +195,9 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu
if (!isDone()) {
FinishMiniFuture finishFut = null;
- synchronized (futs) {
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<IgniteInternalTx> fut = futs.get(i);
+ synchronized (sync) {
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<IgniteInternalTx> fut = future(i);
if (fut.getClass() == FinishMiniFuture.class) {
FinishMiniFuture f = (FinishMiniFuture)fut;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e5ae9fca/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java
index 3409341..b83133a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java
@@ -33,6 +33,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
/**
@@ -53,8 +55,11 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
private static final AtomicIntegerFieldUpdater<GridCompoundFuture> LSNR_CALLS_UPD =
AtomicIntegerFieldUpdater.newUpdater(GridCompoundFuture.class, "lsnrCalls");
- /** Futures. */
- protected final ArrayList<IgniteInternalFuture<T>> futs = new ArrayList<>();
+ /** Sync object */
+ protected final Object sync = new Object();
+
+ /** Possible values: null (no future), IgniteInternalFuture instance (single future) or List of futures */
+ private volatile Object futs;
/** Reducer. */
@GridToStringInclude
@@ -155,8 +160,14 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
* @return Collection of futures.
*/
public Collection<IgniteInternalFuture<T>> futures() {
- synchronized (futs) {
- return new ArrayList<>(futs);
+ synchronized (sync) {
+ if(futs == null)
+ return Collections.emptyList();
+
+ if (futs instanceof IgniteInternalFuture)
+ return Collections.singletonList((IgniteInternalFuture<T>)futs);
+
+ return new ArrayList<>((Collection<IgniteInternalFuture<T>>)futs);
}
}
@@ -179,10 +190,10 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
*/
@SuppressWarnings("ForLoopReplaceableByForEach")
public boolean hasPending() {
- synchronized (futs) {
+ synchronized (sync) {
// Avoid iterator creation and collection copy.
- for (int i = 0; i < futs.size(); i++) {
- IgniteInternalFuture<T> fut = futs.get(i);
+ for (int i = 0; i < futuresCount(); i++) {
+ IgniteInternalFuture<T> fut = future(i);
if (!fut.isDone())
return true;
@@ -197,11 +208,23 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
*
* @param fut Future to add.
*/
+ @SuppressWarnings("unchecked")
public void add(IgniteInternalFuture<T> fut) {
assert fut != null;
- synchronized (futs) {
- futs.add(fut);
+ synchronized (sync) {
+ if (futs == null)
+ futs = fut;
+ else if (futs instanceof IgniteInternalFuture) {
+ Collection<IgniteInternalFuture> futs0 = new ArrayList<>(4);
+
+ futs0.add((IgniteInternalFuture)futs);
+ futs0.add(fut);
+
+ futs = futs0;
+ }
+ else
+ ((Collection<IgniteInternalFuture>)futs).add(fut);
}
fut.listen(this);
@@ -217,8 +240,8 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
}
/**
- * @return {@code True} if this future was initialized. Initialization happens when
- * {@link #markInitialized()} method is called on future.
+ * @return {@code True} if this future was initialized. Initialization happens when {@link #markInitialized()}
+ * method is called on future.
*/
public boolean initialized() {
return initFlag == INIT_FLAG;
@@ -236,7 +259,7 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
* Check completeness of the future.
*/
private void checkComplete() {
- if (initialized() && !isDone() && lsnrCalls == futuresSize()) {
+ if (initialized() && !isDone() && lsnrCalls == futuresCount()) {
try {
onDone(rdc != null ? rdc.reduce() : null);
}
@@ -256,11 +279,38 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
}
/**
+ * Returns future at the specified position in this list.
+ *
+ * @param idx - index index of the element to return
+ * @return Future.
+ */
+ @SuppressWarnings("unchecked")
+ protected IgniteInternalFuture<T> future(int idx) {
+ assert Thread.holdsLock(sync);
+ assert futs != null && idx >= 0 && idx < futuresCount();
+
+ if (futs instanceof IgniteInternalFuture) {
+ assert idx == 0;
+
+ return (IgniteInternalFuture<T>)futs;
+ }
+ else
+ return ((List<IgniteInternalFuture>)futs).get(idx);
+ }
+
+ /**
* @return Futures size.
*/
- protected int futuresSize() {
- synchronized (futs) {
- return futs.size();
+ @SuppressWarnings("unchecked")
+ protected int futuresCount() {
+ synchronized (sync) {
+ if (futs == null)
+ return 0;
+
+ if (futs instanceof IgniteInternalFuture)
+ return 1;
+
+ return ((Collection<IgniteInternalFuture>)futs).size();
}
}
@@ -271,11 +321,11 @@ public class GridCompoundFuture<T, R> extends GridFutureAdapter<R> implements Ig
"cancelled", isCancelled(),
"err", error(),
"futs",
- F.viewReadOnly(futures(), new C1<IgniteInternalFuture<T>, String>() {
- @Override public String apply(IgniteInternalFuture<T> f) {
- return Boolean.toString(f.isDone());
- }
- })
+ F.viewReadOnly(futures(), new C1<IgniteInternalFuture<T>, String>() {
+ @Override public String apply(IgniteInternalFuture<T> f) {
+ return Boolean.toString(f.isDone());
+ }
+ })
);
}
}