You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2017/02/16 14:41:03 UTC
[11/17] ignite git commit: ignite-db-x - invoke2
ignite-db-x - invoke2
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e52a08ea
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e52a08ea
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e52a08ea
Branch: refs/heads/ignite-4652
Commit: e52a08ea293b19b6421df5ca24ce21c6cf0010ce
Parents: c16109c
Author: Sergi Vladykin <se...@gmail.com>
Authored: Wed Feb 15 17:54:12 2017 +0300
Committer: Sergi Vladykin <se...@gmail.com>
Committed: Wed Feb 15 17:54:12 2017 +0300
----------------------------------------------------------------------
.../cache/database/tree/BPlusTree.java | 83 +++++++++++++++-----
1 file changed, 63 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e52a08ea/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index 347ee85..93097ba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -1506,14 +1506,18 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
if (res != RETRY)
res = invokeDown(x, x.pageId, x.backId, x.fwdId, lvl - 1);
- if (res == RETRY) {
+ if (res == RETRY_ROOT || x.isFinished())
+ return res;
+
+ if (res == RETRY || x.isPut()) {
checkInterrupted();
continue;
}
- if (res != RETRY_ROOT)
- res = x.onUp();
+ assert x.isRemove();
+
+ res = x.finishOrLockTail(page, pageId, backId, fwdId, lvl);
return res;
@@ -1647,12 +1651,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
continue;
}
- if (res != RETRY_ROOT && !r.isFinished()) {
- res = r.finishTail();
+ if (res == RETRY_ROOT || r.isFinished())
+ return res;
- if (res == NOT_FOUND)
- res = r.lockTail(pageId, page, backId, fwdId, lvl);
- }
+ res = r.finishOrLockTail(page, pageId, backId, fwdId, lvl);
return res;
@@ -2604,7 +2606,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
this.fwdId = oldFwdId;
if (res == RETRY)
- return res;
+ return RETRY;
needReplaceInner = DONE; // We can have only a single matching inner key.
@@ -2790,8 +2792,18 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
return op.canRelease(page, lvl);
}
- private boolean is(Class<?> cls) {
- return op != null && op.getClass() == cls;
+ /**
+ * @return {@code true} If it is a {@link Put} operation internally.
+ */
+ private boolean isPut() {
+ return op != null && op.getClass() == Put.class;
+ }
+
+ /**
+ * @return {@code true} If it is a {@link Remove} operation internally.
+ */
+ private boolean isRemove() {
+ return op != null && op.getClass() == Remove.class;
}
/**
@@ -2800,13 +2812,13 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @return {@code true} If it is a {@link Remove} and the page is in tail.
*/
private boolean isTail(long pageId, int lvl) {
- return is(Remove.class) && ((Remove)op).isTail(pageId, lvl);
+ return isRemove() && ((Remove)op).isTail(pageId, lvl);
}
/**
*/
private void levelExit() {
- if (is(Remove.class))
+ if (isRemove())
((Remove)op).page = null;
}
@@ -2814,14 +2826,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* Release all the resources by the end of operation.
*/
private void releaseAll() throws IgniteCheckedException {
- if (is(Remove.class))
+ if (isRemove())
((Remove)op).releaseAll();
}
- private Result onUp() {
- return null; // TODO
- }
-
private Result onNotFound() {
return null; // TODO
}
@@ -2835,7 +2843,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @throws IgniteCheckedException If failed.
*/
private Result tryFinish() throws IgniteCheckedException {
- if (is(Put.class))
+ assert op != null; // Must be guarded by isFinished.
+
+ if (isPut())
return RETRY;
Result res = ((Remove)op).finishTail();
@@ -2868,11 +2878,25 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @throws IgniteCheckedException If failed.
*/
Result tryReplaceInner(Page page, long pageId, long fwdId, int lvl) throws IgniteCheckedException {
- if (op == null || op.getClass() != Put.class)
+ if (!isPut())
return NOT_FOUND;
return ((Put)op).tryReplaceInner(page, pageId, fwdId, lvl);
}
+
+ /**
+ * @param page Page.
+ * @param pageId Page ID.
+ * @param backId Back page ID.
+ * @param fwdId Forward ID.
+ * @param lvl Level.
+ * @return Result.
+ * @throws IgniteCheckedException If failed.
+ */
+ public Result finishOrLockTail(Page page, long pageId, long backId, long fwdId, int lvl)
+ throws IgniteCheckedException {
+ return ((Remove)op).finishOrLockTail(page, pageId, backId, fwdId, lvl);
+ }
}
/**
@@ -3811,6 +3835,25 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
releaseTail();
reuseFreePages();
}
+
+ /**
+ * @param page Page.
+ * @param pageId Page ID.
+ * @param backId Back page ID.
+ * @param fwdId Forward ID.
+ * @param lvl Level.
+ * @return Result.
+ * @throws IgniteCheckedException If failed.
+ */
+ public Result finishOrLockTail(Page page, long pageId, long backId, long fwdId, int lvl)
+ throws IgniteCheckedException {
+ Result res = finishTail();
+
+ if (res == NOT_FOUND)
+ res = lockTail(pageId, page, backId, fwdId, lvl);
+
+ return res;
+ }
}
/**