You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/06/11 20:04:06 UTC
[40/47] ignite git commit: IGNITE-5267 - Moved ignite-ps module to
ignite-core
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
index 708df49..c72f53e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
@@ -38,12 +38,11 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
import org.apache.ignite.internal.processors.cache.GridCacheLockTimeoutException;
-import org.apache.ignite.internal.processors.cache.GridCacheMapEntryFactory;
import org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate;
import org.apache.ignite.internal.processors.cache.GridCacheReturn;
import org.apache.ignite.internal.processors.cache.IgniteCacheExpiryPolicy;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockCancelledException;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedUnlockRequest;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtDetachedCacheEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtDetachedCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtDetachedCacheEntry.java
index 404265d..7da3d4f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtDetachedCacheEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtDetachedCacheEntry.java
@@ -22,7 +22,7 @@ import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheOperation;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheEntry;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.util.typedef.internal.S;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
index 467b906..1cc6c28 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
@@ -30,7 +30,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
import org.apache.ignite.internal.processors.cache.IgniteRebalanceIterator;
-import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
import org.apache.ignite.internal.util.lang.GridCloseableIterator;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheEntry.java
index b17d0b5..646281b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheEntry.java
@@ -30,7 +30,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheMvcc;
import org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate;
import org.apache.ignite.internal.processors.cache.GridCacheOperation;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
index 384cd41..730c71d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -55,7 +54,7 @@ import org.apache.ignite.internal.processors.cache.GridCachePreloaderAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheReturn;
import org.apache.ignite.internal.processors.cache.IgniteCacheExpiryPolicy;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.local.GridLocalCache;
import org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalEx;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRow.java
new file mode 100644
index 0000000..57aeaef
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRow.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+
+/**
+ * Cache data row.
+ */
+public interface CacheDataRow extends CacheSearchRow {
+ /**
+ * @return Cache value.
+ */
+ public CacheObject value();
+
+ /**
+ * @return Cache entry version.
+ */
+ public GridCacheVersion version();
+
+ /**
+ * @return Expire time.
+ */
+ public long expireTime();
+
+ /**
+ * @return Partition for this key.
+ */
+ public int partition();
+
+ /**
+ * @param link Link for this row.
+ */
+ public void link(long link);
+
+ /**
+ * @param key Key.
+ */
+ public void key(KeyCacheObject key);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter.java
new file mode 100644
index 0000000..4d75475
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter.java
@@ -0,0 +1,593 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import java.nio.ByteBuffer;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageIdUtils;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
+import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.CacheObjectContext;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
+import org.apache.ignite.internal.processors.cache.IncompleteCacheObject;
+import org.apache.ignite.internal.processors.cache.IncompleteObject;
+import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.CacheVersionIO;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.DataPageIO;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.DataPagePayload;
+import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.util.tostring.GridToStringExclude;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.internal.pagemem.PageIdUtils.itemId;
+import static org.apache.ignite.internal.pagemem.PageIdUtils.pageId;
+
+/**
+ * Cache data row adapter.
+ */
+public class CacheDataRowAdapter implements CacheDataRow {
+ /** */
+ @GridToStringExclude
+ protected long link;
+
+ /** */
+ @GridToStringInclude
+ protected KeyCacheObject key;
+
+ /** */
+ @GridToStringInclude
+ protected CacheObject val;
+
+ /** */
+ protected long expireTime = -1;
+
+ /** */
+ @GridToStringInclude
+ protected GridCacheVersion ver;
+
+ /** */
+ @GridToStringInclude
+ protected int cacheId;
+
+ /**
+ * @param link Link.
+ */
+ public CacheDataRowAdapter(long link) {
+ // Link can be 0 here.
+ this.link = link;
+ }
+
+ /**
+ * @param key Key.
+ * @param val Value.
+ * @param expireTime Expire time.
+ * @param ver Version.
+ */
+ public CacheDataRowAdapter(KeyCacheObject key, CacheObject val, GridCacheVersion ver, long expireTime) {
+ this.key = key;
+ this.val = val;
+ this.ver = ver;
+ this.expireTime = expireTime;
+ }
+
+ /**
+ * Read row from data pages.
+ *
+ * @param grp Cache group.
+ * @param rowData Required row data.
+ * @throws IgniteCheckedException If failed.
+ */
+ public final void initFromLink(CacheGroupContext grp, RowData rowData) throws IgniteCheckedException {
+ initFromLink(grp, grp.shared(), grp.memoryPolicy().pageMemory(), rowData);
+ }
+
+ /**
+ * Read row from data pages.
+ * Can be called with cctx == null, if cache instance is unknown, but its ID is stored in the data row.
+ *
+ * @param grp Cache group.
+ * @param sharedCtx Shared context.
+ * @param pageMem Page memory.
+ * @param rowData Row data.
+ * @throws IgniteCheckedException If failed.
+ */
+ public final void initFromLink(
+ @Nullable CacheGroupContext grp,
+ GridCacheSharedContext<?, ?> sharedCtx,
+ PageMemory pageMem,
+ RowData rowData)
+ throws IgniteCheckedException {
+ assert link != 0 : "link";
+ assert key == null : "key";
+
+ CacheObjectContext coctx = grp != null ? grp.cacheObjectContext() : null;
+
+ boolean readCacheId = grp == null || grp.storeCacheIdInDataPage();
+
+ long nextLink = link;
+ IncompleteObject<?> incomplete = null;
+ boolean first = true;
+
+ do {
+ final long pageId = pageId(nextLink);
+
+ // Group is null if try evict page, with persistence evictions should be disabled.
+ assert grp != null || !sharedCtx.database().persistenceEnabled();
+
+ int grpId = grp != null ? grp.groupId() : 0;
+
+ final long page = pageMem.acquirePage(grpId, pageId);
+
+ try {
+ long pageAddr = pageMem.readLock(grpId, pageId, page); // Non-empty data page must not be recycled.
+
+ assert pageAddr != 0L : nextLink;
+
+ try {
+ DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr);
+
+ DataPagePayload data = io.readPayload(pageAddr,
+ itemId(nextLink),
+ pageMem.pageSize());
+
+ nextLink = data.nextLink();
+
+ if (first) {
+ if (nextLink == 0) {
+ // Fast path for a single page row.
+ readFullRow(sharedCtx, coctx, pageAddr + data.offset(), rowData, readCacheId);
+
+ return;
+ }
+
+ first = false;
+ }
+
+ ByteBuffer buf = pageMem.pageBuffer(pageAddr);
+
+ buf.position(data.offset());
+ buf.limit(data.offset() + data.payloadSize());
+
+ boolean keyOnly = rowData == RowData.KEY_ONLY;
+
+ incomplete = readFragment(sharedCtx, coctx, buf, keyOnly, readCacheId, incomplete);
+
+ if (keyOnly && key != null)
+ return;
+ }
+ finally {
+ pageMem.readUnlock(grpId, pageId, page);
+ }
+ }
+ finally {
+ pageMem.releasePage(grpId, pageId, page);
+ }
+ }
+ while(nextLink != 0);
+
+ assert isReady() : "ready";
+ }
+
+ /**
+ * @param sharedCtx Cache shared context.
+ * @param coctx Cache object context.
+ * @param buf Buffer.
+ * @param keyOnly {@code true} If need to read only key object.
+ * @param readCacheId {@code true} If need to read cache ID.
+ * @param incomplete Incomplete object.
+ * @throws IgniteCheckedException If failed.
+ * @return Read object.
+ */
+ private IncompleteObject<?> readFragment(
+ GridCacheSharedContext<?, ?> sharedCtx,
+ CacheObjectContext coctx,
+ ByteBuffer buf,
+ boolean keyOnly,
+ boolean readCacheId,
+ IncompleteObject<?> incomplete
+ ) throws IgniteCheckedException {
+ if (readCacheId && cacheId == 0) {
+ incomplete = readIncompleteCacheId(buf, incomplete);
+
+ if (cacheId == 0)
+ return incomplete;
+
+ incomplete = null;
+ }
+
+ if (coctx == null) {
+ // coctx can be null only when grp is null too, this means that
+ // we are in process of eviction and cacheId is mandatory part of data.
+ assert cacheId != 0;
+
+ coctx = sharedCtx.cacheContext(cacheId).cacheObjectContext();
+ }
+
+ // Read key.
+ if (key == null) {
+ incomplete = readIncompleteKey(coctx, buf, (IncompleteCacheObject)incomplete);
+
+ if (key == null || keyOnly)
+ return incomplete;
+
+ incomplete = null;
+ }
+
+ if (expireTime == -1) {
+ incomplete = readIncompleteExpireTime(buf, incomplete);
+
+ if (expireTime == -1)
+ return incomplete;
+
+ incomplete = null;
+ }
+
+ // Read value.
+ if (val == null) {
+ incomplete = readIncompleteValue(coctx, buf, (IncompleteCacheObject)incomplete);
+
+ if (val == null)
+ return incomplete;
+
+ incomplete = null;
+ }
+
+ // Read version.
+ if (ver == null)
+ incomplete = readIncompleteVersion(buf, incomplete);
+
+ return incomplete;
+ }
+
+ /**
+ * @param sharedCtx Cache shared context.
+ * @param coctx Cache object context.
+ * @param addr Address.
+ * @param rowData Required row data.
+ * @param readCacheId {@code true} If need to read cache ID.
+ * @throws IgniteCheckedException If failed.
+ */
+ private void readFullRow(
+ GridCacheSharedContext<?, ?> sharedCtx,
+ CacheObjectContext coctx,
+ long addr,
+ RowData rowData,
+ boolean readCacheId)
+ throws IgniteCheckedException {
+ int off = 0;
+
+ if (readCacheId) {
+ cacheId = PageUtils.getInt(addr, off);
+
+ off += 4;
+ }
+
+ if (coctx == null)
+ coctx = sharedCtx.cacheContext(cacheId).cacheObjectContext();
+
+ int len = PageUtils.getInt(addr, off);
+ off += 4;
+
+ if (rowData != RowData.NO_KEY) {
+ byte type = PageUtils.getByte(addr, off);
+ off++;
+
+ byte[] bytes = PageUtils.getBytes(addr, off, len);
+ off += len;
+
+ key = coctx.kernalContext().cacheObjects().toKeyCacheObject(coctx, type, bytes);
+
+ if (rowData == RowData.KEY_ONLY)
+ return;
+ }
+ else
+ off += len + 1;
+
+ len = PageUtils.getInt(addr, off);
+ off += 4;
+
+ byte type = PageUtils.getByte(addr, off);
+ off++;
+
+ byte[] bytes = PageUtils.getBytes(addr, off, len);
+ off += len;
+
+ val = coctx.kernalContext().cacheObjects().toCacheObject(coctx, type, bytes);
+
+ ver = CacheVersionIO.read(addr + off, false);
+
+ off += CacheVersionIO.size(ver, false);
+
+ expireTime = PageUtils.getLong(addr, off);
+ }
+
+ /**
+ * @param buf Buffer.
+ * @param incomplete Incomplete.
+ */
+ private IncompleteObject<?> readIncompleteCacheId(
+ ByteBuffer buf,
+ IncompleteObject<?> incomplete
+ ) {
+ if (incomplete == null) {
+ int remaining = buf.remaining();
+
+ if (remaining == 0)
+ return null;
+
+ int size = 4;
+
+ if (remaining >= size) {
+ cacheId = buf.getInt();
+
+ assert cacheId != 0;
+
+ return null;
+ }
+
+ incomplete = new IncompleteObject<>(new byte[size]);
+ }
+
+ incomplete.readData(buf);
+
+ if (incomplete.isReady()) {
+ final ByteBuffer timeBuf = ByteBuffer.wrap(incomplete.data());
+
+ timeBuf.order(buf.order());
+
+ cacheId = timeBuf.getInt();
+
+ assert cacheId != 0;
+ }
+
+ return incomplete;
+ }
+
+ /**
+ * @param coctx Cache object context.
+ * @param buf Buffer.
+ * @param incomplete Incomplete object.
+ * @return Incomplete object.
+ * @throws IgniteCheckedException If failed.
+ */
+ private IncompleteCacheObject readIncompleteKey(
+ CacheObjectContext coctx,
+ ByteBuffer buf,
+ IncompleteCacheObject incomplete
+ ) throws IgniteCheckedException {
+ incomplete = coctx.kernalContext().cacheObjects().toKeyCacheObject(coctx, buf, incomplete);
+
+ if (incomplete.isReady()) {
+ key = (KeyCacheObject)incomplete.object();
+
+ assert key != null;
+ }
+ else
+ assert !buf.hasRemaining();
+
+ return incomplete;
+ }
+
+ /**
+ * @param coctx Cache object context.
+ * @param buf Buffer.
+ * @param incomplete Incomplete object.
+ * @return Incomplete object.
+ * @throws IgniteCheckedException If failed.
+ */
+ private IncompleteCacheObject readIncompleteValue(
+ CacheObjectContext coctx,
+ ByteBuffer buf,
+ IncompleteCacheObject incomplete
+ ) throws IgniteCheckedException {
+ incomplete = coctx.kernalContext().cacheObjects().toCacheObject(coctx, buf, incomplete);
+
+ if (incomplete.isReady()) {
+ val = incomplete.object();
+
+ assert val != null;
+ }
+ else
+ assert !buf.hasRemaining();
+
+ return incomplete;
+ }
+
+ /**
+ * @param buf Buffer.
+ * @param incomplete Incomplete object.
+ * @return Incomplete object.
+ */
+ private IncompleteObject<?> readIncompleteExpireTime(
+ ByteBuffer buf,
+ IncompleteObject<?> incomplete
+ ) {
+ if (incomplete == null) {
+ int remaining = buf.remaining();
+
+ if (remaining == 0)
+ return null;
+
+ int size = 8;
+
+ if (remaining >= size) {
+ expireTime = buf.getLong();
+
+ assert expireTime >= 0 : expireTime;
+
+ return null;
+ }
+
+ incomplete = new IncompleteObject<>(new byte[size]);
+ }
+
+ incomplete.readData(buf);
+
+ if (incomplete.isReady()) {
+ final ByteBuffer timeBuf = ByteBuffer.wrap(incomplete.data());
+
+ timeBuf.order(buf.order());
+
+ expireTime = timeBuf.getLong();
+
+ assert expireTime >= 0;
+ }
+
+ return incomplete;
+ }
+
+ /**
+ * @param buf Buffer.
+ * @param incomplete Incomplete object.
+ * @return Incomplete object.
+ * @throws IgniteCheckedException If failed.
+ */
+ private IncompleteObject<?> readIncompleteVersion(
+ ByteBuffer buf,
+ IncompleteObject<?> incomplete
+ ) throws IgniteCheckedException {
+ if (incomplete == null) {
+ int remaining = buf.remaining();
+
+ if (remaining == 0)
+ return null;
+
+ int size = CacheVersionIO.readSize(buf, false);
+
+ if (remaining >= size) {
+ // If the whole version is on a single page, just read it.
+ ver = CacheVersionIO.read(buf, false);
+
+ assert !buf.hasRemaining(): buf.remaining();
+ assert ver != null;
+
+ return null;
+ }
+
+ // We have to read multipart version.
+ incomplete = new IncompleteObject<>(new byte[size]);
+ }
+
+ incomplete.readData(buf);
+
+ if (incomplete.isReady()) {
+ final ByteBuffer verBuf = ByteBuffer.wrap(incomplete.data());
+
+ verBuf.order(buf.order());
+
+ ver = CacheVersionIO.read(verBuf, false);
+
+ assert ver != null;
+ }
+
+ assert !buf.hasRemaining();
+
+ return incomplete;
+ }
+
+ /**
+ * @return {@code True} if entry is ready.
+ */
+ public boolean isReady() {
+ return ver != null && val != null && key != null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public KeyCacheObject key() {
+ assert key != null : "Key is not ready: " + this;
+
+ return key;
+ }
+
+ /**
+ * @param key Key.
+ */
+ @Override public void key(KeyCacheObject key) {
+ assert key != null;
+
+ this.key = key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int cacheId() {
+ return cacheId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public CacheObject value() {
+ assert val != null : "Value is not ready: " + this;
+
+ return val;
+ }
+
+ /** {@inheritDoc} */
+ @Override public GridCacheVersion version() {
+ assert ver != null : "Version is not ready: " + this;
+
+ return ver;
+ }
+
+ /** {@inheritDoc} */
+ @Override public long expireTime() {
+ return expireTime;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int partition() {
+ return PageIdUtils.partId(link);
+ }
+
+ /** {@inheritDoc} */
+ @Override public long link() {
+ return link;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void link(long link) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hash() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *
+ */
+ public enum RowData {
+ /** */
+ FULL,
+
+ /** */
+ KEY_ONLY,
+
+ /** */
+ NO_KEY
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(CacheDataRowAdapter.class, this, "link", U.hexLong(link));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheSearchRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheSearchRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheSearchRow.java
new file mode 100644
index 0000000..1637eb0
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheSearchRow.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+
+/**
+ *
+ */
+public interface CacheSearchRow {
+ /**
+ * @return Cache key.
+ */
+ public KeyCacheObject key();
+
+ /**
+ * @return Link for this row.
+ */
+ public long link();
+
+ /**
+ * @return Key hash code.
+ */
+ public int hash();
+
+ /**
+ * @return Cache ID or {@code 0} if cache ID is not defined.
+ */
+ public int cacheId();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CheckpointLockStateChecker.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CheckpointLockStateChecker.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CheckpointLockStateChecker.java
new file mode 100644
index 0000000..ca6fb69
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CheckpointLockStateChecker.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+/**
+ * Interface for perform checking that checkpoint lock is held by current track
+ */
+public interface CheckpointLockStateChecker {
+ /**
+ * @return true if checkpoint lock is held by current thread
+ */
+ public boolean checkpointLockIsHeldByThread();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStructure.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStructure.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStructure.java
new file mode 100644
index 0000000..b2a8f36
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStructure.java
@@ -0,0 +1,384 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageIdAllocator;
+import org.apache.ignite.internal.pagemem.PageIdUtils;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager;
+import org.apache.ignite.internal.pagemem.wal.record.delta.RecycleRecord;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseBag;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
+import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler;
+import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageLockListener;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA;
+import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX;
+import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION;
+import static org.apache.ignite.internal.pagemem.PageIdAllocator.MAX_PARTITION_ID;
+
+/**
+ * Base class for all the data structures based on {@link PageMemory}.
+ */
+public abstract class DataStructure implements PageLockListener {
+ /** For tests. */
+ public static Random rnd;
+
+ /** */
+ protected final int cacheId;
+
+ /** */
+ protected final PageMemory pageMem;
+
+ /** */
+ protected final IgniteWriteAheadLogManager wal;
+
+ /** */
+ protected ReuseList reuseList;
+
+ /**
+ * @param cacheId Cache ID.
+ * @param pageMem Page memory.
+ * @param wal Write ahead log manager.
+ */
+ public DataStructure(
+ int cacheId,
+ PageMemory pageMem,
+ IgniteWriteAheadLogManager wal
+ ) {
+ assert pageMem != null;
+
+ this.cacheId = cacheId;
+ this.pageMem = pageMem;
+ this.wal = wal;
+ }
+
+ /**
+ * @return Cache ID.
+ */
+ public final int getCacheId() {
+ return cacheId;
+ }
+
+ /**
+ * @param max Max.
+ * @return Random value from {@code 0} (inclusive) to the given max value (exclusive).
+ */
+ public static int randomInt(int max) {
+ Random rnd0 = rnd != null ? rnd : ThreadLocalRandom.current();
+
+ return rnd0.nextInt(max);
+ }
+
+ /**
+ * @param bag Reuse bag.
+ * @return Allocated page.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final long allocatePage(ReuseBag bag) throws IgniteCheckedException {
+ long pageId = bag != null ? bag.pollFreePage() : 0;
+
+ if (pageId == 0 && reuseList != null)
+ pageId = reuseList.takeRecycledPage();
+
+ if (pageId == 0)
+ pageId = allocatePageNoReuse();
+
+ assert pageId != 0;
+
+ return pageId;
+ }
+
+ /**
+ * @return Page ID of newly allocated page.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected long allocatePageNoReuse() throws IgniteCheckedException {
+ return pageMem.allocatePage(cacheId, PageIdAllocator.INDEX_PARTITION, FLAG_IDX);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @return Page absolute pointer.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final long acquirePage(long pageId) throws IgniteCheckedException {
+ assert PageIdUtils.flag(pageId) == FLAG_IDX && PageIdUtils.partId(pageId) == INDEX_PARTITION ||
+ PageIdUtils.flag(pageId) == FLAG_DATA && PageIdUtils.partId(pageId) <= MAX_PARTITION_ID : U.hexLong(pageId);
+
+ return pageMem.acquirePage(cacheId, pageId);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param page Page pointer.
+ */
+ protected final void releasePage(long pageId, long page) {
+ pageMem.releasePage(cacheId, pageId, page);
+ }
+
+ /**
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @return Page address or {@code 0} if failed to lock due to recycling.
+ */
+ protected final long tryWriteLock(long pageId, long page) {
+ return PageHandler.writeLock(pageMem, cacheId, pageId, page, this, true);
+ }
+
+ /**
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @return Page address.
+ */
+ protected final long writeLock(long pageId, long page) {
+ return PageHandler.writeLock(pageMem, cacheId, pageId, page, this, false);
+ }
+
+ /**
+ * <p>
+ * Note: Default WAL record policy will be used.
+ * </p>
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @param pageAddr Page address.
+ * @param dirty Dirty flag.
+ */
+ protected final void writeUnlock(long pageId, long page, long pageAddr, boolean dirty) {
+ writeUnlock(pageId, page, pageAddr, null, dirty);
+ }
+
+ /**
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @return Page address.
+ */
+ protected final long readLock(long pageId, long page) {
+ return PageHandler.readLock(pageMem, cacheId, pageId, page, this);
+ }
+
+ /**
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @param pageAddr Page address.
+ */
+ protected final void readUnlock(long pageId, long page, long pageAddr) {
+ PageHandler.readUnlock(pageMem, cacheId, pageId, page, pageAddr, this);
+ }
+
+ /**
+ * @param pageId Page ID
+ * @param page Page pointer.
+ * @param pageAddr Page address.
+ * @param walPlc Full page WAL record policy.
+ * @param dirty Dirty flag.
+ */
+ protected final void writeUnlock(long pageId, long page, long pageAddr, Boolean walPlc, boolean dirty) {
+ PageHandler.writeUnlock(pageMem, cacheId, pageId, page, pageAddr, this, walPlc, dirty);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param page Page pointer.
+ * @param walPlc Full page WAL record policy.
+ * @return {@code true} If we need to make a delta WAL record for the change in this page.
+ */
+ protected final boolean needWalDeltaRecord(long pageId, long page, Boolean walPlc) {
+ return PageHandler.isWalDeltaRecordNeeded(pageMem, cacheId, pageId, page, wal, walPlc);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param h Handler.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <R> R write(
+ long pageId,
+ PageHandler<?, R> h,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.writePage(pageMem, cacheId, pageId, this, h, null, null, null, null, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param h Handler.
+ * @param arg Argument.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <X, R> R write(
+ long pageId,
+ PageHandler<X, R> h,
+ X arg,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.writePage(pageMem, cacheId, pageId, this, h, null, null, null, arg, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param page Page pointer.
+ * @param h Handler.
+ * @param arg Argument.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <X, R> R write(
+ long pageId,
+ long page,
+ PageHandler<X, R> h,
+ X arg,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.writePage(pageMem, cacheId, pageId, page, this, h, null, null, null, arg, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param h Handler.
+ * @param init IO for new page initialization or {@code null} if it is an existing page.
+ * @param arg Argument.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <X, R> R write(
+ long pageId,
+ PageHandler<X, R> h,
+ PageIO init,
+ X arg,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.writePage(pageMem, cacheId, pageId, this, h, init, wal, null, arg, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param h Handler.
+ * @param arg Argument.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <X, R> R read(
+ long pageId,
+ PageHandler<X, R> h,
+ X arg,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.readPage(pageMem, cacheId, pageId, this, h, arg, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param page Page pointer.
+ * @param h Handler.
+ * @param arg Argument.
+ * @param intArg Argument of type {@code int}.
+ * @param lockFailed Result in case of lock failure due to page recycling.
+ * @return Handler result.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final <X, R> R read(
+ long pageId,
+ long page,
+ PageHandler<X, R> h,
+ X arg,
+ int intArg,
+ R lockFailed) throws IgniteCheckedException {
+ return PageHandler.readPage(pageMem, cacheId, pageId, page, this, h, arg, intArg, lockFailed);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param init IO for new page initialization.
+ * @throws IgniteCheckedException if failed.
+ */
+ protected final void init(long pageId, PageIO init) throws IgniteCheckedException {
+ PageHandler.initPage(pageMem, cacheId, pageId, init, wal, this);
+ }
+
+ /**
+ * @param pageId Page ID.
+ * @param page Page pointer.
+ * @param pageAddr Page address.
+ * @param walPlc Full page WAL record policy.
+ * @return Rotated page ID.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final long recyclePage(
+ long pageId,
+ long page,
+ long pageAddr,
+ Boolean walPlc) throws IgniteCheckedException {
+ long rotated = PageIdUtils.rotatePageId(pageId);
+
+ PageIO.setPageId(pageAddr, rotated);
+
+ if (needWalDeltaRecord(pageId, page, walPlc))
+ wal.log(new RecycleRecord(cacheId, pageId, rotated));
+
+ return rotated;
+ }
+
+ /**
+ * @return Page size.
+ */
+ protected final int pageSize() {
+ return pageMem.pageSize();
+ }
+
+ @Override public void onBeforeWriteLock(int cacheId, long pageId, long page) {
+ // No-op.
+ }
+
+ @Override public void onWriteLock(int cacheId, long pageId, long page, long pageAddr) {
+ // No-op.
+ }
+
+ @Override public void onWriteUnlock(int cacheId, long pageId, long page, long pageAddr) {
+ // No-op.
+ }
+
+ @Override public void onBeforeReadLock(int cacheId, long pageId, long page) {
+ // No-op.
+ }
+
+ @Override public void onReadLock(int cacheId, long pageId, long page, long pageAddr) {
+ // No-op.
+ }
+
+ @Override public void onReadUnlock(int cacheId, long pageId, long page, long pageAddr) {
+ // No-op.
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DbCheckpointListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DbCheckpointListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DbCheckpointListener.java
new file mode 100644
index 0000000..f4da637
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DbCheckpointListener.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import java.util.Map;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.util.typedef.T2;
+
+/**
+ *
+ */
+public interface DbCheckpointListener {
+ public interface Context {
+ public boolean nextSnapshot();
+
+ public Map<T2<Integer, Integer>, T2<Integer, Integer>> partitionStatMap();
+ }
+
+ /**
+ * @throws IgniteCheckedException If failed.
+ */
+ public void onCheckpointBegin(Context context) throws IgniteCheckedException;
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6bf5ce46/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/FullPageIdIterableComparator.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/FullPageIdIterableComparator.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/FullPageIdIterableComparator.java
new file mode 100644
index 0000000..c056c52
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/FullPageIdIterableComparator.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import org.apache.ignite.internal.util.typedef.T2;
+
+/**
+ *
+ */
+public class FullPageIdIterableComparator implements Comparator<T2<Integer, Integer>>, Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ public static final FullPageIdIterableComparator INSTANCE = new FullPageIdIterableComparator();
+
+ /** {@inheritDoc} */
+ @Override public int compare(T2<Integer, Integer> o1, T2<Integer, Integer> o2) {
+ if (o1.get1() < o2.get1())
+ return -1;
+
+ if (o1.get1() > o2.get1())
+ return 1;
+
+ if (o1.get2() < o2.get2())
+ return -1;
+
+ if (o1.get2() > o2.get2())
+ return 1;
+
+ return 0;
+ }
+}
+