Repository: ignite Updated Branches: refs/heads/ignite-single-op-tx 2de554525 -> 00056fed8
'Single' operations optimizations for tx cache. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/00056fed Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/00056fed Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/00056fed Branch: refs/heads/ignite-single-op-tx Commit: 00056fed8b9ce537d55be08daa8d38b95ebbddaf Parents: 2de5545 Author: sboikov <[email protected]> Authored: Mon Nov 16 17:18:26 2015 +0300 Committer: sboikov <[email protected]> Committed: Mon Nov 16 17:18:26 2015 +0300 ---------------------------------------------------------------------- .../near/GridNearTxFinishFuture.java | 45 +++++---- .../cache/distributed/near/GridNearTxLocal.java | 18 ++-- .../distributed/near/IgniteTxMappings.java | 75 ++++++++++++++ .../distributed/near/IgniteTxMappingsImpl.java | 92 +++++++++++++++++ .../near/IgniteTxMappingsSingleImpl.java | 101 +++++++++++++++++++ 5 files changed, 300 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/00056fed/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 4d43e9e..31aa8c3 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 @@ -88,7 +88,7 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu private boolean commit; /** Node mappings. */ - private Map<UUID, GridDistributedTxMapping> mappings; + private IgniteTxMappings mappings; /** Trackable flag. */ private boolean trackable = true; @@ -347,8 +347,16 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu try { if (tx.finish(commit) || (!commit && tx.state() == UNKNOWN)) { - if ((tx.onePhaseCommit() && needFinishOnePhase()) || (!tx.onePhaseCommit() && mappings != null)) - finish(mappings.values()); + if ((tx.onePhaseCommit() && needFinishOnePhase()) || (!tx.onePhaseCommit() && mappings != null)) { + if (mappings.single()) { + GridDistributedTxMapping mapping = mappings.singleMapping(); + + if (mapping != null) + finish(mapping); + } + else + finish(mappings.mappings()); + } markInitialized(); @@ -381,11 +389,10 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu * */ private void checkBackup() { - assert mappings.size() <= 1; + GridDistributedTxMapping mapping = mappings.singleMapping(); - for (Map.Entry<UUID, GridDistributedTxMapping> entry : mappings.entrySet()) { - UUID nodeId = entry.getKey(); - GridDistributedTxMapping mapping = entry.getValue(); + if (mapping != null) { + UUID nodeId = mapping.node().id(); Collection<UUID> backups = tx.transactionNodes().get(nodeId); @@ -482,15 +489,13 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu * */ private boolean needFinishOnePhase() { - if (F.isEmpty(tx.mappings())) + if (tx.mappings().empty()) return false; - assert tx.mappings().size() == 1; - boolean finish = tx.txState().hasNearCache(cctx); if (finish) { - GridDistributedTxMapping mapping = F.first(tx.mappings().values()); + GridDistributedTxMapping mapping = tx.mappings().singleMapping(); if (FINISH_NEAR_ONE_PHASE_SINCE.compareTo(mapping.node().version()) > 0) finish = false; @@ -510,18 +515,16 @@ public final class GridNearTxFinishFuture<K, V> extends GridCompoundIdentityFutu finishOnePhaseCalled = true; - // No need to send messages as transaction was already committed on remote node. - // Finish local mapping only as we need send commit message to backups. - for (GridDistributedTxMapping m : mappings.values()) { - if (m.node().isLocal()) { - IgniteInternalFuture<IgniteInternalTx> fut = cctx.tm().txHandler().finishColocatedLocal(commit, tx); + GridDistributedTxMapping locMapping = mappings.localMapping(); - // Add new future. - if (fut != null) - add(fut); + if (locMapping != null) { + // No need to send messages as transaction was already committed on remote node. + // Finish local mapping only as we need send commit message to backups. + IgniteInternalFuture<IgniteInternalTx> fut = cctx.tm().txHandler().finishColocatedLocal(commit, tx); - break; - } + // Add new future. + if (fut != null) + add(fut); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/00056fed/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java index 5f98de8..434b6c7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java @@ -68,9 +68,7 @@ import org.apache.ignite.transactions.TransactionConcurrency; import org.apache.ignite.transactions.TransactionIsolation; import org.apache.ignite.transactions.TransactionState; import org.jetbrains.annotations.Nullable; -import org.jsr166.ConcurrentHashMap8; -import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; import static org.apache.ignite.transactions.TransactionState.COMMITTED; import static org.apache.ignite.transactions.TransactionState.COMMITTING; import static org.apache.ignite.transactions.TransactionState.PREPARING; @@ -87,7 +85,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { private static final long serialVersionUID = 0L; /** DHT mappings. */ - private Map<UUID, GridDistributedTxMapping> mappings = new ConcurrentHashMap8<>(); + private IgniteTxMappings mappings; /** Future. */ @GridToStringExclude @@ -172,6 +170,8 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { subjId, taskNameHash); + mappings = implicitSingle ? new IgniteTxMappingsSingleImpl() : new IgniteTxMappingsImpl(); + initResult(); } @@ -456,7 +456,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { /** * @return DHT map. */ - Map<UUID, GridDistributedTxMapping> mappings() { + IgniteTxMappings mappings() { return mappings; } @@ -503,7 +503,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { GridDistributedTxMapping m = mappings.get(node.id()); if (m == null) - mappings.put(node.id(), m = new GridDistributedTxMapping(node)); + mappings.put(m = new GridDistributedTxMapping(node)); IgniteTxEntry txEntry = entry(key); @@ -536,7 +536,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { GridDistributedTxMapping m = mappings.get(n.id()); if (m == null) { - m = F.addIfAbsent(mappings, n.id(), new GridDistributedTxMapping(n)); + mappings.put(m = new GridDistributedTxMapping(n)); m.near(map.near()); @@ -544,8 +544,6 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { m.markExplicitLock(); } - assert m != null; - for (IgniteTxEntry entry : map.entries()) m.add(entry); } @@ -565,7 +563,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { GridDistributedTxMapping m = new GridDistributedTxMapping(n); - mappings.put(n.id(), m); + mappings.put(m); m.near(map.near()); @@ -1279,6 +1277,6 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { /** {@inheritDoc} */ @Override public String toString() { - return S.toString(GridNearTxLocal.class, this, "mappings", mappings.keySet(), "super", super.toString()); + return S.toString(GridNearTxLocal.class, this, "mappings", mappings, "super", super.toString()); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/00056fed/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappings.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappings.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappings.java new file mode 100644 index 0000000..0465510 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappings.java @@ -0,0 +1,75 @@ +/* + * 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.processors.cache.distributed.near; + +import java.util.Collection; +import java.util.UUID; +import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxMapping; +import org.jetbrains.annotations.Nullable; + +/** + * + */ +public interface IgniteTxMappings { + /** + * Clears this mappings. + */ + public void clear(); + + /** + * @return {@code True} if there are no mappings. + */ + public boolean empty(); + + /** + * @param nodeId Node ID. + * @return Node mapping. + */ + @Nullable public GridDistributedTxMapping get(UUID nodeId); + + /** + * @param mapping Mapping. + */ + public void put(GridDistributedTxMapping mapping); + + /** + * @param nodeId Node ID. + * @return Removed mapping. + */ + @Nullable public GridDistributedTxMapping remove(UUID nodeId); + + /** + * @return Mapping for local node. + */ + @Nullable public GridDistributedTxMapping localMapping(); + + /** + * @return Non null instance if this mappings contain only one mapping. + */ + @Nullable public GridDistributedTxMapping singleMapping(); + + /** + * @return All mappings. + */ + public Collection<GridDistributedTxMapping> mappings(); + + /** + * @return {@code True} if this is single mapping. + */ + public boolean single(); +} http://git-wip-us.apache.org/repos/asf/ignite/blob/00056fed/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsImpl.java new file mode 100644 index 0000000..7dec7af --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsImpl.java @@ -0,0 +1,92 @@ +/* + * 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.processors.cache.distributed.near; + +import java.util.Collection; +import java.util.Map; +import java.util.UUID; +import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxMapping; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; +import org.jsr166.ConcurrentHashMap8; + +/** + * + */ +public class IgniteTxMappingsImpl implements IgniteTxMappings { + /** */ + private final Map<UUID, GridDistributedTxMapping> mappings = new ConcurrentHashMap8<>(); + + /** {@inheritDoc} */ + @Override public void clear() { + mappings.clear(); + } + + /** {@inheritDoc} */ + @Override public boolean empty() { + return mappings.isEmpty(); + } + + /** {@inheritDoc} */ + @Override public GridDistributedTxMapping get(UUID nodeId) { + return mappings.get(nodeId); + } + + /** {@inheritDoc} */ + @Override public void put(GridDistributedTxMapping mapping) { + mappings.put(mapping.node().id(), mapping); + } + + /** {@inheritDoc} */ + @Override public GridDistributedTxMapping remove(UUID nodeId) { + return mappings.remove(nodeId); + } + + /** {@inheritDoc} */ + @Nullable @Override public GridDistributedTxMapping localMapping() { + for (GridDistributedTxMapping m : mappings.values()) { + if (m.node().isLocal()) + return m; + } + + return null; + } + + /** {@inheritDoc} */ + @Override public boolean single() { + return false; + } + + /** {@inheritDoc} */ + @Nullable @Override public GridDistributedTxMapping singleMapping() { + assert mappings.size() == 1 : mappings; + + return F.firstValue(mappings); + } + + /** {@inheritDoc} */ + @Override public Collection<GridDistributedTxMapping> mappings() { + return mappings.values(); + } + + /** {@inheritDoc} */ + public String toString() { + return S.toString(IgniteTxMappingsImpl.class, this); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/00056fed/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsSingleImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsSingleImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsSingleImpl.java new file mode 100644 index 0000000..fc15592 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteTxMappingsSingleImpl.java @@ -0,0 +1,101 @@ +/* + * 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.processors.cache.distributed.near; + +import java.util.Collection; +import java.util.UUID; +import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxMapping; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; + +/** + * + */ +public class IgniteTxMappingsSingleImpl implements IgniteTxMappings { + /** */ + private volatile GridDistributedTxMapping mapping; + + /** {@inheritDoc} */ + @Override public void clear() { + mapping = null; + } + + /** {@inheritDoc} */ + @Override public boolean empty() { + return mapping == null; + } + + /** {@inheritDoc} */ + @Override public GridDistributedTxMapping get(UUID nodeId) { + GridDistributedTxMapping mapping0 = mapping; + + return (mapping0 != null && mapping0.node().id().equals(nodeId)) ? mapping0 : null; + } + + /** {@inheritDoc} */ + @Override public void put(GridDistributedTxMapping mapping) { + assert this.mapping == null; + + this.mapping = mapping; + } + + /** {@inheritDoc} */ + @Override public GridDistributedTxMapping remove(UUID nodeId) { + GridDistributedTxMapping mapping0 = mapping; + + if (mapping0 != null && mapping0.node().id().equals(nodeId)) { + this.mapping = null; + + return mapping0; + } + + return null; + } + + /** {@inheritDoc} */ + @Nullable @Override public GridDistributedTxMapping localMapping() { + GridDistributedTxMapping mapping0 = mapping; + + if (mapping0 != null && mapping0.node().isLocal()) + return mapping0; + + return null; + } + + /** {@inheritDoc} */ + @Override public boolean single() { + return true; + } + + /** {@inheritDoc} */ + @Nullable @Override public GridDistributedTxMapping singleMapping() { + return mapping; + } + + /** {@inheritDoc} */ + @Override public Collection<GridDistributedTxMapping> mappings() { + assert false; + + return null; + } + + /** {@inheritDoc} */ + public String toString() { + return S.toString(IgniteTxMappingsSingleImpl.class, this); + } +}
