You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/10/17 12:09:42 UTC
ignite git commit: ignite-5937 sql indexes
Repository: ignite
Updated Branches:
refs/heads/ignite-5937 f0cad9f89 -> 8d9e0f75c
ignite-5937 sql indexes
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8d9e0f75
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8d9e0f75
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8d9e0f75
Branch: refs/heads/ignite-5937
Commit: 8d9e0f75c7d852ac32ff26e4e16a1935493a0796
Parents: f0cad9f
Author: sboikov <sb...@gridgain.com>
Authored: Tue Oct 17 13:32:54 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Oct 17 15:09:29 2017 +0300
----------------------------------------------------------------------
.../cache/mvcc/CacheCoordinatorsProcessor.java | 12 ++
.../cache/persistence/tree/io/PageIO.java | 32 ++++-
.../processors/cache/tree/MvccDataRow.java | 8 +-
.../query/h2/opt/GridH2SpatialIndex.java | 5 +
.../processors/query/h2/IgniteH2Indexing.java | 4 +-
.../query/h2/database/H2PkHashIndex.java | 9 +-
.../query/h2/database/H2RowFactory.java | 24 ++--
.../processors/query/h2/database/H2Tree.java | 61 ++++++++--
.../query/h2/database/H2TreeIndex.java | 36 +++++-
.../query/h2/database/io/AbstractH2InnerIO.java | 122 +++++++++++++++++++
.../query/h2/database/io/AbstractH2LeafIO.java | 121 ++++++++++++++++++
.../query/h2/database/io/H2ExtrasInnerIO.java | 17 +--
.../query/h2/database/io/H2ExtrasLeafIO.java | 17 +--
.../query/h2/database/io/H2InnerIO.java | 41 +------
.../query/h2/database/io/H2LeafIO.java | 41 +------
.../query/h2/database/io/H2MvccInnerIO.java | 42 +++++++
.../query/h2/database/io/H2MvccLeafIO.java | 42 +++++++
.../query/h2/database/io/H2RowLinkIO.java | 19 +++
.../query/h2/opt/GridH2IndexBase.java | 6 +
.../query/h2/opt/GridH2MetaTable.java | 10 ++
.../query/h2/opt/GridH2PlainRowFactory.java | 30 +++++
.../processors/query/h2/opt/GridH2Row.java | 4 +-
.../query/h2/opt/GridH2SearchRow.java | 35 ++++++
.../query/h2/opt/GridH2SearchRowAdapter.java | 2 +-
.../processors/query/h2/opt/GridH2Table.java | 21 +++-
.../cache/mvcc/CacheMvccSqlQueriesTest.java | 5 +-
26 files changed, 634 insertions(+), 132 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 fd3c2af..5e76fe1 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
@@ -148,6 +148,18 @@ public class CacheCoordinatorsProcessor extends GridProcessorAdapter {
}
/**
+ * @param crdVer Mvcc coordinator version.
+ * @param cntr Counter.
+ * @return Always {@code true}.
+ */
+ public static boolean assertMvccVersionValid(long crdVer, long cntr) {
+ assert unmaskCoordinatorVersion(crdVer) > 0;
+ assert cntr != COUNTER_NA;
+
+ return true;
+ }
+
+ /**
* @param crdVer Coordinator version.
* @return Coordinator version with removed value flag.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 2de0b8c..6267ce0 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
@@ -88,6 +88,12 @@ public abstract class PageIO {
/** */
private static IOVersions<? extends BPlusLeafIO<?>> h2LeafIOs;
+ /** */
+ private static IOVersions<? extends BPlusInnerIO<?>> h2MvccInnerIOs;
+
+ /** */
+ private static IOVersions<? extends BPlusLeafIO<?>> h2MvccLeafIOs;
+
/** Maximum payload size. */
public static final short MAX_PAYLOAD_SIZE = 2048;
@@ -202,6 +208,12 @@ public abstract class PageIO {
public static final short T_DATA_REF_MVCC_LEAF = 22;
/** */
+ public static final short T_H2_MVCC_REF_LEAF = 23;
+
+ /** */
+ public static final short T_H2_MVCC_REF_INNER = 24;
+
+ /** */
private final int ver;
/** */
@@ -334,13 +346,19 @@ public abstract class PageIO {
*
* @param innerIOs Inner IO versions.
* @param leafIOs Leaf IO versions.
+ * @param mvccInnerIOs Inner IO versions with mvcc enabled.
+ * @param mvccLeafIOs Leaf IO versions with mvcc enabled.
*/
public static void registerH2(
IOVersions<? extends BPlusInnerIO<?>> innerIOs,
- IOVersions<? extends BPlusLeafIO<?>> leafIOs
+ IOVersions<? extends BPlusLeafIO<?>> leafIOs,
+ IOVersions<? extends BPlusInnerIO<?>> mvccInnerIOs,
+ IOVersions<? extends BPlusLeafIO<?>> mvccLeafIOs
) {
h2InnerIOs = innerIOs;
h2LeafIOs = leafIOs;
+ h2MvccInnerIOs = mvccInnerIOs;
+ h2MvccLeafIOs = mvccLeafIOs;
}
/**
@@ -513,6 +531,18 @@ public abstract class PageIO {
return (Q)h2LeafIOs.forVersion(ver);
+ case T_H2_MVCC_REF_INNER:
+ if (h2MvccInnerIOs == null)
+ break;
+
+ return (Q)h2MvccInnerIOs.forVersion(ver);
+
+ case T_H2_MVCC_REF_LEAF:
+ if (h2MvccLeafIOs == null)
+ break;
+
+ return (Q)h2MvccLeafIOs.forVersion(ver);
+
case T_DATA_REF_INNER:
return (Q)DataInnerIO.VERSIONS.forVersion(ver);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
index 916ea93..175cf72 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
@@ -18,10 +18,9 @@
package org.apache.ignite.internal.processors.cache.tree;
import org.apache.ignite.internal.processors.cache.CacheGroupContext;
-import org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor;
import org.apache.ignite.internal.util.typedef.internal.S;
-import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.unmaskCoordinatorVersion;
+import static org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor.assertMvccVersionValid;
/**
*
@@ -42,11 +41,10 @@ public class MvccDataRow extends DataRow {
* @param crdVer Mvcc coordinator version.
* @param mvccCntr Mvcc counter.
*/
- MvccDataRow(CacheGroupContext grp, int hash, long link, int part, RowData rowData, long crdVer, long mvccCntr) {
+ public MvccDataRow(CacheGroupContext grp, int hash, long link, int part, RowData rowData, long crdVer, long mvccCntr) {
super(grp, hash, link, part, rowData);
- assert unmaskCoordinatorVersion(crdVer) > 0 : crdVer;
- assert mvccCntr != CacheCoordinatorsProcessor.COUNTER_NA;
+ assertMvccVersionValid(crdVer, mvccCntr);
this.crdVer = crdVer;
this.mvccCntr = mvccCntr;
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
index 2cd36b3..fce18f1 100644
--- a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
+++ b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
@@ -200,6 +200,11 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
}
}
+ /** {@inheritDoc} */
+ @Override public boolean putx(GridH2Row row) {
+ return put(row) != null;
+ }
+
/**
* @param row Row.
* @param rowId Row id.
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 95f24ef..9e8f593 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -98,6 +98,8 @@ import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasInnerI
import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasLeafIO;
import org.apache.ignite.internal.processors.query.h2.database.io.H2InnerIO;
import org.apache.ignite.internal.processors.query.h2.database.io.H2LeafIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2MvccInnerIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2MvccLeafIO;
import org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor;
import org.apache.ignite.internal.processors.query.h2.opt.DistributedJoinMode;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2DefaultTableEngine;
@@ -183,7 +185,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
* Register IO for indexes.
*/
static {
- PageIO.registerH2(H2InnerIO.VERSIONS, H2LeafIO.VERSIONS);
+ PageIO.registerH2(H2InnerIO.VERSIONS, H2LeafIO.VERSIONS, H2MvccInnerIO.VERSIONS, H2MvccLeafIO.VERSIONS);
H2ExtrasInnerIO.register();
H2ExtrasLeafIO.register();
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
index 59bf153..724396f 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
@@ -124,13 +124,20 @@ public class H2PkHashIndex extends GridH2IndexBase {
@SuppressWarnings("StatementWithEmptyBody")
@Override public GridH2Row put(GridH2Row row) {
// Should not be called directly. Rows are inserted into underlying cache data stores.
-
assert false;
throw DbException.getUnsupportedException("put");
}
/** {@inheritDoc} */
+ @Override public boolean putx(GridH2Row row) {
+ // Should not be called directly. Rows are inserted into underlying cache data stores.
+ assert false;
+
+ throw DbException.getUnsupportedException("putx");
+ }
+
+ /** {@inheritDoc} */
@Override public GridH2Row remove(SearchRow row) {
// Should not be called directly. Rows are removed from underlying cache data stores.
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
index 40b9b0a..0d3e7bd 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
@@ -18,9 +18,9 @@
package org.apache.ignite.internal.processors.query.h2.database;
import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter;
+import org.apache.ignite.internal.processors.cache.tree.MvccDataRow;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
@@ -60,17 +60,23 @@ public class H2RowFactory {
rowBuilder.initFromLink(cctx.group(), CacheDataRowAdapter.RowData.FULL);
- GridH2Row row;
-
- try {
- row = rowDesc.createRow(rowBuilder);
- }
- catch (IgniteCheckedException e) {
- throw new IgniteException(e);
- }
+ GridH2Row row = rowDesc.createRow(rowBuilder);
assert row.version() != null;
return row;
}
+
+ /**
+ * @param link Link.
+ * @param mvccCrdVer Mvcc coordinator version.
+ * @param mvccCntr Mvcc counter.
+ * @return Row.
+ * @throws IgniteCheckedException If failed.
+ */
+ public GridH2Row getMvccRow(long link, long mvccCrdVer, long mvccCntr) throws IgniteCheckedException {
+ MvccDataRow row = new MvccDataRow(cctx.group(), 0, link, 0, null, mvccCrdVer, mvccCntr);
+
+ return rowDesc.createRow(row);
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 6214be4..1355a1f 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
@@ -30,14 +30,19 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseL
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.opt.GridH2Row;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow;
+import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
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.unmaskCoordinatorVersion;
+
/**
*/
-public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
+public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> {
/** */
private final H2RowFactory rowStore;
@@ -60,6 +65,9 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
}
};
+ /** */
+ private final boolean mvccEnabled;
+
/**
* @param name Tree name.
* @param reuseList Reuse list.
@@ -83,7 +91,8 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
boolean initNew,
IndexColumn[] cols,
List<InlineIndexHelper> inlineIdxs,
- int inlineSize
+ int inlineSize,
+ boolean mvccEnabled
) throws IgniteCheckedException {
super(name, grpId, pageMem, wal, globalRmvId, metaPageId, reuseList);
@@ -93,6 +102,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
}
this.inlineSize = inlineSize;
+ this.mvccEnabled = mvccEnabled;
assert rowStore != null;
@@ -105,7 +115,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
for (int i = 0; i < cols.length; i++)
columnIds[i] = cols[i].column.getColumnId();
- setIos(H2ExtrasInnerIO.getVersions(inlineSize), H2ExtrasLeafIO.getVersions(inlineSize));
+ setIos(H2ExtrasInnerIO.getVersions(inlineSize, mvccEnabled), H2ExtrasLeafIO.getVersions(inlineSize, mvccEnabled));
initTree(initNew, inlineSize);
}
@@ -118,7 +128,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
}
/** {@inheritDoc} */
- @Override protected GridH2Row getRow(BPlusIO<SearchRow> io, long pageAddr, int idx, Object ignore)
+ @Override protected GridH2Row getRow(BPlusIO<GridH2SearchRow> io, long pageAddr, int idx, Object ignore)
throws IgniteCheckedException {
return (GridH2Row)io.getLookupRow(this, pageAddr, idx);
}
@@ -126,7 +136,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
/**
* @return Inline size.
*/
- public int inlineSize() {
+ private int inlineSize() {
return inlineSize;
}
@@ -159,8 +169,8 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
/** {@inheritDoc} */
@SuppressWarnings("ForLoopReplaceableByForEach")
- @Override protected int compare(BPlusIO<SearchRow> io, long pageAddr, int idx,
- SearchRow row) throws IgniteCheckedException {
+ @Override protected int compare(BPlusIO<GridH2SearchRow> io, long pageAddr, int idx,
+ GridH2SearchRow row) throws IgniteCheckedException {
if (inlineSize() == 0)
return compareRows(getRow(io, pageAddr, idx), row);
else {
@@ -204,6 +214,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
int idx0 = col.column.getColumnId();
Value v2 = row.getValue(idx0);
+
if (v2 == null) {
// Can't compare further.
return 0;
@@ -212,6 +223,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
Value v1 = rowData.getValue(idx0);
int c = compareValues(v1, v2);
+
if (c != 0)
return InlineIndexHelper.fixSort(c, col.sortType);
}
@@ -227,25 +239,56 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
* @param r2 Row 2.
* @return Compare result.
*/
- private int compareRows(GridH2Row r1, SearchRow r2) {
+ private int compareRows(GridH2Row r1, GridH2SearchRow r2) {
if (r1 == r2)
return 0;
for (int i = 0, len = cols.length; i < len; i++) {
int idx = columnIds[i];
+
Value v1 = r1.getValue(idx);
Value v2 = r2.getValue(idx);
+
if (v1 == null || v2 == null) {
- // can't compare further
+ // Can't compare further.
return 0;
}
+
int c = compareValues(v1, v2);
+
if (c != 0)
return InlineIndexHelper.fixSort(c, cols[i].sortType);
}
+
+ if (mvccEnabled) {
+ long crdVer1 = r1.mvccCoordinatorVersion();
+ long crdVer2 = r2.mvccCoordinatorVersion();
+
+ assert crdVer1 != 0 : r1;
+ assert crdVer2 != 0 : r2;
+
+ int c = Long.compare(unmaskCoordinatorVersion(crdVer1), unmaskCoordinatorVersion(crdVer2));
+
+ if (c != 0)
+ return c;
+
+ assert r1.mvccCounter() != COUNTER_NA : r1;
+ assert r2.mvccCounter() != COUNTER_NA : r2;
+
+ c = Long.compare(r1.mvccCounter(), r2.mvccCounter());
+
+ if (c != 0)
+ return c;
+ }
+
return 0;
}
/** Compares two Values. */
public abstract int compareValues(Value v1, Value v2);
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(H2Tree.class, this, "super", super.toString());
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
index 1a3ea4a..19ba504 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
@@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO;
import org.apache.ignite.internal.processors.query.h2.H2Cursor;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
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.processors.query.h2.opt.GridH2Table;
import org.apache.ignite.internal.util.IgniteTree;
import org.apache.ignite.internal.util.lang.GridCursor;
@@ -118,7 +119,8 @@ public class H2TreeIndex extends GridH2IndexBase {
page.isAllocated(),
cols,
inlineIdxs,
- computeInlineSize(inlineIdxs, inlineSize)) {
+ computeInlineSize(inlineIdxs, inlineSize),
+ cctx.mvccEnabled()) {
@Override public int compareValues(Value v1, Value v2) {
return v1 == v2 ? 0 : table.compareTypeSafe(v1, v2);
}
@@ -165,6 +167,9 @@ public class H2TreeIndex extends GridH2IndexBase {
/** {@inheritDoc} */
@Override public Cursor find(Session ses, SearchRow lower, SearchRow upper) {
try {
+ assert lower == null || lower instanceof GridH2SearchRow : lower;
+ assert upper == null || upper instanceof GridH2SearchRow : upper;
+
IndexingQueryFilter f = threadLocalFilter();
IndexingQueryCacheFilter p = null;
@@ -178,7 +183,7 @@ public class H2TreeIndex extends GridH2IndexBase {
H2Tree tree = treeForRead(seg);
- return new H2Cursor(tree.find(lower, upper), p);
+ return new H2Cursor(tree.find((GridH2SearchRow)lower, (GridH2SearchRow)upper), p);
}
catch (IgniteCheckedException e) {
throw DbException.convert(e);
@@ -205,7 +210,28 @@ public class H2TreeIndex extends GridH2IndexBase {
}
/** {@inheritDoc} */
+ @Override public boolean putx(GridH2Row row) {
+ try {
+ InlineIndexHelper.setCurrentInlineIndexes(inlineIdxs);
+
+ int seg = segmentForRow(row);
+
+ H2Tree tree = treeForRead(seg);
+
+ return tree.putx(row);
+ }
+ catch (IgniteCheckedException e) {
+ throw DbException.convert(e);
+ }
+ finally {
+ InlineIndexHelper.clearCurrentInlineIndexes();
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public GridH2Row remove(SearchRow row) {
+ assert row instanceof GridH2SearchRow : row;
+
try {
InlineIndexHelper.setCurrentInlineIndexes(inlineIdxs);
@@ -213,7 +239,7 @@ public class H2TreeIndex extends GridH2IndexBase {
H2Tree tree = treeForRead(seg);
- return tree.remove(row);
+ return tree.remove((GridH2SearchRow)row);
}
catch (IgniteCheckedException e) {
throw DbException.convert(e);
@@ -225,6 +251,8 @@ public class H2TreeIndex extends GridH2IndexBase {
/** {@inheritDoc} */
@Override public void removex(SearchRow row) {
+ assert row instanceof GridH2SearchRow : row;
+
try {
InlineIndexHelper.setCurrentInlineIndexes(inlineIdxs);
@@ -232,7 +260,7 @@ public class H2TreeIndex extends GridH2IndexBase {
H2Tree tree = treeForRead(seg);
- tree.removex(row);
+ tree.removex((GridH2SearchRow)row);
}
catch (IgniteCheckedException e) {
throw DbException.convert(e);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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
new file mode 100644
index 0000000..d09d188
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2InnerIO.java
@@ -0,0 +1,122 @@
+/*
+ * 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.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.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.
+ */
+public abstract class AbstractH2InnerIO extends BPlusInnerIO<GridH2SearchRow> implements H2RowLinkIO {
+ /**
+ * @param type Page type.
+ * @param ver Page format version.
+ * @param itemSize Single item size on page.
+ */
+ AbstractH2InnerIO(int type, int ver, int itemSize) {
+ super(type, ver, true, itemSize);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean storeMvccInfo() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @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);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public 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 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);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getLink(long pageAddr, int idx) {
+ return PageUtils.getLong(pageAddr, offset(idx));
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) {
+ assert storeMvccInfo();
+
+ return PageUtils.getLong(pageAddr, offset(idx) + 8);
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getMvccCounter(long pageAddr, int idx) {
+ assert storeMvccInfo();
+
+ return PageUtils.getLong(pageAddr, offset(idx) + 16);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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
new file mode 100644
index 0000000..738a13d
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/AbstractH2LeafIO.java
@@ -0,0 +1,121 @@
+/*
+ * 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.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.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.
+ */
+public abstract class AbstractH2LeafIO extends BPlusLeafIO<GridH2SearchRow> implements H2RowLinkIO {
+ /**
+ * @param type Page type.
+ * @param ver Page format version.
+ * @param itemSize Single item size on page.
+ */
+ AbstractH2LeafIO(int type, int ver, int itemSize) {
+ super(type, ver, itemSize);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean storeMvccInfo() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @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);
+ }
+ }
+
+ /** {@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);
+ }
+ }
+
+ /** {@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 long getLink(long pageAddr, int idx) {
+ return PageUtils.getLong(pageAddr, offset(idx));
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getMvccCoordinatorVersion(long pageAddr, int idx) {
+ assert storeMvccInfo();
+
+ return PageUtils.getLong(pageAddr, offset(idx) + 8);
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getMvccCounter(long pageAddr, int idx) {
+ assert storeMvccInfo();
+
+ return PageUtils.getLong(pageAddr, offset(idx) + 16);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 b8877e9..d7741dc 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
@@ -28,12 +28,12 @@ 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.h2.result.SearchRow;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow;
/**
* Inner page for H2 row references.
*/
-public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
+public class H2ExtrasInnerIO extends BPlusInnerIO<GridH2SearchRow> {
/** Payload size. */
private final int payloadSize;
@@ -45,16 +45,17 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
/**
* @param payload Payload size.
+ * @param mvccEnabled Mvcc flag.
* @return IOVersions for given payload.
*/
@SuppressWarnings("unchecked")
- public static IOVersions<? extends BPlusInnerIO<SearchRow>> getVersions(int payload) {
+ public static IOVersions<? extends BPlusInnerIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) {
assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE;
if (payload == 0)
- return H2InnerIO.VERSIONS;
+ return mvccEnabled ? H2MvccInnerIO.VERSIONS : H2InnerIO.VERSIONS;
else
- return (IOVersions<BPlusInnerIO<SearchRow>>)PageIO.getInnerVersions((short)(payload - 1));
+ return (IOVersions<BPlusInnerIO<GridH2SearchRow>>)PageIO.getInnerVersions((short)(payload - 1));
}
/**
@@ -78,7 +79,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
/** {@inheritDoc} */
@SuppressWarnings("ForLoopReplaceableByForEach")
- @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
+ @Override public void storeByOffset(long pageAddr, int off, GridH2SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
assert row0.link() != 0 : row0;
@@ -105,7 +106,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
}
/** {@inheritDoc} */
- @Override public SearchRow getLookupRow(BPlusTree<SearchRow, ?> tree, long pageAddr, int idx)
+ @Override public GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx)
throws IgniteCheckedException {
long link = getLink(pageAddr, idx);
@@ -115,7 +116,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
}
/** {@inheritDoc} */
- @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
+ @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);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 6161f8d..46d6fd1 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
@@ -28,12 +28,12 @@ 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.h2.result.SearchRow;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2SearchRow;
/**
* Leaf page for H2 row references.
*/
-public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
+public class H2ExtrasLeafIO extends BPlusLeafIO<GridH2SearchRow> {
/** Payload size. */
private final int payloadSize;
@@ -45,16 +45,17 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
/**
* @param payload Payload size.
+ * @param mvccEnabled Mvcc flag.
* @return IOVersions for given payload.
*/
@SuppressWarnings("unchecked")
- public static IOVersions<? extends BPlusLeafIO<SearchRow>> getVersions(int payload) {
+ public static IOVersions<? extends BPlusLeafIO<GridH2SearchRow>> getVersions(int payload, boolean mvccEnabled) {
assert payload >= 0 && payload <= PageIO.MAX_PAYLOAD_SIZE;
if (payload == 0)
- return H2LeafIO.VERSIONS;
+ return mvccEnabled ? H2MvccLeafIO.VERSIONS : H2LeafIO.VERSIONS;
else
- return (IOVersions<BPlusLeafIO<SearchRow>>)PageIO.getLeafVersions((short)(payload - 1));
+ return (IOVersions<BPlusLeafIO<GridH2SearchRow>>)PageIO.getLeafVersions((short)(payload - 1));
}
/**
@@ -78,7 +79,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
/** {@inheritDoc} */
@SuppressWarnings("ForLoopReplaceableByForEach")
- @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
+ @Override public void storeByOffset(long pageAddr, int off, GridH2SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
assert row0.link() != 0;
@@ -104,7 +105,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
}
/** {@inheritDoc} */
- @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
+ @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);
@@ -119,7 +120,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
}
/** {@inheritDoc} */
- @Override public SearchRow getLookupRow(BPlusTree<SearchRow, ?> tree, long pageAddr, int idx)
+ @Override public GridH2SearchRow getLookupRow(BPlusTree<GridH2SearchRow, ?> tree, long pageAddr, int idx)
throws IgniteCheckedException {
long link = getLink(pageAddr, idx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
index a1f1ce9..9baff7a 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
@@ -17,20 +17,12 @@
package org.apache.ignite.internal.processors.query.h2.database.io;
-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.query.h2.database.H2Tree;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
-import org.h2.result.SearchRow;
/**
* Inner page for H2 row references.
*/
-public class H2InnerIO extends BPlusInnerIO<SearchRow> implements H2RowLinkIO {
+public class H2InnerIO extends AbstractH2InnerIO {
/** */
public static final IOVersions<H2InnerIO> VERSIONS = new IOVersions<>(
new H2InnerIO(1)
@@ -40,35 +32,6 @@ public class H2InnerIO extends BPlusInnerIO<SearchRow> implements H2RowLinkIO {
* @param ver Page format version.
*/
private H2InnerIO(int ver) {
- super(T_H2_REF_INNER, ver, true, 8);
- }
-
- /** {@inheritDoc} */
- @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
- GridH2Row row0 = (GridH2Row)row;
-
- assert row0.link() != 0;
-
- PageUtils.putLong(pageAddr, off, row0.link());
- }
-
- /** {@inheritDoc} */
- @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx)
- throws IgniteCheckedException {
- long link = getLink(pageAddr, idx);
-
- return ((H2Tree)tree).getRowFactory().getRow(link);
- }
-
- /** {@inheritDoc} */
- @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
- long link = ((H2RowLinkIO)srcIo).getLink(srcPageAddr, srcIdx);
-
- PageUtils.putLong(dstPageAddr, offset(dstIdx), link);
- }
-
- /** {@inheritDoc} */
- @Override public long getLink(long pageAddr, int idx) {
- return PageUtils.getLong(pageAddr, offset(idx));
+ super(T_H2_REF_INNER, ver, 8);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
index 85dcf50..8954de0 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
@@ -17,20 +17,12 @@
package org.apache.ignite.internal.processors.query.h2.database.io;
-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.query.h2.database.H2Tree;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
-import org.h2.result.SearchRow;
/**
* Leaf page for H2 row references.
*/
-public class H2LeafIO extends BPlusLeafIO<SearchRow> implements H2RowLinkIO {
+public class H2LeafIO extends AbstractH2LeafIO {
/** */
public static final IOVersions<H2LeafIO> VERSIONS = new IOVersions<>(
new H2LeafIO(1)
@@ -39,36 +31,7 @@ public class H2LeafIO extends BPlusLeafIO<SearchRow> implements H2RowLinkIO {
/**
* @param ver Page format version.
*/
- protected H2LeafIO(int ver) {
+ private H2LeafIO(int ver) {
super(T_H2_REF_LEAF, ver, 8);
}
-
- /** {@inheritDoc} */
- @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
- GridH2Row row0 = (GridH2Row)row;
-
- assert row0.link() != 0;
-
- PageUtils.putLong(pageAddr, off, row0.link());
- }
-
- /** {@inheritDoc} */
- @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
- assert srcIo == this;
-
- PageUtils.putLong(dstPageAddr, offset(dstIdx), getLink(srcPageAddr, srcIdx));
- }
-
- /** {@inheritDoc} */
- @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx)
- throws IgniteCheckedException {
- long link = getLink(pageAddr, idx);
-
- return ((H2Tree)tree).getRowFactory().getRow(link);
- }
-
- /** {@inheritDoc} */
- @Override public long getLink(long pageAddr, int idx) {
- return PageUtils.getLong(pageAddr, offset(idx));
- }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccInnerIO.java
new file mode 100644
index 0000000..e3c8851
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccInnerIO.java
@@ -0,0 +1,42 @@
+/*
+ * 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.processors.cache.persistence.tree.io.IOVersions;
+
+/**
+ * Inner page for H2 row references.
+ */
+public class H2MvccInnerIO extends AbstractH2InnerIO {
+ /** */
+ public static final IOVersions<H2MvccInnerIO> VERSIONS = new IOVersions<>(
+ new H2MvccInnerIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ private H2MvccInnerIO(int ver) {
+ super(T_H2_MVCC_REF_INNER, ver, 24);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean storeMvccInfo() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccLeafIO.java
new file mode 100644
index 0000000..7886e0f
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2MvccLeafIO.java
@@ -0,0 +1,42 @@
+/*
+ * 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.processors.cache.persistence.tree.io.IOVersions;
+
+/**
+ *
+ */
+public class H2MvccLeafIO extends AbstractH2LeafIO {
+ /** */
+ public static final IOVersions<H2MvccLeafIO> VERSIONS = new IOVersions<>(
+ new H2MvccLeafIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ private H2MvccLeafIO(int ver) {
+ super(T_H2_MVCC_REF_LEAF, ver, 24);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean storeMvccInfo() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2RowLinkIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2RowLinkIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2RowLinkIO.java
index ce69197..ca2b9e4 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2RowLinkIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2RowLinkIO.java
@@ -27,4 +27,23 @@ public interface H2RowLinkIO {
* @return Row link.
*/
public long getLink(long pageAddr, int idx);
+
+ /**
+ * @param pageAddr Page address.
+ * @param idx Index.
+ * @return Mvcc coordinator version.
+ */
+ public long getMvccCoordinatorVersion(long pageAddr, int idx);
+
+ /**
+ * @param pageAddr Page address.
+ * @param idx Index.
+ * @return Mvcc counter.
+ */
+ public long getMvccCounter(long pageAddr, int idx);
+
+ /**
+ * @return {@code True} if IO stores mvcc information.
+ */
+ public boolean storeMvccInfo();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 92b7d10..b865e00 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@ -200,6 +200,12 @@ public abstract class GridH2IndexBase extends BaseIndex {
public abstract GridH2Row put(GridH2Row row);
/**
+ * @param row Row.
+ * @return {@code True} if replaced existing row.
+ */
+ public abstract boolean putx(GridH2Row row);
+
+ /**
* Remove row from index.
*
* @param row Row.
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
index 5e09a86..eb94b12 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
@@ -284,6 +284,16 @@ public class GridH2MetaTable extends TableBase {
throw new IllegalStateException("Index: " + idx);
}
}
+
+ /** {@inheritDoc} */
+ @Override public long mvccCoordinatorVersion() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
+ @Override public long mvccCounter() {
+ return 0; // TODO IGNITE-3478
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
index fd8a613..439551d 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
@@ -92,6 +92,16 @@ public class GridH2PlainRowFactory extends RowFactory {
}
/** {@inheritDoc} */
+ @Override public long mvccCoordinatorVersion() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
+ @Override public long mvccCounter() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
@Override public String toString() {
return S.toString(RowKey.class, this);
}
@@ -138,6 +148,16 @@ public class GridH2PlainRowFactory extends RowFactory {
}
/** {@inheritDoc} */
+ @Override public long mvccCoordinatorVersion() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
+ @Override public long mvccCounter() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
@Override public String toString() {
return S.toString(RowPair.class, this);
}
@@ -174,6 +194,16 @@ public class GridH2PlainRowFactory extends RowFactory {
}
/** {@inheritDoc} */
+ @Override public long mvccCoordinatorVersion() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
+ @Override public long mvccCounter() {
+ return 0; // TODO IGNITE-3478
+ }
+
+ /** {@inheritDoc} */
@Override public String toString() {
return S.toString(RowSimple.class, this);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 54e0417..156d010 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
@@ -88,12 +88,12 @@ public abstract class GridH2Row extends GridH2SearchRowAdapter implements CacheD
/** {@inheritDoc} */
@Override public long mvccCoordinatorVersion() {
- throw new UnsupportedOperationException();
+ return row.mvccCoordinatorVersion();
}
/** {@inheritDoc} */
@Override public long mvccCounter() {
- throw new UnsupportedOperationException();
+ return row.mvccCounter();
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRow.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRow.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRow.java
new file mode 100644
index 0000000..9a3518f
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRow.java
@@ -0,0 +1,35 @@
+/*
+ * 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.opt;
+
+import org.h2.result.Row;
+
+/**
+ *
+ */
+public interface GridH2SearchRow extends Row {
+ /**
+ * @return Mvcc coordinator version.
+ */
+ public long mvccCoordinatorVersion();
+
+ /**
+ * @return Mvcc counter.
+ */
+ public long mvccCounter();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 24a90b3..0087d38 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
@@ -25,7 +25,7 @@ import org.h2.value.Value;
/**
* Dummy H2 search row adadpter.
*/
-public abstract class GridH2SearchRowAdapter implements Row {
+public abstract class GridH2SearchRowAdapter implements GridH2SearchRow {
/** {@inheritDoc} */
@Override public void setKeyAndVersion(SearchRow old) {
throw new UnsupportedOperationException();
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/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 f47e84c..efbfe10 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
@@ -28,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteInterruptedException;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.mvcc.CacheCoordinatorsProcessor;
import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.query.QueryTable;
import org.apache.ignite.internal.processors.query.IgniteSQLException;
@@ -443,6 +444,8 @@ 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;
+
// 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);
@@ -455,10 +458,22 @@ public class GridH2Table extends TableBase {
if (!del) {
assert rowFactory == null || row.link() != 0 : row;
- GridH2Row old = pk.put(row); // Put to PK.
+ GridH2Row old;
+
+ // Put to PK.
+ if (cctx.mvccEnabled()) {
+ boolean replaced = pk.putx(row);
+
+ assert !replaced;
- if (old == null)
- size.increment();
+ old = null;
+ }
+ else {
+ old = pk.put(row);
+
+ if (old == null)
+ size.increment();
+ }
int len = idxs.size();
http://git-wip-us.apache.org/repos/asf/ignite/blob/8d9e0f75/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlQueriesTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlQueriesTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlQueriesTest.java
index 33908bf..e5e7f73 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlQueriesTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccSqlQueriesTest.java
@@ -54,10 +54,11 @@ public class CacheMvccSqlQueriesTest extends CacheMvccAbstractTest {
IgniteCache<Integer, MvccTestSqlIndexValue> cache = (IgniteCache)srv0.createCache(
cacheConfiguration(PARTITIONED, FULL_SYNC, 0, DFLT_PARTITION_COUNT).
- setIndexedTypes(Integer.class, MvccTestSqlIndexValue.class));
+ setIndexedTypes(Integer.class, MvccTestSqlIndexValue.class).
+ setSqlIndexMaxInlineSize(0));
cache.put(1, new MvccTestSqlIndexValue(1));
- cache.put(1, new MvccTestSqlIndexValue(2));
+ //cache.put(1, new MvccTestSqlIndexValue(2));
SqlQuery<Integer, MvccTestSqlIndexValue> qry =
new SqlQuery<>(MvccTestSqlIndexValue.class, "_key >= 0");