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:08 UTC

[16/17] ignite git commit: Merge branch 'ignite-4652' of https://github.com/svladykin/ignite into ignite-4652

Merge branch 'ignite-4652' of https://github.com/svladykin/ignite into ignite-4652


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e03af959
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e03af959
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e03af959

Branch: refs/heads/ignite-4652
Commit: e03af959c53416ed830f1c1cab3618cf20a6e654
Parents: 8b68231 00820a9
Author: Sergi Vladykin <se...@gmail.com>
Authored: Thu Feb 16 15:03:03 2017 +0300
Committer: Sergi Vladykin <se...@gmail.com>
Committed: Thu Feb 16 15:03:03 2017 +0300

----------------------------------------------------------------------
 .../cache/database/tree/BPlusTree.java          | 903 ++++++++++++++-----
 .../processors/database/BPlusTreeSelfTest.java  | 153 +++-
 2 files changed, 807 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e03af959/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index cdceffb,20860f5..c1589a6
--- 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
@@@ -362,18 -355,27 +355,29 @@@ public abstract class BPlusTree<L, T ex
                  // Get old row in leaf page to reduce contention at upper level.
                  p.oldRow = p.needOld ? getRow(io, pageAddr, idx) : (T)Boolean.TRUE;
  
-                 p.finish();
- 
                  // Inner replace state must be consistent by the end of the operation.
                  assert p.needReplaceInner == FALSE || p.needReplaceInner == DONE : p.needReplaceInner;
+ 
+                 // Need to replace inner key if now we are replacing the rightmost row and have a forward page.
+                 if (canGetRowFromInner && idx + 1 == cnt && p.fwdId != 0L && p.needReplaceInner == FALSE) {
+                     // Can happen only for invoke, otherwise inner key must be replaced on the way down.
+                     assert p.invoke;
+ 
+                     // We need to restart the operation from root to perform inner replace.
+                     // On the second pass we will not get here (will avoid infinite loop) because
+                     // needReplaceInner will be DONE or our key will not be the rightmost anymore.
+                     return RETRY_ROOT;
+                 }
+                 else
+                     p.finish();
              }
  
 -            io.store(pageAddr, idx, newRow, null);
 +            boolean needWal = needWalDeltaRecord(page);
  
 -            if (needWalDeltaRecord(page))
 -                wal.log(new ReplaceRecord<>(cacheId, page.id(), io, newRow, null, idx));
 +            byte[] newRowBytes = io.store(pageAddr, idx, newRow, null, needWal);
 +
 +            if (needWal)
 +                wal.log(new ReplaceRecord<>(cacheId, page.id(), io, newRowBytes, idx));
  
              return FOUND;
          }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e03af959/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
----------------------------------------------------------------------