ignite-5937
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4abbf601 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4abbf601 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4abbf601 Branch: refs/heads/ignite-5937 Commit: 4abbf60163bc44adb2b0753f6206093bd660ee96 Parents: 5dca77b Author: sboikov <sboi...@gridgain.com> Authored: Thu Oct 19 11:57:46 2017 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Thu Oct 19 15:30:49 2017 +0300 ---------------------------------------------------------------------- .../cache/mvcc/CacheCoordinatorsProcessor.java | 12 +- .../cache/mvcc/CoordinatorAckRequestTx.java | 2 +- .../cache/mvcc/PreviousCoordinatorQueries.java | 4 +- .../cache/persistence/tree/io/IOVersions.java | 7 + .../cache/persistence/tree/io/PageIO.java | 53 +++- .../cache/tree/AbstractDataInnerIO.java | 8 +- .../cache/tree/AbstractDataLeafIO.java | 6 +- .../processors/cache/tree/CacheDataTree.java | 2 +- .../cache/tree/CacheIdAwareDataInnerIO.java | 2 +- .../cache/tree/CacheIdAwareDataLeafIO.java | 2 +- .../processors/cache/tree/DataInnerIO.java | 2 +- .../processors/cache/tree/DataLeafIO.java | 2 +- .../processors/cache/tree/SearchRow.java | 2 +- .../processors/query/h2/database/H2Tree.java | 44 +++- .../h2/database/io/AbstractH2ExtrasInnerIO.java | 190 ++++++++++++++ .../h2/database/io/AbstractH2ExtrasLeafIO.java | 187 +++++++++++++ .../query/h2/database/io/AbstractH2InnerIO.java | 58 +---- .../query/h2/database/io/AbstractH2LeafIO.java | 54 +--- .../query/h2/database/io/H2ExtrasInnerIO.java | 116 +-------- .../query/h2/database/io/H2ExtrasLeafIO.java | 112 +------- .../query/h2/database/io/H2IOUtils.java | 90 +++++++ .../h2/database/io/H2MvccExtrasInnerIO.java | 77 ++++++ .../h2/database/io/H2MvccExtrasLeafIO.java | 76 ++++++ .../query/h2/opt/GridH2KeyValueRowOnheap.java | 2 +- .../processors/query/h2/opt/GridH2Row.java | 4 +- .../query/h2/opt/GridH2SearchRowAdapter.java | 2 +- .../processors/query/h2/opt/GridH2Table.java | 5 +- .../cache/mvcc/CacheMvccSqlQueriesTest.java | 260 +++++++++++++++++-- 28 files changed, 981 insertions(+), 400 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java index 06d617c..07e30d8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CacheCoordinatorsProcessor.java @@ -75,7 +75,7 @@ import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYS */ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { /** */ - public static final long COUNTER_NA = 0L; + public static final long MVCC_COUNTER_NA = 0L; /** */ public static final long MVCC_START_CNTR = 1L; @@ -154,7 +154,7 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { */ public static boolean assertMvccVersionValid(long crdVer, long cntr) { assert unmaskCoordinatorVersion(crdVer) > 0; - assert cntr != COUNTER_NA; + assert cntr != MVCC_COUNTER_NA; return true; } @@ -663,7 +663,7 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { private void processCoordinatorTxAckRequest(UUID nodeId, CoordinatorAckRequestTx msg) { onTxDone(msg.txCounter()); - if (msg.queryCounter() != COUNTER_NA) { + if (msg.queryCounter() != MVCC_COUNTER_NA) { if (msg.queryCoordinatorVersion() == 0) onQueryDone(nodeId, msg.queryCounter()); else @@ -836,7 +836,7 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { else qryCnt.incrementAndGet(); - res.init(futId, crdVer, mvccCntr, COUNTER_NA); + res.init(futId, crdVer, mvccCntr, MVCC_COUNTER_NA); return res; } @@ -921,7 +921,7 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { // } // } // -// res.init(futId, crdVer, mvccCntr, COUNTER_NA); +// res.init(futId, crdVer, mvccCntr, MVCC_COUNTER_NA); // // return res; } @@ -1209,7 +1209,7 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter { * @param res Response. */ void onResponse(MvccCoordinatorVersionResponse res) { - assert res.counter() != COUNTER_NA; + assert res.counter() != MVCC_COUNTER_NA; if (lsnr != null) lsnr.onMvccResponse(crd.nodeId(), res); http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CoordinatorAckRequestTx.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CoordinatorAckRequestTx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CoordinatorAckRequestTx.java index c0512f0..5ab3d3b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CoordinatorAckRequestTx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/CoordinatorAckRequestTx.java @@ -60,7 +60,7 @@ public class CoordinatorAckRequestTx implements MvccCoordinatorMessage { /** {@inheritDoc} */ long queryCounter() { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/PreviousCoordinatorQueries.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/PreviousCoordinatorQueries.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/PreviousCoordinatorQueries.java index 5c56f40..521e989 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/PreviousCoordinatorQueries.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/mvcc/PreviousCoordinatorQueries.java @@ -26,9 +26,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.managers.discovery.DiscoCache; import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager; -import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.CU; import org.jetbrains.annotations.Nullable; /** @@ -165,7 +163,7 @@ class PreviousCoordinatorQueries { */ void onQueryDone(UUID nodeId, long crdVer, long cntr) { assert crdVer != 0; - assert cntr != CacheCoordinatorsProcessor.COUNTER_NA; + assert cntr != CacheCoordinatorsProcessor.MVCC_COUNTER_NA; synchronized (this) { MvccCounter mvccCntr = new MvccCounter(crdVer, cntr); http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/IOVersions.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/IOVersions.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/IOVersions.java index d74d344..9dcad9b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/IOVersions.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/IOVersions.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.processors.cache.persistence.tree.io; +import org.apache.ignite.internal.util.typedef.internal.S; + /** * Registry for IO versions. */ @@ -99,4 +101,9 @@ public final class IOVersions<V extends PageIO> { return res; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(IOVersions.class, this); + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIO.java index 6267ce0..0a42129 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIO.java @@ -104,6 +104,12 @@ public abstract class PageIO { private static List<IOVersions<? extends BPlusLeafIO<?>>> h2ExtraLeafIOs = new ArrayList<>(MAX_PAYLOAD_SIZE); /** */ + private static List<IOVersions<? extends BPlusInnerIO<?>>> h2ExtraMvccInnerIOs = new ArrayList<>(MAX_PAYLOAD_SIZE); + + /** */ + private static List<IOVersions<? extends BPlusLeafIO<?>>> h2ExtraMvccLeafIOs = new ArrayList<>(MAX_PAYLOAD_SIZE); + + /** */ public static final int TYPE_OFF = 0; /** */ @@ -190,18 +196,30 @@ public abstract class PageIO { public static final short T_PART_CNTRS = 20; /** Index for payload == 1. */ - public static final short T_H2_EX_REF_LEAF_START = 10000; + public static final short T_H2_EX_REF_LEAF_START = 10_000; /** */ public static final short T_H2_EX_REF_LEAF_END = T_H2_EX_REF_LEAF_START + MAX_PAYLOAD_SIZE - 1; /** */ - public static final short T_H2_EX_REF_INNER_START = 20000; + public static final short T_H2_EX_REF_INNER_START = 20_000; /** */ public static final short T_H2_EX_REF_INNER_END = T_H2_EX_REF_INNER_START + MAX_PAYLOAD_SIZE - 1; /** */ + public static final short T_H2_EX_REF_MVCC_LEAF_START = 23_000; + + /** */ + public static final short T_H2_EX_REF_MVCC_LEAF_END = T_H2_EX_REF_MVCC_LEAF_START + MAX_PAYLOAD_SIZE - 1; + + /** */ + public static final short T_H2_EX_REF_MVCC_INNER_START = 26_000; + + /** */ + public static final short T_H2_EX_REF_MVCC_INNER_END = T_H2_EX_REF_MVCC_INNER_START + MAX_PAYLOAD_SIZE - 1; + + /** */ public static final short T_DATA_REF_MVCC_INNER = 21; /** */ @@ -366,8 +384,10 @@ public abstract class PageIO { * * @param innerExtIOs Extra versions. */ - public static void registerH2ExtraInner(IOVersions<? extends BPlusInnerIO<?>> innerExtIOs) { - h2ExtraInnerIOs.add(innerExtIOs); + public static void registerH2ExtraInner(IOVersions<? extends BPlusInnerIO<?>> innerExtIOs, boolean mvcc) { + List<IOVersions<? extends BPlusInnerIO<?>>> ios = mvcc ? h2ExtraMvccInnerIOs : h2ExtraInnerIOs; + + ios.add(innerExtIOs); } /** @@ -375,24 +395,30 @@ public abstract class PageIO { * * @param leafExtIOs Extra versions. */ - public static void registerH2ExtraLeaf(IOVersions<? extends BPlusLeafIO<?>> leafExtIOs) { - h2ExtraLeafIOs.add(leafExtIOs); + public static void registerH2ExtraLeaf(IOVersions<? extends BPlusLeafIO<?>> leafExtIOs, boolean mvcc) { + List<IOVersions<? extends BPlusLeafIO<?>>> ios = mvcc ? h2ExtraMvccLeafIOs : h2ExtraLeafIOs; + + ios.add(leafExtIOs); } /** * @param idx Index. * @return IOVersions for given idx. */ - public static IOVersions<? extends BPlusInnerIO<?>> getInnerVersions(int idx) { - return h2ExtraInnerIOs.get(idx); + public static IOVersions<? extends BPlusInnerIO<?>> getInnerVersions(int idx, boolean mvcc) { + List<IOVersions<? extends BPlusInnerIO<?>>> ios = mvcc ? h2ExtraMvccInnerIOs : h2ExtraInnerIOs; + + return ios.get(idx); } /** * @param idx Index. * @return IOVersions for given idx. */ - public static IOVersions<? extends BPlusLeafIO<?>> getLeafVersions(int idx) { - return h2ExtraLeafIOs.get(idx); + public static IOVersions<? extends BPlusLeafIO<?>> getLeafVersions(int idx, boolean mvcc) { + List<IOVersions<? extends BPlusLeafIO<?>>> ios = mvcc ? h2ExtraMvccLeafIOs : h2ExtraLeafIOs; + + return ios.get(idx); } /** @@ -511,13 +537,18 @@ public abstract class PageIO { */ @SuppressWarnings("unchecked") public static <Q extends BPlusIO<?>> Q getBPlusIO(int type, int ver) throws IgniteCheckedException { - if (type >= T_H2_EX_REF_LEAF_START && type <= T_H2_EX_REF_LEAF_END) return (Q)h2ExtraLeafIOs.get(type - T_H2_EX_REF_LEAF_START).forVersion(ver); if (type >= T_H2_EX_REF_INNER_START && type <= T_H2_EX_REF_INNER_END) return (Q)h2ExtraInnerIOs.get(type - T_H2_EX_REF_INNER_START).forVersion(ver); + if (type >= T_H2_EX_REF_MVCC_LEAF_START && type <= T_H2_EX_REF_MVCC_LEAF_END) + return (Q)h2ExtraMvccLeafIOs.get(type - T_H2_EX_REF_MVCC_LEAF_START).forVersion(ver); + + if (type >= T_H2_EX_REF_MVCC_INNER_START && type <= T_H2_EX_REF_MVCC_INNER_END) + return (Q)h2ExtraMvccInnerIOs.get(type - T_H2_EX_REF_MVCC_INNER_START).forVersion(ver); + switch (type) { case T_H2_REF_INNER: if (h2InnerIOs == null) http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataInnerIO.java index 31aa2ca..c36d5cb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataInnerIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataInnerIO.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusInne import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.lang.IgniteInClosure; -import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.COUNTER_NA; +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.MVCC_COUNTER_NA; import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.unmaskCoordinatorVersion; /** @@ -62,7 +62,7 @@ public abstract class AbstractDataInnerIO extends BPlusInnerIO<CacheSearchRow> i if (storeMvccVersion()) { assert unmaskCoordinatorVersion(row.mvccCoordinatorVersion()) > 0 : row; - assert row.mvccCounter() != COUNTER_NA : row; + assert row.mvccCounter() != MVCC_COUNTER_NA : row; PageUtils.putLong(pageAddr, off, row.mvccCoordinatorVersion()); off += 8; @@ -82,7 +82,7 @@ public abstract class AbstractDataInnerIO extends BPlusInnerIO<CacheSearchRow> i long mvccCntr = getMvccCounter(pageAddr, idx); assert unmaskCoordinatorVersion(mvccTopVer) > 0 : mvccTopVer; - assert mvccCntr != COUNTER_NA; + assert mvccCntr != MVCC_COUNTER_NA; return ((CacheDataTree)tree).rowStore().mvccRow(cacheId, hash, @@ -128,7 +128,7 @@ public abstract class AbstractDataInnerIO extends BPlusInnerIO<CacheSearchRow> i long mvccCntr = rowIo.getMvccCounter(srcPageAddr, srcIdx); assert unmaskCoordinatorVersion(mvccTopVer) > 0 : mvccTopVer; - assert mvccCntr != COUNTER_NA; + assert mvccCntr != MVCC_COUNTER_NA; PageUtils.putLong(dstPageAddr, off, mvccTopVer); off += 8; http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataLeafIO.java index 47d8a6f..d60aef2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataLeafIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/AbstractDataLeafIO.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusLeaf import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.lang.IgniteInClosure; -import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.COUNTER_NA; +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.MVCC_COUNTER_NA; import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.unmaskCoordinatorVersion; /** @@ -64,7 +64,7 @@ public abstract class AbstractDataLeafIO extends BPlusLeafIO<CacheSearchRow> imp long mvccUpdateCntr = row.mvccCounter(); assert unmaskCoordinatorVersion(mvccCrdVer) > 0 : mvccCrdVer; - assert mvccUpdateCntr != COUNTER_NA; + assert mvccUpdateCntr != MVCC_COUNTER_NA; PageUtils.putLong(pageAddr, off, mvccCrdVer); off += 8; @@ -100,7 +100,7 @@ public abstract class AbstractDataLeafIO extends BPlusLeafIO<CacheSearchRow> imp long mvccUpdateCntr = ((RowLinkIO)srcIo).getMvccCounter(srcPageAddr, srcIdx); assert unmaskCoordinatorVersion(mvccUpdateTopVer) > 0 : mvccUpdateCntr; - assert mvccUpdateCntr != COUNTER_NA; + assert mvccUpdateCntr != MVCC_COUNTER_NA; PageUtils.putLong(dstPageAddr, off, mvccUpdateTopVer); off += 8; http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java index e8861bd..d4e9eea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java @@ -169,7 +169,7 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> { long mvccCntr = io.getMvccCounter(pageAddr, idx); - assert row.mvccCounter() != CacheCoordinatorsProcessor.COUNTER_NA; + assert row.mvccCounter() != CacheCoordinatorsProcessor.MVCC_COUNTER_NA; cmp = Long.compare(row.mvccCounter(), mvccCntr); http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java index 3d02b27..36ffd49 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java @@ -59,6 +59,6 @@ public final class CacheIdAwareDataInnerIO extends AbstractDataInnerIO { /** {@inheritDoc} */ @Override public long getMvccCounter(long pageAddr, int idx) { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java index 58ae9ff..ae6fc0d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java @@ -59,6 +59,6 @@ public final class CacheIdAwareDataLeafIO extends AbstractDataLeafIO { /** {@inheritDoc} */ @Override public long getMvccCounter(long pageAddr, int idx) { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java index 19a5c47..98a5450 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java @@ -59,6 +59,6 @@ public final class DataInnerIO extends AbstractDataInnerIO { /** {@inheritDoc} */ @Override public long getMvccCounter(long pageAddr, int idx) { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java index ab10b96..b644e6a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java @@ -59,6 +59,6 @@ public final class DataLeafIO extends AbstractDataLeafIO { /** {@inheritDoc} */ @Override public long getMvccCounter(long pageAddr, int idx) { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java index 5bdc495..5fd7e8f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java @@ -83,7 +83,7 @@ public class SearchRow implements CacheSearchRow { /** {@inheritDoc} */ @Override public long mvccCounter() { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java index f5032eb..03c5c68 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusMeta import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasInnerIO; import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasLeafIO; +import org.apache.ignite.internal.processors.query.h2.database.io.H2RowLinkIO; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; import org.apache.ignite.internal.util.typedef.internal.S; @@ -37,7 +38,7 @@ import org.h2.result.SearchRow; import org.h2.table.IndexColumn; import org.h2.value.Value; -import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.COUNTER_NA; +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.MVCC_COUNTER_NA; import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.assertMvccVersionValid; import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.unmaskCoordinatorVersion; @@ -206,7 +207,7 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> { } if (lastIdxUsed == cols.length) - return 0; + return mvccCompare((H2RowLinkIO)io, pageAddr, idx, row); SearchRow rowData = getRow(io, pageAddr, idx); @@ -218,7 +219,7 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> { if (v2 == null) { // Can't compare further. - return 0; + return mvccCompare((H2RowLinkIO)io, pageAddr, idx, row); } Value v1 = rowData.getValue(idx0); @@ -229,7 +230,7 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> { return InlineIndexHelper.fixSort(c, col.sortType); } - return 0; + return mvccCompare((H2RowLinkIO)io, pageAddr, idx, row); } } @@ -266,6 +267,37 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> { return mvccCompare(r1, r2); } + private int mvccCompare(H2RowLinkIO io, long pageAddr, int idx, GridH2SearchRow r2) { + int c = 0; + + if (mvccEnabled && !r2.indexSearchRow()) { + long crdVer1 = io.getMvccCoordinatorVersion(pageAddr, idx); + long crdVer2 = r2.mvccCoordinatorVersion(); + + assert crdVer1 != 0; + assert crdVer2 != 0 : r2; + + c = Long.compare(unmaskCoordinatorVersion(crdVer1), unmaskCoordinatorVersion(crdVer2)); + + if (c != 0) + return c; + + long cntr = io.getMvccCounter(pageAddr, idx); + + assert cntr != MVCC_COUNTER_NA; + assert r2.mvccCounter() != MVCC_COUNTER_NA : r2; + + c = Long.compare(cntr, r2.mvccCounter()); + } + + return c; + } + + /** + * @param r1 First row. + * @param r2 Second row. + * @return Comparison result. + */ private int mvccCompare(GridH2Row r1, GridH2SearchRow r2) { if (mvccEnabled && !r2.indexSearchRow()) { long crdVer1 = r1.mvccCoordinatorVersion(); @@ -279,8 +311,8 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> { if (c != 0) return c; - assert r1.mvccCounter() != COUNTER_NA : r1; - assert r2.mvccCounter() != COUNTER_NA : r2; + assert r1.mvccCounter() != MVCC_COUNTER_NA : r1; + assert r2.mvccCounter() != MVCC_COUNTER_NA : r2; c = Long.compare(r1.mvccCounter(), r2.mvccCounter()); http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasInnerIO.java new file mode 100644 index 0000000..550aade --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasInnerIO.java @@ -0,0 +1,190 @@ +/* + * 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.query.h2.database.io; + +import java.util.List; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.pagemem.PageUtils; +import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusInnerIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; +import org.apache.ignite.internal.processors.query.h2.database.H2Tree; +import org.apache.ignite.internal.processors.query.h2.database.InlineIndexHelper; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; + +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.MVCC_COUNTER_NA; + +/** + * Inner page for H2 row references. + */ +public abstract class AbstractH2ExtrasInnerIO extends BPlusInnerIO<GridH2SearchRow> implements H2RowLinkIO { + /** Payload size. */ + private final int payloadSize; + + /** */ + public static void register() { + register(false); + + register(true); + } + + /** + * @param mvcc Mvcc flag. + */ + private static void register(boolean mvcc) { + short type = mvcc ? PageIO.T_H2_EX_REF_MVCC_INNER_START : PageIO.T_H2_EX_REF_INNER_START; + + for (short payload = 1; payload <= PageIO.MAX_PAYLOAD_SIZE; payload++) { + IOVersions<? extends AbstractH2ExtrasInnerIO> io = + getVersions((short)(type + payload - 1), payload, mvcc); + + PageIO.registerH2ExtraInner(io, mvcc); + } + } + + /** + * @param payload Payload size. + * @param mvccEnabled Mvcc flag. + * @return IOVersions for given payload. + */ + @SuppressWarnings("unchecked") + public static IOVersions<? extends BPlusInnerIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) { + assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE; + + if (payload == 0) + return mvccEnabled ? H2MvccInnerIO.VERSIONS : H2InnerIO.VERSIONS; + else + return (IOVersions<BPlusInnerIO<GridH2SearchRow>>)PageIO.getInnerVersions((short)(payload - 1), mvccEnabled); + } + + /** + * @param type Type. + * @param payload Payload size. + * @param mvcc Mvcc flag. + * @return Instance of IO versions. + */ + private static IOVersions<? extends AbstractH2ExtrasInnerIO> getVersions(short type, short payload, boolean mvcc) { + return new IOVersions<>(mvcc ? new H2MvccExtrasInnerIO(type, 1, payload) : new H2ExtrasInnerIO(type, 1, payload)); + } + + /** + * @param type Page type. + * @param ver Page format version. + * @param itemSize Item size. + * @param payloadSize Payload size. + */ + AbstractH2ExtrasInnerIO(short type, int ver, int itemSize, int payloadSize) { + super(type, ver, true, itemSize + payloadSize); + + this.payloadSize = payloadSize; + } + + /** {@inheritDoc} */ + @SuppressWarnings("ForLoopReplaceableByForEach") + @Override public final void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { + GridH2Row row0 = (GridH2Row)row; + + assert row0.link() != 0 : row0; + + List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes(); + + assert inlineIdxs != null : "no inline index helpers"; + + + int fieldOff = 0; + + for (int i = 0; i < inlineIdxs.size(); i++) { + InlineIndexHelper idx = inlineIdxs.get(i); + + int size = idx.put(pageAddr, off + fieldOff, row.getValue(idx.columnIndex()), payloadSize - fieldOff); + + if (size == 0) + break; + + fieldOff += size; + } + + H2IOUtils.storeRow(row0, pageAddr, off + payloadSize, storeMvccInfo()); + } + + /** {@inheritDoc} */ + @Override public final GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx) + throws IgniteCheckedException { + long link = getLink(pageAddr, idx); + + assert link != 0; + + if (storeMvccInfo()) { + long mvccCrdVer = getMvccCoordinatorVersion(pageAddr, idx); + long mvccCntr = getMvccCounter(pageAddr, idx); + + return ((H2Tree)tree).getRowFactory().getMvccRow(link, mvccCrdVer, mvccCntr); + } + + return ((H2Tree)tree).getRowFactory().getRow(link); + } + + /** {@inheritDoc} */ + @Override public final void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { + int srcOff = srcIo.offset(srcIdx); + + byte[] payload = PageUtils.getBytes(srcPageAddr, srcOff, payloadSize); + long link = PageUtils.getLong(srcPageAddr, srcOff + payloadSize); + + assert link != 0; + + int dstOff = offset(dstIdx); + + PageUtils.putBytes(dstPageAddr, dstOff, payload); + + H2IOUtils.store(dstPageAddr, dstOff + payloadSize, srcIo, srcPageAddr, srcIdx, storeMvccInfo()); + } + + /** {@inheritDoc} */ + @Override public final long getLink(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + payloadSize); + } + + /** {@inheritDoc} */ + @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) { + return 0; + } + + /** {@inheritDoc} */ + @Override public long getMvccCounter(long pageAddr, int idx) { + return MVCC_COUNTER_NA; + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCoordinatorVersion(long pageAddr, int idx) { + return 0; + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCounter(long pageAddr, int idx) { + return MVCC_COUNTER_NA; + } + + /** {@inheritDoc} */ + @Override public boolean storeMvccInfo() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasLeafIO.java new file mode 100644 index 0000000..7beecf2 --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2ExtrasLeafIO.java @@ -0,0 +1,187 @@ +/* + * 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.query.h2.database.io; + +import java.util.List; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.pagemem.PageUtils; +import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusLeafIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; +import org.apache.ignite.internal.processors.query.h2.database.H2Tree; +import org.apache.ignite.internal.processors.query.h2.database.InlineIndexHelper; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; + +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.MVCC_COUNTER_NA; + +/** + * Leaf page for H2 row references. + */ +public class AbstractH2ExtrasLeafIO extends BPlusLeafIO<GridH2SearchRow> implements H2RowLinkIO { + /** Payload size. */ + private final int payloadSize; + + /** */ + public static void register() { + register(false); + + register(true); + } + + /** + * @param mvcc Mvcc flag. + */ + private static void register(boolean mvcc) { + short type = mvcc ? PageIO.T_H2_EX_REF_MVCC_LEAF_START : PageIO.T_H2_EX_REF_LEAF_START; + + for (short payload = 1; payload <= PageIO.MAX_PAYLOAD_SIZE; payload++) { + IOVersions<? extends AbstractH2ExtrasLeafIO> io = + getVersions((short)(type + payload - 1), payload, mvcc); + + PageIO.registerH2ExtraLeaf(io, mvcc); + } + } + + /** + * @param payload Payload size. + * @param mvccEnabled Mvcc flag. + * @return IOVersions for given payload. + */ + @SuppressWarnings("unchecked") + public static IOVersions<? extends BPlusLeafIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) { + assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE; + + if (payload == 0) + return mvccEnabled ? H2MvccLeafIO.VERSIONS : H2LeafIO.VERSIONS; + else + return (IOVersions<BPlusLeafIO<GridH2SearchRow>>)PageIO.getLeafVersions((short)(payload - 1), mvccEnabled); + } + + /** + * @param type Type. + * @param payload Payload size. + * @param mvcc Mvcc flag. + * @return Versions. + */ + private static IOVersions<? extends AbstractH2ExtrasLeafIO> getVersions(short type, short payload, boolean mvcc) { + return new IOVersions<>(mvcc ? new H2MvccExtrasLeafIO(type, 1, payload) : new H2ExtrasLeafIO(type, 1, payload)); + } + + /** + * @param type Page type. + * @param ver Page format version. + * @param itemSize Item size. + * @param payloadSize Payload size. + */ + AbstractH2ExtrasLeafIO(short type, int ver, int itemSize, int payloadSize) { + super(type, ver, itemSize + payloadSize); + + this.payloadSize = payloadSize; + } + + /** {@inheritDoc} */ + @SuppressWarnings("ForLoopReplaceableByForEach") + @Override public final void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { + GridH2Row row0 = (GridH2Row)row; + + assert row0.link() != 0; + + List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes(); + + assert inlineIdxs != null : "no inline index helpers"; + + int fieldOff = 0; + + for (int i = 0; i < inlineIdxs.size(); i++) { + InlineIndexHelper idx = inlineIdxs.get(i); + + int size = idx.put(pageAddr, off + fieldOff, row.getValue(idx.columnIndex()), payloadSize - fieldOff); + + if (size == 0) + break; + + fieldOff += size; + } + + H2IOUtils.storeRow(row0, pageAddr, off + payloadSize, storeMvccInfo()); + } + + /** {@inheritDoc} */ + @Override public final void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { + int srcOff = srcIo.offset(srcIdx); + + byte[] payload = PageUtils.getBytes(srcPageAddr, srcOff, payloadSize); + long link = PageUtils.getLong(srcPageAddr, srcOff + payloadSize); + + assert link != 0; + + int dstOff = offset(dstIdx); + + PageUtils.putBytes(dstPageAddr, dstOff, payload); + + H2IOUtils.store(dstPageAddr, dstOff + payloadSize, srcIo, srcPageAddr, srcIdx, storeMvccInfo()); + } + + /** {@inheritDoc} */ + @Override public final GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx) + throws IgniteCheckedException { + long link = getLink(pageAddr, idx); + + if (storeMvccInfo()) { + long mvccCrdVer = getMvccCoordinatorVersion(pageAddr, idx); + long mvccCntr = getMvccCounter(pageAddr, idx); + + return ((H2Tree)tree).getRowFactory().getMvccRow(link, mvccCrdVer, mvccCntr); + } + + return ((H2Tree)tree).getRowFactory().getRow(link); + } + + /** {@inheritDoc} */ + @Override public final long getLink(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + payloadSize); + } + + /** {@inheritDoc} */ + @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) { + return 0; + } + + /** {@inheritDoc} */ + @Override public long getMvccCounter(long pageAddr, int idx) { + return MVCC_COUNTER_NA; + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCoordinatorVersion(long pageAddr, int idx) { + return 0; + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCounter(long pageAddr, int idx) { + return MVCC_COUNTER_NA; + } + + /** {@inheritDoc} */ + @Override public boolean storeMvccInfo() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java index bdfbe9c..2f12e75 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java @@ -26,8 +26,6 @@ import org.apache.ignite.internal.processors.query.h2.database.H2Tree; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; -import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.assertMvccVersionValid; - /** * Inner page for H2 row references. */ @@ -50,31 +48,7 @@ public abstract class AbstractH2InnerIO extends BPlusInnerIO<GridH2SearchRow> im @Override public void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { GridH2Row row0 = (GridH2Row)row; - assert row0.link() != 0; - - PageUtils.putLong(pageAddr, off, row0.link()); - - if (storeMvccInfo()) { - long mvccCrdVer = row.mvccCoordinatorVersion(); - long mvccCntr = row.mvccCounter(); - - assert assertMvccVersionValid(mvccCrdVer, mvccCntr); - - PageUtils.putLong(pageAddr, off + 8, mvccCrdVer); - PageUtils.putLong(pageAddr, off + 16, mvccCntr); - - long newMvccCrdVer = row0.newMvccCoordinatorVersion(); - - PageUtils.putLong(pageAddr, off + 24, newMvccCrdVer); - - if (newMvccCrdVer != 0) { - long newMvccCntr = row0.newMvccCounter(); - - assert assertMvccVersionValid(newMvccCrdVer, newMvccCntr); - - PageUtils.putLong(pageAddr, off + 32, newMvccCntr); - } - } + H2IOUtils.storeRow(row0, pageAddr, off, storeMvccInfo()); } /** {@inheritDoc} */ @@ -94,35 +68,7 @@ public abstract class AbstractH2InnerIO extends BPlusInnerIO<GridH2SearchRow> im /** {@inheritDoc} */ @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { - H2RowLinkIO rowIo = (H2RowLinkIO)srcIo; - - long link = rowIo.getLink(srcPageAddr, srcIdx); - - int off = offset(dstIdx); - - PageUtils.putLong(dstPageAddr, off, link); - - if (storeMvccInfo()) { - long mvccCrdVer = rowIo.getMvccCoordinatorVersion(srcPageAddr, srcIdx); - long mvccCntr = rowIo.getMvccCounter(srcPageAddr, srcIdx); - - assert assertMvccVersionValid(mvccCrdVer, mvccCntr); - - PageUtils.putLong(dstPageAddr, off + 8, mvccCrdVer); - PageUtils.putLong(dstPageAddr, off + 16, mvccCntr); - - long newMvccCrdVer = rowIo.getNewMvccCoordinatorVersion(srcPageAddr, srcIdx); - - PageUtils.putLong(dstPageAddr, off + 24, newMvccCrdVer); - - if (newMvccCrdVer != 0) { - long newMvccCntr = rowIo.getNewMvccCounter(srcPageAddr, srcIdx); - - assertMvccVersionValid(newMvccCrdVer, newMvccCntr); - - PageUtils.putLong(dstPageAddr, off + 32, newMvccCntr); - } - } + H2IOUtils.store(dstPageAddr, offset(dstIdx), srcIo, srcPageAddr, srcIdx, storeMvccInfo()); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java index 609c87e..a5cf7c2 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java @@ -26,8 +26,6 @@ import org.apache.ignite.internal.processors.query.h2.database.H2Tree; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; -import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.assertMvccVersionValid; - /** * Leaf page for H2 row references. */ @@ -50,62 +48,14 @@ public abstract class AbstractH2LeafIO extends BPlusLeafIO<GridH2SearchRow> impl @Override public final void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { GridH2Row row0 = (GridH2Row)row; - assert row0.link() != 0; - - PageUtils.putLong(pageAddr, off, row0.link()); - - if (storeMvccInfo()) { - long mvccCrdVer = row.mvccCoordinatorVersion(); - long mvccCntr = row.mvccCounter(); - - assert assertMvccVersionValid(mvccCrdVer, mvccCntr); - - PageUtils.putLong(pageAddr, off + 8, mvccCrdVer); - PageUtils.putLong(pageAddr, off + 16, mvccCntr); - - long newMvccCrdVer = row0.newMvccCoordinatorVersion(); - - PageUtils.putLong(pageAddr, off + 24, newMvccCrdVer); - - if (newMvccCrdVer != 0) { - long newMvccCntr = row0.newMvccCounter(); - - assert assertMvccVersionValid(newMvccCrdVer, newMvccCntr); - - PageUtils.putLong(pageAddr, off + 32, newMvccCntr); - } - } + H2IOUtils.storeRow(row0, pageAddr, off, storeMvccInfo()); } /** {@inheritDoc} */ @Override public final void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { assert srcIo == this; - int off = offset(dstIdx); - - PageUtils.putLong(dstPageAddr, off, getLink(srcPageAddr, srcIdx)); - - if (storeMvccInfo()) { - long mvccCrdVer = getMvccCoordinatorVersion(srcPageAddr, srcIdx); - long mvccCntr = getMvccCounter(srcPageAddr, srcIdx); - - assert assertMvccVersionValid(mvccCrdVer, mvccCntr); - - PageUtils.putLong(dstPageAddr, off + 8, mvccCrdVer); - PageUtils.putLong(dstPageAddr, off + 16, mvccCntr); - - long newMvccCrdVer = getNewMvccCoordinatorVersion(srcPageAddr, srcIdx); - - PageUtils.putLong(dstPageAddr, off + 24, newMvccCrdVer); - - if (newMvccCrdVer != 0) { - long newMvccCntr = getNewMvccCounter(srcPageAddr, srcIdx); - - assertMvccVersionValid(newMvccCrdVer, newMvccCntr); - - PageUtils.putLong(dstPageAddr, off + 32, newMvccCntr); - } - } + H2IOUtils.store(dstPageAddr, offset(dstIdx), srcIo, srcPageAddr, srcIdx, storeMvccInfo()); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java index d7741dc..8dc8c96 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java @@ -17,125 +17,17 @@ package org.apache.ignite.internal.processors.query.h2.database.io; -import java.util.List; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.pagemem.PageUtils; -import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusInnerIO; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; -import org.apache.ignite.internal.processors.query.h2.database.H2Tree; -import org.apache.ignite.internal.processors.query.h2.database.InlineIndexHelper; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; - /** * Inner page for H2 row references. */ -public class H2ExtrasInnerIO extends BPlusInnerIO<GridH2SearchRow> { - /** Payload size. */ - private final int payloadSize; - - /** */ - public static void register() { - for (short payload = 1; payload <= PageIO.MAX_PAYLOAD_SIZE; payload++) - PageIO.registerH2ExtraInner(getVersions((short)(PageIO.T_H2_EX_REF_INNER_START + payload - 1), payload)); - } - - /** - * @param payload Payload size. - * @param mvccEnabled Mvcc flag. - * @return IOVersions for given payload. - */ - @SuppressWarnings("unchecked") - public static IOVersions<? extends BPlusInnerIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) { - assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE; - - if (payload == 0) - return mvccEnabled ? H2MvccInnerIO.VERSIONS : H2InnerIO.VERSIONS; - else - return (IOVersions<BPlusInnerIO<GridH2SearchRow>>)PageIO.getInnerVersions((short)(payload - 1)); - } - - /** - * @param type Type. - * @param payload Payload size. - * @return Instance of IO versions. - */ - private static IOVersions<H2ExtrasInnerIO> getVersions(short type, short payload) { - return new IOVersions<>(new H2ExtrasInnerIO(type, 1, payload)); - } - +public class H2ExtrasInnerIO extends AbstractH2ExtrasInnerIO implements H2RowLinkIO { /** * @param type Page type. * @param ver Page format version. * @param payloadSize Payload size. */ - private H2ExtrasInnerIO(short type, int ver, int payloadSize) { - super(type, ver, true, 8 + payloadSize); - this.payloadSize = payloadSize; - } - - /** {@inheritDoc} */ - @SuppressWarnings("ForLoopReplaceableByForEach") - @Override public void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { - GridH2Row row0 = (GridH2Row)row; - - assert row0.link() != 0 : row0; - - List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes(); - - assert inlineIdxs != null : "no inline index helpers"; - - - int fieldOff = 0; - - for (int i = 0; i < inlineIdxs.size(); i++) { - InlineIndexHelper idx = inlineIdxs.get(i); - - int size = idx.put(pageAddr, off + fieldOff, row.getValue(idx.columnIndex()), payloadSize - fieldOff); - - if (size == 0) - break; - - fieldOff += size; - } - - PageUtils.putLong(pageAddr, off + payloadSize, row0.link()); - } - - /** {@inheritDoc} */ - @Override public GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx) - throws IgniteCheckedException { - long link = getLink(pageAddr, idx); - - assert link != 0; - - return ((H2Tree)tree).getRowFactory().getRow(link); - } - - /** {@inheritDoc} */ - @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { - int srcOff = srcIo.offset(srcIdx); - - byte[] payload = PageUtils.getBytes(srcPageAddr, srcOff, payloadSize); - long link = PageUtils.getLong(srcPageAddr, srcOff + payloadSize); - - assert link != 0; - - int dstOff = offset(dstIdx); - - PageUtils.putBytes(dstPageAddr, dstOff, payload); - PageUtils.putLong(dstPageAddr, dstOff + payloadSize, link); - } - - /** - * @param pageAddr Page address. - * @param idx Index. - * @return Link to row. - */ - private long getLink(long pageAddr, int idx) { - return PageUtils.getLong(pageAddr, offset(idx) + payloadSize); + H2ExtrasInnerIO(short type, int ver, int payloadSize) { + super(type, ver, 8, payloadSize); } } + http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java index 46d6fd1..085f98b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java @@ -17,122 +17,16 @@ package org.apache.ignite.internal.processors.query.h2.database.io; -import java.util.List; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.pagemem.PageUtils; -import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusLeafIO; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; -import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; -import org.apache.ignite.internal.processors.query.h2.database.H2Tree; -import org.apache.ignite.internal.processors.query.h2.database.InlineIndexHelper; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; - /** * Leaf page for H2 row references. */ -public class H2ExtrasLeafIO extends BPlusLeafIO<GridH2SearchRow> { - /** Payload size. */ - private final int payloadSize; - - /** */ - public static void register() { - for (short payload = 1; payload <= PageIO.MAX_PAYLOAD_SIZE; payload++) - PageIO.registerH2ExtraLeaf(getVersions((short)(PageIO.T_H2_EX_REF_LEAF_START + payload - 1), payload)); - } - - /** - * @param payload Payload size. - * @param mvccEnabled Mvcc flag. - * @return IOVersions for given payload. - */ - @SuppressWarnings("unchecked") - public static IOVersions<? extends BPlusLeafIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) { - assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE; - - if (payload == 0) - return mvccEnabled ? H2MvccLeafIO.VERSIONS : H2LeafIO.VERSIONS; - else - return (IOVersions<BPlusLeafIO<GridH2SearchRow>>)PageIO.getLeafVersions((short)(payload - 1)); - } - - /** - * @param type Type. - * @param payload Payload size. - * @return Versions. - */ - private static IOVersions<H2ExtrasLeafIO> getVersions(short type, short payload) { - return new IOVersions<>(new H2ExtrasLeafIO(type, 1, payload)); - } - +public class H2ExtrasLeafIO extends AbstractH2ExtrasLeafIO { /** * @param type Page type. * @param ver Page format version. * @param payloadSize Payload size. */ - private H2ExtrasLeafIO(short type, int ver, int payloadSize) { - super(type, ver, 8 + payloadSize); - this.payloadSize = payloadSize; - } - - /** {@inheritDoc} */ - @SuppressWarnings("ForLoopReplaceableByForEach") - @Override public void storeByOffset(long pageAddr, int off, GridH2SearchRow row) { - GridH2Row row0 = (GridH2Row)row; - - assert row0.link() != 0; - - List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes(); - - assert inlineIdxs != null : "no inline index helpers"; - - int fieldOff = 0; - - for (int i = 0; i < inlineIdxs.size(); i++) { - InlineIndexHelper idx = inlineIdxs.get(i); - - int size = idx.put(pageAddr, off + fieldOff, row.getValue(idx.columnIndex()), payloadSize - fieldOff); - - if (size == 0) - break; - - fieldOff += size; - } - - PageUtils.putLong(pageAddr, off + payloadSize, row0.link()); - } - - /** {@inheritDoc} */ - @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx) { - int srcOff = srcIo.offset(srcIdx); - - byte[] payload = PageUtils.getBytes(srcPageAddr, srcOff, payloadSize); - long link = PageUtils.getLong(srcPageAddr, srcOff + payloadSize); - - assert link != 0; - - int dstOff = offset(dstIdx); - - PageUtils.putBytes(dstPageAddr, dstOff, payload); - PageUtils.putLong(dstPageAddr, dstOff + payloadSize, link); - } - - /** {@inheritDoc} */ - @Override public GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx) - throws IgniteCheckedException { - long link = getLink(pageAddr, idx); - - return ((H2Tree)tree).getRowFactory().getRow(link); - } - - /** - * @param pageAddr Page address. - * @param idx Index. - * @return Link to row. - */ - private long getLink(long pageAddr, int idx) { - return PageUtils.getLong(pageAddr, offset(idx) + payloadSize); + H2ExtrasLeafIO(short type, int ver, int payloadSize) { + super(type, ver, 8, payloadSize); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IOUtils.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IOUtils.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IOUtils.java new file mode 100644 index 0000000..54b168d --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IOUtils.java @@ -0,0 +1,90 @@ +/* + * 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.query.h2.database.io; + +import org.apache.ignite.internal.pagemem.PageUtils; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow; + +import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.assertMvccVersionValid; + +public class H2IOUtils { + /** + * @param row + * @param pageAddr + * @param off + */ + static void storeRow(GridH2Row row, long pageAddr, int off, boolean storeMvcc) { + assert row.link() != 0; + + PageUtils.putLong(pageAddr, off, row.link()); + + if (storeMvcc) { + long mvccCrdVer = row.mvccCoordinatorVersion(); + long mvccCntr = row.mvccCounter(); + + assert assertMvccVersionValid(mvccCrdVer, mvccCntr); + + PageUtils.putLong(pageAddr, off + 8, mvccCrdVer); + PageUtils.putLong(pageAddr, off + 16, mvccCntr); + + long newMvccCrdVer = row.newMvccCoordinatorVersion(); + + PageUtils.putLong(pageAddr, off + 24, newMvccCrdVer); + + if (newMvccCrdVer != 0) { + long newMvccCntr = row.newMvccCounter(); + + assert assertMvccVersionValid(newMvccCrdVer, newMvccCntr); + + PageUtils.putLong(pageAddr, off + 32, newMvccCntr); + } + } + } + + static void store(long dstPageAddr, int dstOff, BPlusIO<GridH2SearchRow> srcIo, long srcPageAddr, int srcIdx, boolean storeMvcc) { + H2RowLinkIO rowIo = (H2RowLinkIO)srcIo; + + long link = rowIo.getLink(srcPageAddr, srcIdx); + + PageUtils.putLong(dstPageAddr, dstOff, link); + + if (storeMvcc) { + long mvccCrdVer = rowIo.getMvccCoordinatorVersion(srcPageAddr, srcIdx); + long mvccCntr = rowIo.getMvccCounter(srcPageAddr, srcIdx); + + assert assertMvccVersionValid(mvccCrdVer, mvccCntr); + + PageUtils.putLong(dstPageAddr, dstOff + 8, mvccCrdVer); + PageUtils.putLong(dstPageAddr, dstOff + 16, mvccCntr); + + long newMvccCrdVer = rowIo.getNewMvccCoordinatorVersion(srcPageAddr, srcIdx); + + PageUtils.putLong(dstPageAddr, dstOff + 24, newMvccCrdVer); + + if (newMvccCrdVer != 0) { + long newMvccCntr = rowIo.getNewMvccCounter(srcPageAddr, srcIdx); + + assertMvccVersionValid(newMvccCrdVer, newMvccCntr); + + PageUtils.putLong(dstPageAddr, dstOff + 32, newMvccCntr); + } + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasInnerIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasInnerIO.java new file mode 100644 index 0000000..fa6978e --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasInnerIO.java @@ -0,0 +1,77 @@ +/* + * 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.query.h2.database.io; + +import org.apache.ignite.internal.pagemem.PageUtils; + +/** + * + */ +class H2MvccExtrasInnerIO extends AbstractH2ExtrasInnerIO { + /** */ + private final int crdVerOff; + + /** */ + private final int cntrOff; + + /** */ + private final int newCrdVerOff; + + /** */ + private final int newCntrOff; + + /** + * @param type Page type. + * @param ver Page format version. + * @param payloadSize Payload size. + */ + H2MvccExtrasInnerIO(short type, int ver, int payloadSize) { + super(type, ver, 40, payloadSize); + + crdVerOff = payloadSize + 8; + cntrOff = payloadSize + 16; + newCrdVerOff = payloadSize + 24; + newCntrOff = payloadSize + 32; + } + + /** {@inheritDoc} */ + @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + crdVerOff); + } + + /** {@inheritDoc} */ + @Override public long getMvccCounter(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + cntrOff); + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCoordinatorVersion(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + newCrdVerOff); + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCounter(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + newCntrOff); + } + + /** {@inheritDoc} */ + @Override public boolean storeMvccInfo() { + return true; + } +} + http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasLeafIO.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasLeafIO.java new file mode 100644 index 0000000..2448e76 --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccExtrasLeafIO.java @@ -0,0 +1,76 @@ +/* + * 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.query.h2.database.io; + +import org.apache.ignite.internal.pagemem.PageUtils; + +/** + * Leaf page for H2 row references. + */ +class H2MvccExtrasLeafIO extends AbstractH2ExtrasLeafIO { + /** */ + private final int crdVerOff; + + /** */ + private final int cntrOff; + + /** */ + private final int newCrdVerOff; + + /** */ + private final int newCntrOff; + + /** + * @param type Page type. + * @param ver Page format version. + * @param payloadSize Payload size. + */ + H2MvccExtrasLeafIO(short type, int ver, int payloadSize) { + super(type, ver, 40, payloadSize); + + crdVerOff = payloadSize + 8; + cntrOff = payloadSize + 16; + newCrdVerOff = payloadSize + 24; + newCntrOff = payloadSize + 32; + } + + /** {@inheritDoc} */ + @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + crdVerOff); + } + + /** {@inheritDoc} */ + @Override public long getMvccCounter(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + cntrOff); + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCoordinatorVersion(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + newCrdVerOff); + } + + /** {@inheritDoc} */ + @Override public long getNewMvccCounter(long pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx) + newCntrOff); + } + + /** {@inheritDoc} */ + @Override public boolean storeMvccInfo() { + return true; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java index ba12dd2..62b459a 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java @@ -98,7 +98,7 @@ public class GridH2KeyValueRowOnheap extends GridH2Row { /** {@inheritDoc} */ @Override public long newMvccCounter() { - return newVer != null ? newVer.counter(): CacheCoordinatorsProcessor.COUNTER_NA; + return newVer != null ? newVer.counter(): CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java index 3333214..70f0330 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java @@ -107,13 +107,11 @@ public abstract class GridH2Row extends GridH2SearchRowAdapter implements CacheD return false; } - /** {@inheritDoc} */ public long newMvccCoordinatorVersion() { return 0; } - /** {@inheritDoc} */ public long newMvccCounter() { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java index 2c05c68..4fc8ee5 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java @@ -109,6 +109,6 @@ public abstract class GridH2SearchRowAdapter implements GridH2SearchRow { /** {@inheritDoc} */ @Override public long mvccCounter() { - return CacheCoordinatorsProcessor.COUNTER_NA; + return CacheCoordinatorsProcessor.MVCC_COUNTER_NA; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/4abbf601/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java index c1743af..baa4d92 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java @@ -457,7 +457,7 @@ public class GridH2Table extends TableBase { */ @SuppressWarnings("LockAcquiredButNotSafelyReleased") private boolean doUpdate(final GridH2Row row, boolean del) throws IgniteCheckedException { - assert !cctx.mvccEnabled() || row.mvccCounter() != CacheCoordinatorsProcessor.COUNTER_NA : row; + assert !cctx.mvccEnabled() || row.mvccCounter() != CacheCoordinatorsProcessor.MVCC_COUNTER_NA : row; // Here we assume that each key can't be updated concurrently and case when different indexes // getting updated from different threads with different rows with the same key is impossible. lock(false); @@ -479,6 +479,9 @@ public class GridH2Table extends TableBase { assert replaced == (row.newMvccCoordinatorVersion() != 0); old = null; + + if (!replaced) + size.increment(); } else { old = pk.put(row);