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

ignite git commit: ignite-3477

Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-compact f9f105571 -> 3285305ed


ignite-3477


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

Branch: refs/heads/ignite-3477-compact
Commit: 3285305ed8eefa4a041dd67fe82159e687d33a2b
Parents: f9f1055
Author: sboikov <sb...@gridgain.com>
Authored: Wed Feb 1 11:15:23 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Feb 1 11:15:23 2017 +0300

----------------------------------------------------------------------
 .../cache/database/freelist/FreeListImpl.java   | 241 ++++++++++---------
 .../cache/database/tree/io/DataPageIO.java      |  25 +-
 2 files changed, 147 insertions(+), 119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3285305e/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/3285305e/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 010a7fe..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,21 +1213,24 @@ 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;
 
                 int itemId = offs[i] & 0xFF;
 
-                setItem(pageAddr, itemId, directItemFromOffset(off + delta));
+                setItem(pageAddr, itemId, directItemFromOffset(curOff + delta));
 
                 for (int j = i - 1; j >= 0; j--) {
                     int offNext = offs[j] >>> 8;
@@ -1242,14 +1245,22 @@ public class DataPageIO extends PageIO {
                         itemId = offs[j] & 0xFF;
                         setItem(pageAddr, itemId, directItemFromOffset(offNext + delta));
                     }
-                    else
+                    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;
         }