Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-compact2 8ad7c8cd6 -> 328cddc2c


tmp


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

Branch: refs/heads/ignite-3477-compact2
Commit: e623cf8dcffea1b7d5295283b3e2d81960a8ec3c
Parents: 8ad7c8c
Author: sboikov <[email protected]>
Authored: Fri Feb 10 16:28:37 2017 +0300
Committer: sboikov <[email protected]>
Committed: Fri Feb 10 16:28:37 2017 +0300

----------------------------------------------------------------------
 .../cache/database/tree/io/DataPageIO.java      | 86 ++++++++++++--------
 1 file changed, 50 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e623cf8d/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 f749764..aad16a0 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
@@ -1284,13 +1284,13 @@ public class DataPageIO extends PageIO {
         int pageSize,
         int newEntrySize,
         CacheDataRow row) throws IgniteCheckedException {
-        //cnt.increment();
+        cnt.increment();
 
         assert checkCount(directCnt): directCnt;
 
         int rmvdCnt = getRemovedCount(pageAddr);
 
-        boolean canAddItem = false;
+        boolean canAddItem;
 
         if (rmvdCnt > 0 && row != null) {
             canAddItem = canAddItem(pageAddr, directCnt, indirectCnt, 
getFirstEntryOffset(pageAddr));
@@ -1300,6 +1300,10 @@ public class DataPageIO extends PageIO {
 
                 int rmvdItemOff = REMOVED_ITEMS_OFF;
 
+                int diff = Integer.MAX_VALUE;
+                int foundDataOff = 0;
+                int foundRmvItemOff = 0;
+
                 for (int i = 0; i < MAX_REMOVED_CNT; i++) {
                     int rmvdItem = PageUtils.getInt(pageAddr, rmvdItemOff);
 
@@ -1308,53 +1312,63 @@ public class DataPageIO extends PageIO {
 
                         assert size >= 0 && size < pageSize : size;
 
-                        if (size >= newEntrySize) {
-                            //foundCnt1.increment();
+                        int diff0 = size - newEntrySize;
 
-                            int newEntryOff = rmvdItem >>> 16;
+                        if (diff0 > 0) {
+                            if (diff0 < diff) {
+                                foundDataOff = rmvdItem >>> 16;
+                                diff = diff0;
+                                foundRmvItemOff = rmvdItemOff;
+                            }
+                        } else if (diff0 == 0) {
+                            foundRmvItemOff = rmvdItemOff;
+                            foundDataOff = rmvdItem >>> 16;
 
-                            try {
-                                assert newEntryOff > ITEMS_OFF && newEntryOff 
< pageSize /*&& newEntryOff != getFirstEntryOffset(pageAddr)*/ :
-                                    "new=" + newEntryOff +
-                                    ", first=" + getFirstEntryOffset(pageAddr) 
+
-                                    ", size=" + size +
-                                    ", newSize=" + newEntrySize +
-                                    ", free=" + actualFreeSpace(pageAddr, 
pageSize) +
-                                    ", page=" + printPageLayout(pageAddr, 
pageSize);
+                            break;
+                        }
 
-                                writeRowData(pageAddr, newEntryOff, 
newEntrySize - ITEM_SIZE - PAYLOAD_LEN_SIZE, row, true);
+                        if (++cnt == rmvdCnt)
+                            break;
+                    }
+
+                    rmvdItemOff += REMOVED_ITEM_SIZE;
+                }
 
-                                int itemId = insertItem(pageAddr, newEntryOff, 
directCnt, indirectCnt, pageSize);
+                if (foundDataOff != 0) {
+                    foundCnt1.increment();
 
-                                assert checkIndex(itemId) : itemId;
-                                assert getIndirectCount(pageAddr) <= 
getDirectCount(pageAddr);
+                    try {
+                        assert foundDataOff > ITEMS_OFF && foundDataOff < 
pageSize /*&& newEntryOff != getFirstEntryOffset(pageAddr)*/ :
+                            "new=" + foundDataOff +
+                                ", first=" + getFirstEntryOffset(pageAddr) +
+                                ", newSize=" + newEntrySize +
+                                ", free=" + actualFreeSpace(pageAddr, 
pageSize) +
+                                ", page=" + printPageLayout(pageAddr, 
pageSize);
 
-                                // Update free space. If number of indirect 
items changed, then we were able to reuse an item slot.
-                                setRealFreeSpace(pageAddr,
-                                    getRealFreeSpace(pageAddr) - newEntrySize 
+ (getIndirectCount(pageAddr) != indirectCnt ? ITEM_SIZE : 0),
-                                    pageSize);
+                        writeRowData(pageAddr, foundDataOff, newEntrySize - 
ITEM_SIZE - PAYLOAD_LEN_SIZE, row, true);
 
-                                setLink(row, pageAddr, itemId);
+                        int itemId = insertItem(pageAddr, foundDataOff, 
directCnt, indirectCnt, pageSize);
 
-                                PageUtils.putInt(pageAddr, rmvdItemOff, 0);
-                                setRemovedCount(pageAddr, rmvdCnt - 1);
-                            }
-                            catch (AssertionError e) {
-                                e.printStackTrace(System.out);
+                        assert checkIndex(itemId) : itemId;
+                        assert getIndirectCount(pageAddr) <= 
getDirectCount(pageAddr);
 
-                                System.out.println();
+                        // Update free space. If number of indirect items 
changed, then we were able to reuse an item slot.
+                        setRealFreeSpace(pageAddr,
+                            getRealFreeSpace(pageAddr) - newEntrySize + 
(getIndirectCount(pageAddr) != indirectCnt ? ITEM_SIZE : 0),
+                            pageSize);
 
-                                throw e;
-                            }
+                        setLink(row, pageAddr, itemId);
 
-                            return 0;
-                        }
+                        PageUtils.putInt(pageAddr, foundRmvItemOff, 0);
+                        setRemovedCount(pageAddr, rmvdCnt - 1);
+                    }
+                    catch (AssertionError e) {
+                        e.printStackTrace(System.out);
 
-                        if (++cnt == rmvdCnt)
-                            break;
+                        throw e;
                     }
 
-                    rmvdItemOff += REMOVED_ITEM_SIZE;
+                    return 0;
                 }
             }
             else
@@ -1453,7 +1467,7 @@ public class DataPageIO extends PageIO {
                 assert delta > 0 : delta;
 
                 if (row != null && delta >= newEntrySize) {
-                    //foundCnt2.increment();
+                    foundCnt2.increment();
 
                     int newEntryOff = curOff + curEntrySize;
 

Reply via email to