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/01/19 16:16:50 UTC
ignite git commit: BPlusTree: do not init old value when it is not
used.
Repository: ignite
Updated Branches:
refs/heads/ignite-3477 f6011a5cf -> d85439582
BPlusTree: do not init old value when it is not used.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d8543958
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d8543958
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d8543958
Branch: refs/heads/ignite-3477
Commit: d854395829f145c4fb4ca0cd30db7a3314bc58cb
Parents: f6011a5
Author: sboikov <sb...@gridgain.com>
Authored: Thu Jan 19 19:16:51 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jan 19 19:16:51 2017 +0300
----------------------------------------------------------------------
.../cache/IgniteCacheOffheapManagerImpl.java | 42 ++++++----
.../cache/database/tree/BPlusTree.java | 88 +++++++++++---------
.../query/h2/database/H2TreeIndex.java | 21 ++++-
.../query/h2/opt/GridH2IndexBase.java | 21 ++++-
.../processors/query/h2/opt/GridH2Table.java | 2 +-
5 files changed, 115 insertions(+), 59 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/d8543958/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 63a5072..aab5a75 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -920,13 +920,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert old.link() != 0 : old;
if (pendingEntries != null && old.expireTime() != 0)
- pendingEntries.remove(new PendingRow(old.expireTime(), old.link()));
+ pendingEntries.removex(new PendingRow(old.expireTime(), old.link()));
rowStore.removeRow(old.link());
}
if (pendingEntries != null && expireTime != 0)
- pendingEntries.put(new PendingRow(expireTime, dataRow.link()));
+ pendingEntries.putx(new PendingRow(expireTime, dataRow.link()));
updateIgfsMetrics(key, (old != null ? old.value() : null), val);
}
@@ -950,7 +950,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert dataRow.link() != 0 : dataRow;
if (pendingEntries != null && dataRow.expireTime() != 0)
- pendingEntries.remove(new PendingRow(dataRow.expireTime(), dataRow.link()));
+ pendingEntries.removex(new PendingRow(dataRow.expireTime(), dataRow.link()));
storageSize.decrementAndGet();
@@ -1242,6 +1242,15 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
return compareKeys(row.key(), link);
}
+ /** {@inheritDoc} */
+ @Override protected CacheDataRow getRow(BPlusIO<CacheSearchRow> io, long pageAddr, int idx)
+ throws IgniteCheckedException {
+ int hash = ((RowLinkIO)io).getHash(pageAddr, idx);
+ long link = ((RowLinkIO)io).getLink(pageAddr, idx);
+
+ return rowStore.dataRow(hash, link);
+ }
+
/**
* @param key Key.
* @param link Link.
@@ -1270,11 +1279,14 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
int len = PageUtils.getInt(addr, 0);
- int size = Math.min(bytes.length, len);
+ int lenCmp = Integer.compare(len, bytes.length);
+
+ if (lenCmp != 0)
+ return lenCmp;
addr += 5; // Skip length and type byte.
- for (int i = 0; i < size; i++) {
+ for (int i = 0; i < len; i++) {
byte b1 = PageUtils.getByte(addr, i);
byte b2 = bytes[i];
@@ -1282,7 +1294,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
return b1 > b2 ? 1 : -1;
}
- return Integer.compare(len, bytes.length);
+ return 0;
}
}
finally {
@@ -1297,9 +1309,12 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
byte[] bytes1 = other.key().valueBytes(cctx.cacheObjectContext());
byte[] bytes2 = key.valueBytes(cctx.cacheObjectContext());
- int len = Math.min(bytes1.length, bytes2.length);
+ int lenCmp = Integer.compare(bytes1.length, bytes2.length);
- for (int i = 0; i < len; i++) {
+ if (lenCmp != 0)
+ return lenCmp;
+
+ for (int i = 0; i < bytes1.length; i++) {
byte b1 = bytes1[i];
byte b2 = bytes2[i];
@@ -1307,16 +1322,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
return b1 > b2 ? 1 : -1;
}
- return Integer.compare(bytes1.length, bytes2.length);
- }
-
- /** {@inheritDoc} */
- @Override protected CacheDataRow getRow(BPlusIO<CacheSearchRow> io, long pageAddr, int idx)
- throws IgniteCheckedException {
- int hash = ((RowLinkIO)io).getHash(pageAddr, idx);
- long link = ((RowLinkIO)io).getLink(pageAddr, idx);
-
- return rowStore.dataRow(hash, link);
+ return 0;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d8543958/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 e4afc13..ff4be4b 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
@@ -322,7 +322,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
assert p.oldRow == null;
// Get old row in leaf page to reduce contention at upper level.
- p.oldRow = getRow(io, pageAddr, idx);
+ p.oldRow = p.needOld ? getRow(io, pageAddr, idx) : (T)Boolean.TRUE;
p.finish();
@@ -1292,13 +1292,12 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
/**
* @param row Lookup row.
- * @param bag Reuse bag.
* @return Removed row.
* @throws IgniteCheckedException If failed.
*/
@SuppressWarnings("unused")
- public final T removeCeil(L row, ReuseBag bag) throws IgniteCheckedException {
- return doRemove(row, true, bag);
+ public final T removeCeil(L row) throws IgniteCheckedException {
+ return doRemove(row, true, true);
}
/**
@@ -1307,20 +1306,31 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @throws IgniteCheckedException If failed.
*/
@Override public final T remove(L row) throws IgniteCheckedException {
- return doRemove(row, false, null);
+ return doRemove(row, false, true);
+ }
+
+ /**
+ * @param row Lookup row.
+ * @throws IgniteCheckedException If failed.
+ * @return {@code True} if removed row.
+ */
+ public final boolean removex(L row) throws IgniteCheckedException {
+ Boolean res = (Boolean)doRemove(row, false, false);
+
+ return res != null ? res : false;
}
/**
* @param row Lookup row.
* @param ceil If we can remove ceil row when we can not find exact.
- * @param bag Reuse bag.
+ * @param needOld {@code True} if need return removed row.
* @return Removed row.
* @throws IgniteCheckedException If failed.
*/
- private T doRemove(L row, boolean ceil, ReuseBag bag) throws IgniteCheckedException {
+ private T doRemove(L row, boolean ceil, boolean needOld) throws IgniteCheckedException {
checkDestroyed();
- Remove r = new Remove(row, ceil, bag);
+ Remove r = new Remove(row, ceil, needOld);
try {
for (;;) {
@@ -1355,7 +1365,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
assert r.isFinished();
- return r.removed;
+ return r.rmvd;
}
}
}
@@ -1564,19 +1574,30 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* {@inheritDoc}
*/
@Override public final T put(T row) throws IgniteCheckedException {
- return put(row, null);
+ return put(row, true);
+ }
+
+ /**
+ * @param row New value.
+ * @throws IgniteCheckedException If failed.
+ * @return {@code True} if replaced existing row.
+ */
+ public boolean putx(T row) throws IgniteCheckedException {
+ Boolean res = (Boolean)put(row, false);
+
+ return res != null ? res : false;
}
/**
- * @param row Row.
- * @param bag Reuse bag.
+ * @param row New value.
+ * @param needOld {@code True} If need return old value.
* @return Old row.
* @throws IgniteCheckedException If failed.
*/
- public final T put(T row, ReuseBag bag) throws IgniteCheckedException {
+ private T put(T row, boolean needOld) throws IgniteCheckedException {
checkDestroyed();
- Put p = new Put(row, bag);
+ Put p = new Put(row, needOld);
try {
for (;;) { // Go down with retries.
@@ -2116,16 +2137,16 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
Bool needReplaceInner = FALSE;
/** */
- private ReuseBag bag;
+ private final boolean needOld;
/**
* @param row Row.
- * @param bag Reuse bag.
+ * @param needOld {@code True} If need return old value.
*/
- private Put(T row, ReuseBag bag) {
+ private Put(T row, boolean needOld) {
super(row);
- this.bag = bag;
+ this.needOld = needOld;
}
/** {@inheritDoc} */
@@ -2234,7 +2255,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
*/
private L insertWithSplit(Page page, BPlusIO<L> io, final long pageAddr, int idx, int lvl)
throws IgniteCheckedException {
- long fwdId = allocatePage(bag);
+ long fwdId = allocatePage(null);
try (Page fwd = page(fwdId)) {
// Need to check this before the actual split, because after the split we will have new forward page here.
@@ -2281,7 +2302,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
}
if (!hadFwd && lvl == getRootLevel()) { // We are splitting root.
- long newRootId = allocatePage(bag);
+ long newRootId = allocatePage(null);
try (Page newRoot = page(newRootId)) {
if (io.isLeaf())
@@ -2350,7 +2371,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
Bool needMergeEmptyBranch = FALSE;
/** Removed row. */
- private T removed;
+ private T rmvd;
/** Current page. */
private Page page;
@@ -2359,31 +2380,23 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
private Object freePages;
/** */
- private ReuseBag bag;
+ private final boolean needOld;
/**
* @param row Row.
* @param ceil If we can remove ceil row when we can not find exact.
+ * @param needOld {@code True} If need return old value.
*/
- private Remove(L row, boolean ceil, ReuseBag bag) {
+ private Remove(L row, boolean ceil, boolean needOld) {
super(row);
this.ceil = ceil;
- this.bag = bag;
- }
-
- /**
- * @return Reuse bag.
- */
- private ReuseBag bag() {
- return bag != null ? bag : this;
+ this.needOld = needOld;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public long pollFreePage() {
- assert bag == null;
-
if (freePages == null)
return 0;
@@ -2404,7 +2417,6 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
@SuppressWarnings("unchecked")
@Override public void addFreePage(long pageId) {
assert pageId != 0;
- assert bag == null; // Otherwise we have to add the given pageId to that bag.
if (freePages == null)
freePages = pageId;
@@ -2523,7 +2535,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @return {@code true} If already removed from leaf.
*/
private boolean isRemoved() {
- return removed != null;
+ return rmvd != null;
}
/**
@@ -2799,7 +2811,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
assert !isRemoved(): "already removed";
// Detach the row.
- removed = getRow(io, pageAddr, idx);
+ rmvd = needOld ? getRow(io, pageAddr, idx) : (T)Boolean.TRUE;
doRemove(page, io, pageAddr, cnt, idx);
@@ -3000,7 +3012,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
if (release)
writeUnlockAndClose(page, pageAddr);
- bag().addFreePage(pageId);
+ addFreePage(pageId);
}
/**
@@ -3021,7 +3033,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
@SuppressWarnings("unchecked")
private void reuseFreePages() throws IgniteCheckedException {
// If we have a bag, then it will be processed at the upper level.
- if (reuseList != null && bag == null && freePages != null)
+ if (reuseList != null && freePages != null)
reuseList.addForRecycle(this);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d8543958/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 6cabd77..33379b0 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
@@ -136,7 +136,6 @@ public class H2TreeIndex extends GridH2IndexBase {
}
/** {@inheritDoc} */
- @SuppressWarnings("StatementWithEmptyBody")
@Override public GridH2Row put(GridH2Row row) {
try {
return tree.put(row);
@@ -147,6 +146,16 @@ public class H2TreeIndex extends GridH2IndexBase {
}
/** {@inheritDoc} */
+ @Override public boolean putx(GridH2Row row) {
+ try {
+ return tree.putx(row);
+ }
+ catch (IgniteCheckedException e) {
+ throw DbException.convert(e);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public GridH2Row remove(SearchRow row) {
try {
return tree.remove(row);
@@ -157,6 +166,16 @@ public class H2TreeIndex extends GridH2IndexBase {
}
/** {@inheritDoc} */
+ @Override public void removex(SearchRow row) {
+ try {
+ tree.removex(row);
+ }
+ catch (IgniteCheckedException e) {
+ throw DbException.convert(e);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public double getCost(Session ses, int[] masks, TableFilter[] filters, int filter, SortOrder sortOrder) {
long rowCnt = getRowCountApproximation();
http://git-wip-us.apache.org/repos/asf/ignite/blob/d8543958/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 4ef015b..ea7173c 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
@@ -178,7 +178,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
}
/**
- * Put row if absent.
+ * Puts row.
*
* @param row Row.
* @return Existing row or {@code null}.
@@ -186,6 +186,16 @@ public abstract class GridH2IndexBase extends BaseIndex {
public abstract GridH2Row put(GridH2Row row);
/**
+ * Puts row.
+ *
+ * @param row Row.
+ * @return {@code True} if replaced existing row.
+ */
+ public boolean putx(GridH2Row row) {
+ return put(row) != null;
+ }
+
+ /**
* Remove row from index.
*
* @param row Row.
@@ -194,6 +204,15 @@ public abstract class GridH2IndexBase extends BaseIndex {
public abstract GridH2Row remove(SearchRow row);
/**
+ * Remove row from index, does not return removed row.
+ *
+ * @param row Row.
+ */
+ public void removex(SearchRow row) {
+ remove(row);
+ }
+
+ /**
* Finds a single row by the given row.
*
* @param row Search row.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d8543958/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 3251b3d..5024959 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
@@ -615,7 +615,7 @@ public class GridH2Table extends TableBase {
"not supported [idx=" + idx + ", old=" + old + ", old2=" + old2 + ']');
}
else if (old != null) // Row was not replaced, need to remove manually.
- idx.remove(old);
+ idx.removex(old);
}
}
else {