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/02/01 11:31:04 UTC
ignite git commit: ignite-3477 Optimize compact
Repository: ignite
Updated Branches:
refs/heads/ignite-3477 423408f29 -> 0d19ed5e3
ignite-3477 Optimize compact
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0d19ed5e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0d19ed5e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0d19ed5e
Branch: refs/heads/ignite-3477
Commit: 0d19ed5e3b14629554d396cdbf5b8c865de3207e
Parents: 423408f
Author: sboikov <sb...@gridgain.com>
Authored: Wed Feb 1 14:30:58 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Feb 1 14:30:58 2017 +0300
----------------------------------------------------------------------
.../cache/database/freelist/FreeListImpl.java | 241 ++++++++++---------
.../cache/database/tree/io/DataPageIO.java | 46 +++-
2 files changed, 166 insertions(+), 121 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/0d19ed5e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
index 892c1ec..7d2d370 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
@@ -72,145 +72,162 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
private final int MIN_SIZE_FOR_DATA_PAGE;
/** */
- private final PageHandler<CacheDataRow, Boolean> updateRow =
- new PageHandler<CacheDataRow, Boolean>() {
- @Override public Boolean run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int itemId)
- throws IgniteCheckedException {
- DataPageIO io = (DataPageIO)iox;
+ private final PageHandler<CacheDataRow, Boolean> updateRow = new UpdateRowHandler();
- int rowSize = getRowSize(row);
+ /**
+ *
+ */
+ private class UpdateRowHandler extends PageHandler<CacheDataRow, Boolean> {
+ /** {@inheritDoc} */
+ @Override public Boolean run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int itemId)
+ throws IgniteCheckedException {
+ DataPageIO io = (DataPageIO)iox;
- boolean updated = io.updateRow(pageAddr, itemId, pageSize(), null, row, rowSize);
+ int rowSize = getRowSize(row);
- if (updated && isWalDeltaRecordNeeded(wal, page)) {
- // TODO This record must contain only a reference to a logical WAL record with the actual data.
- byte[] payload = new byte[rowSize];
+ boolean updated = io.updateRow(pageAddr, itemId, pageSize(), null, row, rowSize);
- DataPagePayload data = io.readPayload(pageAddr, itemId, pageSize());
+ if (updated && isWalDeltaRecordNeeded(wal, page)) {
+ // TODO This record must contain only a reference to a logical WAL record with the actual data.
+ byte[] payload = new byte[rowSize];
- assert data.payloadSize() == rowSize;
+ DataPagePayload data = io.readPayload(pageAddr, itemId, pageSize());
- PageUtils.getBytes(pageAddr, data.offset(), payload, 0, rowSize);
+ assert data.payloadSize() == rowSize;
- wal.log(new DataPageUpdateRecord(
- cacheId,
- page.id(),
- itemId,
- payload));
- }
+ PageUtils.getBytes(pageAddr, data.offset(), payload, 0, rowSize);
- return updated;
+ wal.log(new DataPageUpdateRecord(
+ cacheId,
+ page.id(),
+ itemId,
+ payload));
}
- };
+
+ return updated;
+ }
+ };
/** */
- private final PageHandler<CacheDataRow, Integer> writeRow =
- new PageHandler<CacheDataRow, Integer>() {
- @Override public Integer run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int written)
- throws IgniteCheckedException {
- DataPageIO io = (DataPageIO)iox;
+ private final PageHandler<CacheDataRow, Integer> writeRow = new WriteRowHandler();
- int rowSize = getRowSize(row);
- int oldFreeSpace = io.getFreeSpace(pageAddr);
+ /**
+ *
+ */
+ private class WriteRowHandler extends PageHandler<CacheDataRow, Integer> {
+ /** {@inheritDoc} */
+ @Override public Integer run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int written)
+ throws IgniteCheckedException {
+ DataPageIO io = (DataPageIO)iox;
- assert oldFreeSpace > 0 : oldFreeSpace;
+ int rowSize = getRowSize(row);
+ int oldFreeSpace = io.getFreeSpace(pageAddr);
- // If the full row does not fit into this page write only a fragment.
- written = (written == 0 && oldFreeSpace >= rowSize) ? addRow(page, pageAddr, io, row, rowSize):
- addRowFragment(page, pageAddr, io, row, written, rowSize);
+ assert oldFreeSpace > 0 : oldFreeSpace;
- // Reread free space after update.
- int newFreeSpace = io.getFreeSpace(pageAddr);
+ // If the full row does not fit into this page write only a fragment.
+ written = (written == 0 && oldFreeSpace >= rowSize) ? addRow(page, pageAddr, io, row, rowSize):
+ addRowFragment(page, pageAddr, io, row, written, rowSize);
- if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
- int bucket = bucket(newFreeSpace, false);
+ // Reread free space after update.
+ int newFreeSpace = io.getFreeSpace(pageAddr);
- put(null, page, pageAddr, bucket);
- }
+ if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+ int bucket = bucket(newFreeSpace, false);
- // Avoid boxing with garbage generation for usual case.
- return written == rowSize ? COMPLETE : written;
+ put(null, page, pageAddr, bucket);
}
- /**
- * @param page Page.
- * @param pageAddr Page address.
- * @param io IO.
- * @param row Row.
- * @param rowSize Row size.
- * @return Written size which is always equal to row size here.
- * @throws IgniteCheckedException If failed.
- */
- private int addRow(
- Page page,
- long pageAddr,
- DataPageIO io,
- CacheDataRow row,
- int rowSize
- ) throws IgniteCheckedException {
- io.addRow(pageAddr, row, rowSize, pageSize());
-
- if (isWalDeltaRecordNeeded(wal, page)) {
- // TODO This record must contain only a reference to a logical WAL record with the actual data.
- byte[] payload = new byte[rowSize];
-
- DataPagePayload data = io.readPayload(pageAddr, PageIdUtils.itemId(row.link()), pageSize());
-
- assert data.payloadSize() == rowSize;
-
- PageUtils.getBytes(pageAddr, data.offset(), payload, 0, rowSize);
-
- wal.log(new DataPageInsertRecord(
- cacheId,
- page.id(),
- payload));
- }
+ // Avoid boxing with garbage generation for usual case.
+ return written == rowSize ? COMPLETE : written;
+ }
- return rowSize;
+ /**
+ * @param page Page.
+ * @param pageAddr Page address.
+ * @param io IO.
+ * @param row Row.
+ * @param rowSize Row size.
+ * @return Written size which is always equal to row size here.
+ * @throws IgniteCheckedException If failed.
+ */
+ private int addRow(
+ Page page,
+ long pageAddr,
+ DataPageIO io,
+ CacheDataRow row,
+ int rowSize
+ ) throws IgniteCheckedException {
+ io.addRow(pageAddr, row, rowSize, pageSize());
+
+ if (isWalDeltaRecordNeeded(wal, page)) {
+ // TODO This record must contain only a reference to a logical WAL record with the actual data.
+ byte[] payload = new byte[rowSize];
+
+ DataPagePayload data = io.readPayload(pageAddr, PageIdUtils.itemId(row.link()), pageSize());
+
+ assert data.payloadSize() == rowSize;
+
+ PageUtils.getBytes(pageAddr, data.offset(), payload, 0, rowSize);
+
+ wal.log(new DataPageInsertRecord(
+ cacheId,
+ page.id(),
+ payload));
}
- /**
- * @param page Page.
- * @param pageAddr Page address.
- * @param io IO.
- * @param row Row.
- * @param written Written size.
- * @param rowSize Row size.
- * @return Updated written size.
- * @throws IgniteCheckedException If failed.
- */
- private int addRowFragment(
- Page page,
- long pageAddr,
- DataPageIO io,
- CacheDataRow row,
- int written,
- int rowSize
- ) throws IgniteCheckedException {
- // Read last link before the fragment write, because it will be updated there.
- long lastLink = row.link();
-
- int payloadSize = io.addRowFragment(pageMem, pageAddr, row, written, rowSize, pageSize());
-
- assert payloadSize > 0 : payloadSize;
-
- if (isWalDeltaRecordNeeded(wal, page)) {
- // TODO This record must contain only a reference to a logical WAL record with the actual data.
- byte[] payload = new byte[payloadSize];
-
- DataPagePayload data = io.readPayload(pageAddr, PageIdUtils.itemId(row.link()), pageSize());
-
- PageUtils.getBytes(pageAddr, data.offset(), payload, 0, payloadSize);
-
- wal.log(new DataPageInsertFragmentRecord(cacheId, page.id(), payload, lastLink));
- }
+ return rowSize;
+ }
- return written + payloadSize;
+ /**
+ * @param page Page.
+ * @param pageAddr Page address.
+ * @param io IO.
+ * @param row Row.
+ * @param written Written size.
+ * @param rowSize Row size.
+ * @return Updated written size.
+ * @throws IgniteCheckedException If failed.
+ */
+ private int addRowFragment(
+ Page page,
+ long pageAddr,
+ DataPageIO io,
+ CacheDataRow row,
+ int written,
+ int rowSize
+ ) throws IgniteCheckedException {
+ // Read last link before the fragment write, because it will be updated there.
+ long lastLink = row.link();
+
+ int payloadSize = io.addRowFragment(pageMem, pageAddr, row, written, rowSize, pageSize());
+
+ assert payloadSize > 0 : payloadSize;
+
+ if (isWalDeltaRecordNeeded(wal, page)) {
+ // TODO This record must contain only a reference to a logical WAL record with the actual data.
+ byte[] payload = new byte[payloadSize];
+
+ DataPagePayload data = io.readPayload(pageAddr, PageIdUtils.itemId(row.link()), pageSize());
+
+ PageUtils.getBytes(pageAddr, data.offset(), payload, 0, payloadSize);
+
+ wal.log(new DataPageInsertFragmentRecord(cacheId, page.id(), payload, lastLink));
}
- };
+
+ return written + payloadSize;
+ }
+ };
+
/** */
- private final PageHandler<Void, Long> rmvRow = new PageHandler<Void, Long>() {
+ private final PageHandler<Void, Long> rmvRow = new RemoveRowHandler();
+
+ /**
+ *
+ */
+ private class RemoveRowHandler extends PageHandler<Void, Long> {
+ /** {@inheritDoc} */
@Override public Long run(Page page, PageIO iox, long pageAddr, Void arg, int itemId)
throws IgniteCheckedException {
DataPageIO io = (DataPageIO)iox;
http://git-wip-us.apache.org/repos/asf/ignite/blob/0d19ed5e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
index df14dc1..945f4dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
@@ -1213,25 +1213,53 @@ public class DataPageIO extends PageIO {
// Move right all of the entries if possible to make the page as compact as possible to its tail.
int prevOff = pageSize;
- for (int i = directCnt - 1; i >= 0; i--) {
- int off = offs[i] >>> 8;
+ final int start = directCnt - 1;
+ int curOff = offs[start] >>> 8;
+ int curEntrySize = getPageEntrySize(pageAddr, curOff, SHOW_PAYLOAD_LEN | SHOW_LINK);
- assert off < prevOff: off;
+ for (int i = start; i >= 0; i--) {
+ assert curOff < prevOff : curOff;
- int entrySize = getPageEntrySize(pageAddr, off, SHOW_PAYLOAD_LEN | SHOW_LINK);
+ int delta = prevOff - (curOff + curEntrySize);
- int delta = prevOff - (off + entrySize);
+ int off = curOff;
+ int entrySize = curEntrySize;
if (delta != 0) { // Move right.
assert delta > 0: delta;
- moveBytes(pageAddr, off, entrySize, delta, pageSize);
-
int itemId = offs[i] & 0xFF;
- off += delta;
+ setItem(pageAddr, itemId, directItemFromOffset(curOff + delta));
+
+ for (int j = i - 1; j >= 0; j--) {
+ int offNext = offs[j] >>> 8;
+ int nextSize = getPageEntrySize(pageAddr, offNext, SHOW_PAYLOAD_LEN | SHOW_LINK);
+
+ if (offNext + nextSize == off) {
+ i--;
+
+ off = offNext;
+ entrySize += nextSize;
- setItem(pageAddr, itemId, directItemFromOffset(off));
+ itemId = offs[j] & 0xFF;
+ setItem(pageAddr, itemId, directItemFromOffset(offNext + delta));
+ }
+ else {
+ curOff = offNext;
+ curEntrySize = nextSize;
+
+ break;
+ }
+ }
+
+ moveBytes(pageAddr, off, entrySize, delta, pageSize);
+
+ off += delta;
+ }
+ else if (i > 0) {
+ curOff = offs[i - 1] >>> 8;
+ curEntrySize = getPageEntrySize(pageAddr, curOff, SHOW_PAYLOAD_LEN | SHOW_LINK);
}
prevOff = off;