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/30 17:47:13 UTC

[1/9] ignite git commit: ignite-3477 Minor

Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-freelist 260aee1c8 -> a4256544b


ignite-3477 Minor


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

Branch: refs/heads/ignite-3477-freelist
Commit: 9c87affb45da9d41068ea80b58989ac7067ed41b
Parents: ad06102
Author: sboikov <sb...@gridgain.com>
Authored: Fri Jan 27 16:12:40 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jan 27 16:12:40 2017 +0300

----------------------------------------------------------------------
 .../src/main/java/org/apache/ignite/internal/IgniteKernal.java | 4 ++++
 .../java/org/apache/ignite/internal/pagemem/PageMemory.java    | 5 +++++
 .../ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java    | 6 ++----
 .../processors/cache/database/freelist/FreeListImpl.java       | 2 +-
 .../internal/processors/cache/database/freelist/PagesList.java | 1 -
 .../internal/processors/cache/database/tree/io/DataPageIO.java | 4 +---
 6 files changed, 13 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index c280b30..ed75db6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -97,6 +97,7 @@ import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
 import org.apache.ignite.internal.managers.failover.GridFailoverManager;
 import org.apache.ignite.internal.managers.indexing.GridIndexingManager;
 import org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
+import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.GridProcessor;
 import org.apache.ignite.internal.processors.affinity.GridAffinityProcessor;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
@@ -1126,6 +1127,8 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                                 sysPoolQSize = exec.getQueue().size();
                             }
 
+                            PageMemory pageMem = ctx.cache().context().database().pageMemory();
+
                             String id = U.id8(localNode().id());
 
                             String msg = NL +
@@ -1134,6 +1137,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                                 "    ^-- H/N/C [hosts=" + hosts + ", nodes=" + nodes + ", CPUs=" + cpus + "]" + NL +
                                 "    ^-- CPU [cur=" + dblFmt.format(cpuLoadPct) + "%, avg=" +
                                 dblFmt.format(avgCpuLoadPct) + "%, GC=" + dblFmt.format(gcPct) + "%]" + NL +
+                                "    ^-- PageMemory [pages=" + pageMem.loadedPages() + "]" + NL +
                                 "    ^-- Heap [used=" + dblFmt.format(heapUsedInMBytes) + "MB, free=" +
                                 dblFmt.format(freeHeapPct) + "%, comm=" + dblFmt.format(heapCommInMBytes) + "MB]" + NL +
                                 "    ^-- Non heap [used=" + dblFmt.format(nonHeapUsedInMBytes) + "MB, free=" +

http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
index 2e427de..6bd2ad0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
@@ -60,4 +60,9 @@ public interface PageMemory extends LifecycleAware, PageIdAllocator {
      * @return Page byte buffer.
      */
     public ByteBuffer pageBuffer(long pageAddr);
+
+    /**
+     * @return Total number of loaded pages in memory.
+     */
+    public long loadedPages();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index 3bc5241..64b7c64 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -316,10 +316,8 @@ public class PageMemoryNoStoreImpl implements PageMemory {
         }
     }
 
-    /**
-     * @return Total number of loaded pages in memory.
-     */
-    public long loadedPages() {
+    /** {@inheritDoc} */
+    @Override public long loadedPages() {
         long total = 0;
 
         for (Segment seg : segments) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/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 87d5e4d..892c1ec 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
@@ -80,7 +80,7 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
 
                 int rowSize = getRowSize(row);
 
-                boolean updated = io.updateRow(pageAddr, itemId, pageSize(), null, row, getRowSize(row));
+                boolean updated = io.updateRow(pageAddr, itemId, pageSize(), null, row, rowSize);
 
                 if (updated && isWalDeltaRecordNeeded(wal, page)) {
                     // TODO This record must contain only a reference to a logical WAL record with the actual data.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
index e44838d..6ad976e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9c87affb/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 fdb812f..df14dc1 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
@@ -452,12 +452,10 @@ public class DataPageIO extends PageIO {
     }
 
     /**
-     * Sets position to start of actual fragment data and limit to it's end.
-     *
      * @param pageAddr Page address.
      * @param itemId Item to position on.
      * @param pageSize Page size.
-     * @return Link to the next fragment or {@code 0} if it is the last fragment or the data row is not fragmented.
+     * @return Size and offset of actual fragment data, and link to the next fragment if data is fragmented.
      */
     public DataPagePayload readPayload(final long pageAddr, final int itemId, final int pageSize) {
         int dataOff = getDataOffset(pageAddr, itemId, pageSize);


[7/9] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-3477' into ignite-3477-freelist

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/ignite-3477' into ignite-3477-freelist


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

Branch: refs/heads/ignite-3477-freelist
Commit: a7652ea54c6a0b4473a14fc3a5e5dd68ba27a865
Parents: 468af80 611f9d0
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 30 14:51:03 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 30 14:51:03 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/IgniteKernal.java    | 66 ++++++++++++--------
 .../ignite/internal/pagemem/PageMemory.java     |  5 ++
 .../pagemem/impl/PageMemoryNoStoreImpl.java     |  6 +-
 .../cache/database/freelist/FreeListImpl.java   |  2 +-
 .../cache/database/freelist/PagesList.java      |  1 -
 .../cache/database/tree/io/DataPageIO.java      |  4 +-
 .../store/jdbc/CacheJdbcPojoStoreTest.java      | 13 ++++
 ...artitionedBackupNodeFailureRecoveryTest.java | 12 +++-
 .../odbc/OdbcProcessorValidationSelfTest.java   |  9 ++-
 .../cpp/core-test/config/cache-test.xml         |  1 -
 10 files changed, 80 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a7652ea5/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/a7652ea5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
----------------------------------------------------------------------


[6/9] ignite git commit: ignite-3477 lock free freelist

Posted by sb...@apache.org.
ignite-3477 lock free freelist


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

Branch: refs/heads/ignite-3477-freelist
Commit: 468af801e3715664019a6243be29a1ed38830c88
Parents: 260aee1
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 30 13:13:02 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 30 13:13:02 2017 +0300

----------------------------------------------------------------------
 .../cache/database/freelist/DataPageList.java   | 23 ++++++
 .../cache/database/freelist/FreeListImpl2.java  | 80 +++++++++++++-------
 .../database/FreeListImpl2SelfTest.java         | 16 +++-
 3 files changed, 88 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
index 33ed2aa..710164d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.pagemem.Page;
 import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.cache.database.tree.io.DataPageIO;
@@ -90,6 +91,28 @@ public class DataPageList {
         }
     }
 
+    public void dumpState(int cacheId, IgniteLogger log) throws IgniteCheckedException {
+        Head head = this.head;
+
+        long pageId = head.pageId;
+
+        if (pageId == 0) {
+            log.info("        Empty");
+
+            return;
+        }
+
+        while (pageId != 0) {
+            Page page = pageMem.page(cacheId, pageId);
+
+            long pageAddr = page.pageAddress();
+
+            log.info("        Page [id=" + pageId + ", free=" + io.getFreeSpace(pageAddr) + ']');
+
+            pageId = io.getNextPageId(pageAddr);
+        }
+    }
+
     /**
      *
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
index 81186a6..46b1ea0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
-import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.pagemem.Page;
 import org.apache.ignite.internal.pagemem.PageIdAllocator;
@@ -316,16 +316,14 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         compacter.setName("compacter");
         compacter.setDaemon(true);
 
-        //compacter.start();
+        compacter.start();
     }
 
     private void putInBucket(int bucket, Page page) throws IgniteCheckedException {
         AtomicReferenceArray<DataPageList> b = buckets[bucket];
 
-        ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
         while (true) {
-            int idx = rnd.nextInt(STACKS_PER_BUCKET);
+            int idx = randomInt(STACKS_PER_BUCKET);
 
             DataPageList list = b.get(idx);
 
@@ -354,10 +352,8 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 //        }
 //
 //        return null;
-        ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
         while (true) {
-            int idx = rnd.nextInt(STACKS_PER_BUCKET);
+            int idx = randomInt(STACKS_PER_BUCKET);
 
             DataPageList list = b.get(idx);
 
@@ -407,6 +403,26 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         return pageMem.page(cacheId, pageId);
     }
 
+    public void dumpState(IgniteLogger log) throws IgniteCheckedException {
+        int s = (int)Math.pow(2, shift);
+
+        for (int b = 0; b < BUCKETS; b++) {
+            log.info("Bucket [idx=" + b + ", spaceFrom=" + s * b + ", spaceTo=" + s * (b + 1) + "]");
+
+            AtomicReferenceArray<DataPageList> stacks = buckets[b];
+
+            for (int i = 0; i < stacks.length(); i++) {
+                log.info("    Stripe: " + i);
+
+                DataPageList pageList = stacks.get(i);
+
+                assert pageList != null;
+
+                pageList.dumpState(cacheId, log);
+            }
+        }
+    }
+
     public void compact() throws IgniteCheckedException {
         for (int b = 0; b < BUCKETS; b++)
             compactBucket(b);
@@ -430,6 +446,8 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         }
     }
 
+    public IgniteLogger log;
+
     private void compactStack(DataPageList pageList) throws IgniteCheckedException {
         Page page;
 
@@ -444,7 +462,7 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 
     private final AtomicBoolean cg = new AtomicBoolean();
 
-    public boolean locCompact;
+    public boolean locCompact = true;
 
     /** {@inheritDoc} */
     @Override public void insertDataRow(CacheDataRow row) throws IgniteCheckedException {
@@ -481,29 +499,35 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
                                 if (take) {
                                     Page page;
 
-                                    while ((page = pageList.take(cacheId)) != null) {
-                                        Boolean found = writePage(pageMem,
-                                            page,
-                                            this,
-                                            compact2,
-                                            null,
-                                            wal,
-                                            null,
-                                            freeSpace,
-                                            null);
-
-                                        assert found != null;
-
-                                        if (found) {
-                                            foundPage = page;
-
-                                            break;
+                                    try {
+                                        while ((page = pageList.take(cacheId)) != null) {
+                                            Boolean found = writePage(pageMem,
+                                                page,
+                                                this,
+                                                compact2,
+                                                null,
+                                                wal,
+                                                null,
+                                                freeSpace,
+                                                null);
+
+                                            assert found != null;
+
+                                            if (found) {
+                                                foundPage = page;
+
+                                                break;
+                                            }
                                         }
                                     }
-
-                                    stacks.set(i, pageList);
+                                    finally {
+                                        stacks.set(i, pageList);
+                                    }
                                 }
                             }
+
+                            if (foundPage != null)
+                                break;
                         }
 
                         if (foundPage != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
index bcb4c58..6bac890 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
@@ -91,6 +91,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
         pageMem = createPageMemory(1024);
 
         FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
+        fl.rnd = new Random();
 
         for (int iter = 0; iter < 100_000; iter++) {
             System.out.println("Iter: " + iter + ", allocated=" + pageMem.loadedPages());
@@ -107,6 +108,8 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
 
             for (Long link : links)
                 fl.removeDataRowByLink(link);
+
+            //fl.locCompact = true;
         }
 
         fl.close();
@@ -120,12 +123,15 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
 
         FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
 
+        fl.rnd = new Random(1);
+        fl.log = log;
+
         for (int iter = 0; iter < 1; iter++) {
             System.out.println("Iter: " + iter + ", allocated=" + pageMem.loadedPages());
 
             List<Long> links = new ArrayList<>();
 
-            for (int i = 0; i < 100_000; i++) {
+            for (int i = 0; i < 10_000; i++) {
                 TestDataRow row = new TestDataRow(64, 64);
 
                 fl.insertDataRow(row);
@@ -136,11 +142,15 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
             for (Long link : links)
                 fl.removeDataRowByLink(link);
 
+            //fl.dumpState(log);
+
             fl.locCompact = true;
 
-            TestDataRow row = new TestDataRow(64, 64);
+            for (int i = 0; i < 1000; i++) {
+                TestDataRow row = new TestDataRow(64, 64);
 
-            fl.insertDataRow(row);
+                fl.insertDataRow(row);
+            }
         }
 
         fl.close();


[5/9] ignite git commit: Code style

Posted by sb...@apache.org.
Code style


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

Branch: refs/heads/ignite-3477-freelist
Commit: 611f9d07bb6ce26341408e141106fc9ccea90de3
Parents: a1c6558
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Fri Jan 27 19:39:42 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jan 27 19:39:42 2017 +0300

----------------------------------------------------------------------
 .../src/main/java/org/apache/ignite/internal/IgniteKernal.java    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/611f9d07/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 045dc11..039e648 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -912,7 +912,8 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                 }
 
                 fillNodeAttributes(clusterProc.updateNotifierEnabled());
-            }catch (Throwable e) {
+            }
+            catch (Throwable e) {
                 // Stop discovery spi to close tcp socket.
                 ctx.discovery().stop(true);
 


[9/9] ignite git commit: ignite-3477 lock free freelist

Posted by sb...@apache.org.
ignite-3477 lock free freelist


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

Branch: refs/heads/ignite-3477-freelist
Commit: a4256544b6bee9be054fc04e7317240d8d66ff3e
Parents: 0745af2
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 30 20:02:03 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 30 20:11:39 2017 +0300

----------------------------------------------------------------------
 .../IgniteCacheDatabaseSharedManager.java       |   2 +-
 .../cache/database/freelist/DataPageList.java   |  11 +-
 .../cache/database/freelist/FreeListImpl2.java  | 336 ++++++++++++++-----
 .../cache/database/tree/io/DataPageIO.java      |  28 +-
 .../database/FreeListImpl2SelfTest.java         |  12 +-
 5 files changed, 289 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a4256544/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
index b1da249..46df221 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
@@ -80,7 +80,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      * @throws IgniteCheckedException If failed.
      */
     protected void initDataStructures() throws IgniteCheckedException {
-        freeList = new FreeListImpl2(0, cctx.gridName(), pageMem, null, cctx.wal(), 0L, true);
+        freeList = new FreeListImpl2(log, 0, cctx.gridName(), pageMem, null, cctx.wal(), 0L, true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4256544/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
index 710164d..90884ad 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
@@ -49,6 +49,8 @@ public class DataPageList {
     /** */
     private final DataPageIO io;
 
+    public volatile boolean needCompact;
+
     /**
      * @param pageMem Page memory.
      */
@@ -58,13 +60,18 @@ public class DataPageList {
         io = DataPageIO.VERSIONS.latest();
     }
 
-    public void put(Page page) throws IgniteCheckedException {
+    public void put(Page page, int bucket, int stripe) throws IgniteCheckedException {
+        long pageAddr = page.pageAddress();
+
+        io.setBucket(pageAddr, bucket);
+        io.setStripe(pageAddr, stripe);
+
         while (true) {
             Head head = this.head;
 
             Head newHead = new Head(page.id());
 
-            io.setNextPageId(page.pageAddress(), head.pageId);
+            io.setNextPageId(pageAddr, head.pageId);
 
             if (GridUnsafe.compareAndSwapObject(this, headOffset, head, newHead))
                 break;

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4256544/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
index c6859f8..a85d40d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import org.apache.ignite.IgniteCheckedException;
@@ -37,6 +39,7 @@ import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList
 import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseListImpl;
 import org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jsr166.LongAdder8;
 
 import static org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler.writePage;
 
@@ -66,7 +69,9 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 
     private final PageHandler<CacheDataRow, Boolean> updateRow = new UpdateRow();
 
-    /** */
+    /**
+     *
+     */
     private class UpdateRow extends PageHandler<CacheDataRow, Boolean> {
             @Override public Boolean run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int itemId)
                 throws IgniteCheckedException {
@@ -83,91 +88,104 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
     /** */
     private final PageHandler<Void, Boolean> compact = new Compact();
 
+    /**
+     *
+     */
     private class Compact extends PageHandler<Void, Boolean> {
-            @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void row, int itemId)
-                throws IgniteCheckedException {
-                DataPageIO io = (DataPageIO)iox;
+        @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void row, int itemId)
+            throws IgniteCheckedException {
+            DataPageIO io = (DataPageIO)iox;
 
-                int freeSpace = io.getFreeSpace(pageAddr);
+            int freeSpace = io.getFreeSpace(pageAddr);
 
-                int newFreeSpace = io.compact(pageAddr, freeSpace, pageSize());
+            int newFreeSpace = io.compact(pageAddr, freeSpace, pageSize());
 
-                assert freeSpace == newFreeSpace;
+            assert freeSpace == newFreeSpace;
 
-                if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
-                    int newBucket = bucket(newFreeSpace);
+            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+                int newBucket = bucket(newFreeSpace);
 
 //                    System.out.println("End compact [freeSpace=" + freeSpace +
 //                        ", newSpace=" + newFreeSpace +
 //                        ", b=" + newBucket + ']');
 
-                    putInBucket(newBucket, page);
-                }
+                putInBucket(newBucket, page);
+            }
 //                else
 //                    System.out.println("End compact, no reuse [freeSpace=" + freeSpace +
 //                        ", newSpace=" + newFreeSpace + ']');
 
-                return Boolean.TRUE;
-            }
-        };
+            return Boolean.TRUE;
+        }
+    };
 
     /** */
-    private final PageHandler<Void, Boolean> compact2 = new Compact2();
+    private final PageHandler<Integer, Compact2Res> compact2 = new Compact2();
 
-    private class Compact2 extends PageHandler<Void, Boolean> {
-        @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void ignore, int reqSpace)
+    /**
+     *
+     */
+    private class Compact2 extends PageHandler<Integer, Compact2Res> {
+        @Override public Compact2Res run(Page page, PageIO iox, long pageAddr, Integer b, int reqSpace)
             throws IgniteCheckedException {
             DataPageIO io = (DataPageIO)iox;
 
             int freeSpace = io.getFreeSpace(pageAddr);
 
+            int newBucket = bucket(freeSpace);
+
+            if (newBucket == b)
+                return Compact2Res.BUCKET_NOT_CHANGED;
+
             int newFreeSpace = io.compact(pageAddr, freeSpace, pageSize());
 
             assert freeSpace == newFreeSpace;
 
             if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
                 if (newFreeSpace >= reqSpace)
-                    return Boolean.TRUE;
-
-                int newBucket = bucket(newFreeSpace);
+                    return Compact2Res.FOUND;
 
                 putInBucket(newBucket, page);
             }
 
-            return Boolean.FALSE;
+            return Compact2Res.MOVED;
         }
     };
 
     /** */
     private final PageHandler<CacheDataRow, Integer> writeRow = new WriteRow();
 
+    /**
+     *
+     */
     private class WriteRow extends PageHandler<CacheDataRow, Integer> {
-            @Override public Integer run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int written)
-                throws IgniteCheckedException {
-                DataPageIO io = (DataPageIO)iox;
-
-                int rowSize = getRowSize(row);
-                int oldFreeSpace = io.getFreeSpace(pageAddr);
+        @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);
+            // Reread free space after update.
+            //int newFreeSpace = io.getFreeSpace(pageAddr);
+            int newFreeSpace = Math.max(io.getFreeSpace(pageAddr), io.getFreeSpace2(pageAddr));
 
-                    putInBucket(bucket, page);
-                }
+            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+                int bucket = bucket(newFreeSpace);
 
-                // Avoid boxing with garbage generation for usual case.
-                return written == rowSize ? COMPLETE : written;
+                putInBucket(bucket, page);
             }
 
+            // Avoid boxing with garbage generation for usual case.
+            return written == rowSize ? COMPLETE : written;
+        }
+
             /**
              * @param page Page.
              * @param pageAddr Page address.
@@ -218,6 +236,9 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
     /** */
     private final PageHandler<Void, Long> rmvRow = new RemoveRow();
 
+    /**
+     *
+     */
     private class RemoveRow extends PageHandler<Void, Long> {
         @Override public Long run(Page page, PageIO iox, long pageAddr, Void arg, int itemId)
             throws IgniteCheckedException {
@@ -225,13 +246,34 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 
             int oldFreeSpace = io.getFreeSpace(pageAddr);
 
-            assert oldFreeSpace >= 0: oldFreeSpace;
+            assert oldFreeSpace >= 0 : oldFreeSpace;
 
             long nextLink = io.removeRow(pageAddr, itemId, pageSize());
 
             int newFreeSpace = io.getFreeSpace(pageAddr);
 
-            assert newFreeSpace > oldFreeSpace;
+            //assert newFreeSpace > oldFreeSpace : "n=" + newFreeSpace + ", o=" + oldFreeSpace;
+
+            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+                int curBucket = io.getBucket(pageAddr);
+
+                assert curBucket == -1 || (curBucket >= 0 && curBucket < BUCKETS) : curBucket;
+
+                if (curBucket >= 0) {
+                    int newBucket = bucket(newFreeSpace);
+
+                    if ((newBucket != curBucket)) {
+                        int stripe = io.getStripe(pageAddr);
+
+                        assert stripe >= 0 && stripe < STACKS_PER_BUCKET : stripe;
+
+                        DataPageList list = (DataPageList)buckets[curBucket].get(stripe);
+
+                        if (list != null)
+                            list.needCompact = true;
+                    }
+                }
+            }
 
             // For common case boxed 0L will be cached inside of Long, so no garbage will be produced.
             return nextLink;
@@ -248,6 +290,16 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 
     private final ReuseListImpl reuseList;
 
+    private LongAdder8 scanCnt = new LongAdder8();
+    private LongAdder8 scanCntSuccess = new LongAdder8();
+    private LongAdder8 scanBuckets = new LongAdder8();
+
+    private LongAdder8 syncClearCnt = new LongAdder8();
+    private LongAdder8 syncClearSuccess = new LongAdder8();
+    private LongAdder8 syncClearBuckets = new LongAdder8();
+    private LongAdder8 syncClearLists = new LongAdder8();
+    private LongAdder8 syncClearPages = new LongAdder8();
+
     /**
      * @param cacheId Cache ID.
      * @param name Name (for debug purpose).
@@ -259,6 +311,7 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
      * @throws IgniteCheckedException If failed.
      */
     public FreeListImpl2(
+        final IgniteLogger log,
         int cacheId,
         String name,
         PageMemory pageMem,
@@ -267,6 +320,7 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         long metaPageId,
         boolean initNew) throws IgniteCheckedException {
         super(cacheId, pageMem, wal);
+        this.log = log;
         this.reuseList = new ReuseListImpl(cacheId, name, pageMem, wal, 0, true);
 
         int pageSize = pageMem.pageSize();
@@ -317,6 +371,53 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         compacter.setDaemon(true);
 
         compacter.start();
+
+        Thread dump = new Thread(new Runnable() {
+            @Override public void run() {
+                try {
+                    while (!Thread.currentThread().isInterrupted()) {
+                        {
+                            long scanCnt0 = scanCnt.sumThenReset();
+
+                            if (scanCnt0 > 0) {
+                                long scanCntSuccess0 = scanCntSuccess.sumThenReset();
+                                long scanBuckets0 = scanBuckets.sumThenReset();
+
+                                log.info("Bucket scans [total=" + scanCnt0 +
+                                    ", success=" + scanCntSuccess0 +
+                                    ", success %=" + scanCntSuccess0 / (double)scanCnt0 +
+                                    ", avgBuckets=" + scanBuckets0 / (double)scanCnt0 + ']');
+                            }
+                        }
+
+                        long syncClearCnt0 = syncClearCnt.sumThenReset();
+
+                        if (syncClearCnt0 > 0) {
+                            long syncClearSuccess0 = syncClearSuccess.sumThenReset();
+                            long syncClearBuckets0 = syncClearBuckets.sumThenReset();
+                            long syncClearLists0 = syncClearLists.sumThenReset();
+                            long syncClearPages0 = syncClearPages.sumThenReset();
+
+                            log.info("Sync clear [total=" + syncClearCnt0 +
+                                ", success=" + syncClearSuccess0 +
+                                ", success %=" + syncClearSuccess0 / (double)syncClearCnt0 +
+                                ", avgBuckets=" + syncClearBuckets0 / (double)syncClearCnt0 +
+                                ", avgLists=" + syncClearLists0 / (double)syncClearCnt0 +
+                                ", avgPages=" + syncClearPages0 / (double)syncClearCnt0 +
+                                ']');
+                        }
+
+                        Thread.sleep(5000);
+                    }
+                }
+                catch (Exception e) {
+                    if (!(e instanceof InterruptedException))
+                        e.printStackTrace();
+                }
+            }
+        });
+        dump.setDaemon(true);
+        dump.start();
     }
 
     private void putInBucket(int bucket, Page page) throws IgniteCheckedException {
@@ -330,7 +431,7 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
             if (list != null) {
                 //System.out.println(Thread.currentThread().getName() + " put in bucket [b=" + bucket + ", stripe=" + idx + ']');
 
-                list.put(page);
+                list.put(page, bucket, idx);
 
                 return;
             }
@@ -434,12 +535,14 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         for (int i = 0; i < stacks.length(); i++) {
             DataPageList pageList = stacks.get(i);
 
-            if (pageList != null) {
+            if (pageList != null && pageList.needCompact) {
                 boolean take = stacks.compareAndSet(i, pageList, null);
 
                 if (take) {
                     compactStack(pageList);
 
+                    pageList.needCompact = false;
+
                     stacks.set(i, pageList);
                 }
             }
@@ -471,84 +574,139 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         int written = 0;
 
         do {
-            int freeSpace = Math.min(MIN_SIZE_FOR_DATA_PAGE, rowSize - written);
+            final int freeSpace = Math.min(MIN_SIZE_FOR_DATA_PAGE, rowSize - written);
 
-            int bucket = bucket(freeSpace);
+            final int bucket = bucket(freeSpace);
 
             Page foundPage = null;
 
+            int cntr = 0;
+
             // TODO: properly handle reuse bucket.
             for (int b = bucket; b < BUCKETS; b++) {
+                cntr++;
+
                 foundPage = takeFromBucket(b);
 
                 if (foundPage != null)
                     break;
             }
 
-            if (locCompact && foundPage == null && bucket > 0 && cg.compareAndSet(false, true)) {
-                try {
-                    for (int b = 0; b < bucket; b++) {
-                        AtomicReferenceArray<DataPageList> stacks = buckets[b];
+            scanCnt.increment();
+            scanBuckets.add(cntr);
+
+            if (foundPage != null)
+                scanCntSuccess.increment();
+
+            if (foundPage == null && bucket > 0)
+                foundPage = syncClear(freeSpace, bucket);
+
+            try (Page page = foundPage == null ? allocateDataPage(row.partition()) : foundPage) {
+                // If it is an existing page, we do not need to initialize it.
+                DataPageIO init = foundPage == null ? DataPageIO.VERSIONS.latest() : null;
+
+                written = writePage(pageMem, page, this, writeRow, init, wal, row, written, FAIL_I);
+
+                assert written != FAIL_I; // We can't fail here.
+            }
+        }
+        while (written != COMPLETE);
+    }
+
+    enum Compact2Res {
+        FOUND,
+        MOVED,
+        BUCKET_NOT_CHANGED
+    }
+
+    private Page syncClear(final int freeSpace, final int bucket) throws IgniteCheckedException {
+        if (locCompact && cg.compareAndSet(false, true)) {
+            int buckets = 0;
+            int lists = 0;
+            int pages = 0;
+
+            boolean res = false;
+
+            try {
+                for (int b = 0; b < bucket; b++) {
+                    buckets++;
+
+                    AtomicReferenceArray<DataPageList> stacks = this.buckets[b];
+
+                    final Integer B = b;
+
+                    for (int i = 0; i < STACKS_PER_BUCKET; i++) {
+                        DataPageList pageList = stacks.get(i);
+
+                        if (pageList != null && pageList.needCompact) {
+                            lists++;
+
+                            boolean take = stacks.compareAndSet(i, pageList, null);
+
+                            if (take) {
+                                Page page;
 
-                        for (int i = 0; i < STACKS_PER_BUCKET; i++) {
-                            DataPageList pageList = stacks.get(i);
+                                List<Page> mvPages = null;
 
-                            if (pageList != null) {
-                                boolean take = stacks.compareAndSet(i, pageList, null);
+                                try {
+                                    while ((page = pageList.take(cacheId)) != null) {
+                                        pages++;
 
-                                if (take) {
-                                    Page page;
+                                        Compact2Res found = writePage(pageMem,
+                                            page,
+                                            this,
+                                            compact2,
+                                            null,
+                                            wal,
+                                            B,
+                                            freeSpace,
+                                            null);
 
-                                    try {
-                                        while ((page = pageList.take(cacheId)) != null) {
-                                            Boolean found = writePage(pageMem,
-                                                page,
-                                                this,
-                                                compact2,
-                                                null,
-                                                wal,
-                                                null,
-                                                freeSpace,
-                                                null);
+                                        assert found != null;
 
-                                            assert found != null;
+                                        if (found == Compact2Res.FOUND) {
+                                            res = true;
 
-                                            if (found) {
-                                                foundPage = page;
+                                            return page;
+                                        }
+                                        else if (found == Compact2Res.BUCKET_NOT_CHANGED) {
+                                            if (mvPages == null)
+                                                mvPages = new ArrayList<>();
 
-                                                break;
-                                            }
+                                            mvPages.add(page);
                                         }
                                     }
-                                    finally {
-                                        stacks.set(i, pageList);
+                                }
+                                finally {
+                                    if (mvPages != null) {
+                                        for (int p = 0; p < mvPages.size(); p++)
+                                            pageList.put(mvPages.get(p), b, i);
                                     }
+
+                                    if (!res)
+                                        pageList.needCompact = false;
+
+                                    stacks.set(i, pageList);
                                 }
                             }
-
-                            if (foundPage != null)
-                                break;
                         }
-
-                        if (foundPage != null)
-                            break;
                     }
                 }
-                finally {
-                    cg.set(false);
-                }
             }
+            finally {
+                if (res)
+                    syncClearSuccess.increment();
 
-            try (Page page = foundPage == null ? allocateDataPage(row.partition()) : foundPage) {
-                // If it is an existing page, we do not need to initialize it.
-                DataPageIO init = foundPage == null ? DataPageIO.VERSIONS.latest() : null;
-
-                written = writePage(pageMem, page, this, writeRow, init, wal, row, written, FAIL_I);
+                syncClearCnt.increment();
+                syncClearBuckets.add(buckets);
+                syncClearLists.add(lists);
+                syncClearPages.add(pages);
 
-                assert written != FAIL_I; // We can't fail here.
+                cg.set(false);
             }
         }
-        while (written != COMPLETE);
+
+        return null;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4256544/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 5618a8c..ac2cf13 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
@@ -54,7 +54,13 @@ public class DataPageIO extends PageIO {
     private static final int NEXT_PAGE_ID_OFF = COMMON_HEADER_END;
 
     /** */
-    private static final int FREE_LIST_PAGE_ID_OFF = NEXT_PAGE_ID_OFF + 8;
+    private static final int BUCKET_OFF = NEXT_PAGE_ID_OFF + 8;
+
+    /** */
+    private static final int STRIPE_OFF = BUCKET_OFF + 4;
+
+    /** */
+    private static final int FREE_LIST_PAGE_ID_OFF = STRIPE_OFF + 4;
 
     /** */
     private static final int FREE_SPACE_OFF = FREE_LIST_PAGE_ID_OFF + 8;
@@ -99,6 +105,8 @@ public class DataPageIO extends PageIO {
 
         setEmptyPage(pageAddr, pageSize);
         setFreeListPageId(pageAddr, 0L);
+        setBucket(pageAddr, -1);
+        setStripe(pageAddr, -1);
     }
 
     /**
@@ -144,6 +152,22 @@ public class DataPageIO extends PageIO {
         return PageUtils.getLong(pageAddr, NEXT_PAGE_ID_OFF);
     }
 
+    public void setBucket(long pageAddr, int bucket) {
+        PageUtils.putInt(pageAddr, BUCKET_OFF, bucket);
+    }
+
+    public int getBucket(long pageAddr) {
+        return PageUtils.getInt(pageAddr, BUCKET_OFF);
+    }
+
+    public void setStripe(long pageAddr, int stripe) {
+        PageUtils.putInt(pageAddr, STRIPE_OFF, stripe);
+    }
+
+    public int getStripe(long pageAddr) {
+        return PageUtils.getInt(pageAddr, STRIPE_OFF);
+    }
+
     /**
      * @param pageAddr Page address.
      * @param dataOff Data offset.
@@ -218,7 +242,7 @@ public class DataPageIO extends PageIO {
         int indirectCnt = getIndirectCount(pageAddr);
         int firstEntryOff = getFirstEntryOffset(pageAddr);
 
-        return firstEntryOff - (ITEMS_OFF + ITEM_SIZE * (directCnt + indirectCnt));
+        return firstEntryOff - (ITEMS_OFF + ITEM_SIZE * (directCnt + indirectCnt)) - (ITEM_SIZE + PAYLOAD_LEN_SIZE + LINK_SIZE);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4256544/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
index 6bac890..ce3595e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
@@ -90,7 +90,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
     public void testCompact() throws Exception {
         pageMem = createPageMemory(1024);
 
-        FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
+        FreeListImpl2 fl = new FreeListImpl2(log, 1, "freelist", pageMem, null, null, 0, true);
         fl.rnd = new Random();
 
         for (int iter = 0; iter < 100_000; iter++) {
@@ -121,7 +121,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
     public void testCompact1() throws Exception {
         pageMem = createPageMemory(1024);
 
-        FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
+        FreeListImpl2 fl = new FreeListImpl2(log, 1, "freelist", pageMem, null, null, 0, true);
 
         fl.rnd = new Random(1);
         fl.log = log;
@@ -171,7 +171,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
 
             assert id != 0;
 
-            pl.put(pageMem.page(1, id));
+            pl.put(pageMem.page(1, id), 0, 0);
 
             ids.push(id);
         }
@@ -206,7 +206,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
             System.out.println("Iter: " + i);
 
             for (Long id : ids)
-                pl.put(pageMem.page(1, id));
+                pl.put(pageMem.page(1, id), 0, 0);
 
             final int THREADS = 16;
 
@@ -258,7 +258,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
             System.out.println("Iter: " + i);
 
             for (Long id : ids)
-                pl.put(pageMem.page(1, id));
+                pl.put(pageMem.page(1, id), 0, 0);
 
             final int THREADS = 16;
 
@@ -279,7 +279,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
                             takeCnt.incrementAndGet();
 
                             if (ThreadLocalRandom.current().nextBoolean()) {
-                                pl.put(page);
+                                pl.put(page, 0, 0);
 
                                 putCnt.incrementAndGet();
                             }


[4/9] ignite git commit: Merge branch 'ignite-db-x' of https://github.com/gridgain/apache-ignite into ignite-db-x

Posted by sb...@apache.org.
Merge branch 'ignite-db-x' of https://github.com/gridgain/apache-ignite into ignite-db-x


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

Branch: refs/heads/ignite-3477-freelist
Commit: a1c6558cba5caee05941d6203bff1d5be0b77586
Parents: 9c87aff e15cbe8
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Fri Jan 27 19:37:42 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jan 27 19:37:42 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/IgniteKernal.java    | 61 +++++++++++---------
 .../store/jdbc/CacheJdbcPojoStoreTest.java      | 13 +++++
 ...artitionedBackupNodeFailureRecoveryTest.java | 12 +++-
 .../odbc/OdbcProcessorValidationSelfTest.java   |  9 ++-
 .../cpp/core-test/config/cache-test.xml         |  1 -
 5 files changed, 66 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a1c6558c/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------


[8/9] ignite git commit: ignite-3477 lock free freelist

Posted by sb...@apache.org.
ignite-3477 lock free freelist


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

Branch: refs/heads/ignite-3477-freelist
Commit: 0745af2ec7674f02627bbdf5cd6d1cbd22217713
Parents: a7652ea
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 30 14:51:48 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 30 16:24:16 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/IgniteKernal.java    |  1 -
 .../cache/database/freelist/FreeListImpl2.java  | 62 ++++++++++----------
 2 files changed, 31 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0745af2e/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index c055563..039e648 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1142,7 +1142,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                             String msg = NL +
                                 "Metrics for local node (to disable set 'metricsLogFrequency' to 0)" + NL +
                                 "    ^-- Node [id=" + id + ", name=" + name() + ", uptime=" + getUpTimeFormatted() + "]" + NL +
-                                "    ^-- Memory [allocPages=" + ctx.cache().context().database().pages()+ "]" + NL +
                                 "    ^-- H/N/C [hosts=" + hosts + ", nodes=" + nodes + ", CPUs=" + cpus + "]" + NL +
                                 "    ^-- CPU [cur=" + dblFmt.format(cpuLoadPct) + "%, avg=" +
                                 dblFmt.format(avgCpuLoadPct) + "%, GC=" + dblFmt.format(gcPct) + "%]" + NL +

http://git-wip-us.apache.org/repos/asf/ignite/blob/0745af2e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
index 46b1ea0..c6859f8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
@@ -37,7 +37,6 @@ import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList
 import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseListImpl;
 import org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.jsr166.LongAdder8;
 
 import static org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler.writePage;
 
@@ -65,9 +64,10 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
     /** */
     private final int MIN_SIZE_FOR_DATA_PAGE;
 
+    private final PageHandler<CacheDataRow, Boolean> updateRow = new UpdateRow();
+
     /** */
-    private final PageHandler<CacheDataRow, Boolean> updateRow =
-        new PageHandler<CacheDataRow, Boolean>() {
+    private class UpdateRow extends PageHandler<CacheDataRow, Boolean> {
             @Override public Boolean run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int itemId)
                 throws IgniteCheckedException {
                 DataPageIO io = (DataPageIO)iox;
@@ -81,8 +81,9 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         };
 
     /** */
-    private final PageHandler<Void, Boolean> compact =
-        new PageHandler<Void, Boolean>() {
+    private final PageHandler<Void, Boolean> compact = new Compact();
+
+    private class Compact extends PageHandler<Void, Boolean> {
             @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void row, int itemId)
                 throws IgniteCheckedException {
                 DataPageIO io = (DataPageIO)iox;
@@ -111,37 +112,36 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         };
 
     /** */
-    private final PageHandler<Void, Boolean> compact2 =
-        new PageHandler<Void, Boolean>() {
-            @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void ignore, int reqSpace)
-                throws IgniteCheckedException {
-                DataPageIO io = (DataPageIO)iox;
+    private final PageHandler<Void, Boolean> compact2 = new Compact2();
 
-                int freeSpace = io.getFreeSpace(pageAddr);
-                int ts1 = io.getFreeSpace2(pageAddr);
+    private class Compact2 extends PageHandler<Void, Boolean> {
+        @Override public Boolean run(Page page, PageIO iox, long pageAddr, Void ignore, int reqSpace)
+            throws IgniteCheckedException {
+            DataPageIO io = (DataPageIO)iox;
 
-                int newFreeSpace = io.compact(pageAddr, freeSpace, pageSize());
+            int freeSpace = io.getFreeSpace(pageAddr);
 
-                int ts2 = io.getFreeSpace2(pageAddr);
+            int newFreeSpace = io.compact(pageAddr, freeSpace, pageSize());
 
-                assert freeSpace == newFreeSpace;
+            assert freeSpace == newFreeSpace;
 
-                if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
-                    if (newFreeSpace > reqSpace)
-                        return Boolean.TRUE;
+            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+                if (newFreeSpace >= reqSpace)
+                    return Boolean.TRUE;
 
-                    int newBucket = bucket(newFreeSpace);
+                int newBucket = bucket(newFreeSpace);
 
-                    putInBucket(newBucket, page);
-                }
-
-                return Boolean.FALSE;
+                putInBucket(newBucket, page);
             }
-        };
+
+            return Boolean.FALSE;
+        }
+    };
 
     /** */
-    private final PageHandler<CacheDataRow, Integer> writeRow =
-        new PageHandler<CacheDataRow, Integer>() {
+    private final PageHandler<CacheDataRow, Integer> writeRow = new WriteRow();
+
+    private class WriteRow extends PageHandler<CacheDataRow, Integer> {
             @Override public Integer run(Page page, PageIO iox, long pageAddr, CacheDataRow row, int written)
                 throws IgniteCheckedException {
                 DataPageIO io = (DataPageIO)iox;
@@ -216,7 +216,9 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         };
 
     /** */
-    private final PageHandler<Void, Long> rmvRow = new PageHandler<Void, Long>() {
+    private final PageHandler<Void, Long> rmvRow = new RemoveRow();
+
+    private class RemoveRow extends PageHandler<Void, Long> {
         @Override public Long run(Page page, PageIO iox, long pageAddr, Void arg, int itemId)
             throws IgniteCheckedException {
             DataPageIO io = (DataPageIO)iox;
@@ -304,11 +306,9 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
                         Thread.sleep(100);
                     }
                 }
-                catch (InterruptedException ignore) {
-                    // No-op.
-                }
                 catch (Exception e) {
-                    e.printStackTrace();
+                    if (!(e instanceof InterruptedException))
+                        e.printStackTrace();
                 }
             }
         });


[3/9] ignite git commit: ignite-db-x remove swapEnabled in xml config

Posted by sb...@apache.org.
ignite-db-x remove swapEnabled in xml config


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

Branch: refs/heads/ignite-3477-freelist
Commit: e15cbe8b283bd9dc5cc9e3c355a4326c718e510f
Parents: 0e78dd1
Author: Dmitriy Govorukhin <dg...@gridgain.com>
Authored: Fri Jan 27 18:11:06 2017 +0300
Committer: Dmitriy Govorukhin <dg...@gridgain.com>
Committed: Fri Jan 27 18:11:06 2017 +0300

----------------------------------------------------------------------
 modules/platforms/cpp/core-test/config/cache-test.xml | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e15cbe8b/modules/platforms/cpp/core-test/config/cache-test.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/config/cache-test.xml b/modules/platforms/cpp/core-test/config/cache-test.xml
index 0ea5876..fc11722 100644
--- a/modules/platforms/cpp/core-test/config/cache-test.xml
+++ b/modules/platforms/cpp/core-test/config/cache-test.xml
@@ -129,7 +129,6 @@
     <bean id="cache-template" abstract="true" class="org.apache.ignite.configuration.CacheConfiguration">
         <property name="rebalanceMode" value="SYNC"/>
         <property name="writeSynchronizationMode" value="FULL_SYNC"/>
-        <property name="swapEnabled" value="true"/>
         <property name="backups" value="1"/>
         <property name="eagerTtl" value="true"/>
     </bean>


[2/9] ignite git commit: ignite-db-x fix testBackUpFail, close tcp port if fail on start, refactoring odbc test, fix testParallelLoad, testLoadCache for binary mode.

Posted by sb...@apache.org.
ignite-db-x fix testBackUpFail, close tcp port if fail on start, refactoring odbc test, fix testParallelLoad, testLoadCache  for binary mode.


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

Branch: refs/heads/ignite-3477-freelist
Commit: 0e78dd1dd4e039dcf1ec094e1c84733529d6fedc
Parents: ad06102
Author: Dmitriy Govorukhin <dg...@gridgain.com>
Authored: Fri Jan 27 16:18:12 2017 +0300
Committer: Dmitriy Govorukhin <dg...@gridgain.com>
Committed: Fri Jan 27 16:18:12 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/IgniteKernal.java    | 61 +++++++++++---------
 .../store/jdbc/CacheJdbcPojoStoreTest.java      | 13 +++++
 ...artitionedBackupNodeFailureRecoveryTest.java | 12 +++-
 .../odbc/OdbcProcessorValidationSelfTest.java   |  9 ++-
 4 files changed, 66 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0e78dd1d/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index c280b30..c11b770 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -880,37 +880,44 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
 
             // Start processors before discovery manager, so they will
             // be able to start receiving messages once discovery completes.
-            startProcessor(createComponent(DiscoveryNodeValidationProcessor.class, ctx));
-            startProcessor(new GridClockSyncProcessor(ctx));
-            startProcessor(new GridAffinityProcessor(ctx));
-            startProcessor(createComponent(GridSegmentationProcessor.class, ctx));
-            startProcessor(createComponent(IgniteCacheObjectProcessor.class, ctx));
-            startProcessor(new GridCacheProcessor(ctx));
-            startProcessor(new GridClusterStateProcessor(ctx));
-            startProcessor(new GridQueryProcessor(ctx));
-            startProcessor(new OdbcProcessor(ctx));
-            startProcessor(new GridServiceProcessor(ctx));
-            startProcessor(new GridTaskSessionProcessor(ctx));
-            startProcessor(new GridJobProcessor(ctx));
-            startProcessor(new GridTaskProcessor(ctx));
-            startProcessor((GridProcessor)SCHEDULE.createOptional(ctx));
-            startProcessor(new GridRestProcessor(ctx));
-            startProcessor(new DataStreamProcessor(ctx));
-            startProcessor((GridProcessor)IGFS.create(ctx, F.isEmpty(cfg.getFileSystemConfiguration())));
-            startProcessor(new GridContinuousProcessor(ctx));
-            startProcessor(createHadoopComponent());
-            startProcessor(new DataStructuresProcessor(ctx));
-            startProcessor(createComponent(PlatformProcessor.class, ctx));
+            try {
+                startProcessor(createComponent(DiscoveryNodeValidationProcessor.class, ctx));
+                startProcessor(new GridClockSyncProcessor(ctx));
+                startProcessor(new GridAffinityProcessor(ctx));
+                startProcessor(createComponent(GridSegmentationProcessor.class, ctx));
+                startProcessor(createComponent(IgniteCacheObjectProcessor.class, ctx));
+                startProcessor(new GridCacheProcessor(ctx));
+                startProcessor(new GridClusterStateProcessor(ctx));
+                startProcessor(new GridQueryProcessor(ctx));
+                startProcessor(new OdbcProcessor(ctx));
+                startProcessor(new GridServiceProcessor(ctx));
+                startProcessor(new GridTaskSessionProcessor(ctx));
+                startProcessor(new GridJobProcessor(ctx));
+                startProcessor(new GridTaskProcessor(ctx));
+                startProcessor((GridProcessor)SCHEDULE.createOptional(ctx));
+                startProcessor(new GridRestProcessor(ctx));
+                startProcessor(new DataStreamProcessor(ctx));
+                startProcessor((GridProcessor)IGFS.create(ctx, F.isEmpty(cfg.getFileSystemConfiguration())));
+                startProcessor(new GridContinuousProcessor(ctx));
+                startProcessor(createHadoopComponent());
+                startProcessor(new DataStructuresProcessor(ctx));
+                startProcessor(createComponent(PlatformProcessor.class, ctx));
+
+                // Start plugins.
+                for (PluginProvider provider : ctx.plugins().allProviders()) {
+                    ctx.add(new GridPluginComponent(provider));
+
+                    provider.start(ctx.plugins().pluginContextForProvider(provider));
+                }
 
-            // Start plugins.
-            for (PluginProvider provider : ctx.plugins().allProviders()) {
-                ctx.add(new GridPluginComponent(provider));
+                fillNodeAttributes(clusterProc.updateNotifierEnabled());
+            }catch (Throwable e) {
+                // Stop discovery spi to close tcp socket.
+                ctx.discovery().stop(true);
 
-                provider.start(ctx.plugins().pluginContextForProvider(provider));
+                throw e;
             }
 
-            fillNodeAttributes(clusterProc.updateNotifierEnabled());
-
             gw.writeLock();
 
             try {

http://git-wip-us.apache.org/repos/asf/ignite/blob/0e78dd1d/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
index 4a0b1da..be38541 100644
--- a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
@@ -29,6 +29,7 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import javax.cache.integration.CacheWriterException;
 
+import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.cache.store.jdbc.dialect.H2Dialect;
 import org.apache.ignite.cache.store.jdbc.model.Organization;
 import org.apache.ignite.cache.store.jdbc.model.OrganizationKey;
@@ -295,6 +296,12 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
 
         IgniteBiInClosure<Object, Object> c = new CI2<Object, Object>() {
             @Override public void apply(Object k, Object v) {
+                if (k instanceof BinaryObject)
+                    k = ((BinaryObject)k).deserialize();
+
+                if (v instanceof BinaryObject)
+                    v = ((BinaryObject)k).deserialize();
+
                 if (k instanceof OrganizationKey && v instanceof Organization)
                     orgKeys.add((OrganizationKey)k);
                 else if (k instanceof PersonKey && v instanceof Person)
@@ -381,6 +388,12 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
 
         IgniteBiInClosure<Object, Object> c = new CI2<Object, Object>() {
             @Override public void apply(Object k, Object v) {
+                if (k instanceof BinaryObject)
+                    k = ((BinaryObject)k).deserialize();
+
+                if (v instanceof BinaryObject)
+                    v = ((BinaryObject)k).deserialize();
+
                 if (k instanceof PersonComplexKey && v instanceof Person)
                     prnComplexKeys.add((PersonComplexKey)k);
                 else

http://git-wip-us.apache.org/repos/asf/ignite/blob/0e78dd1d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
index 6654fd9..34006bb 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePartitionedBackupNodeFailureRecoveryTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.processors.cache.IgniteCacheAbstractTest;
+import org.apache.ignite.internal.util.typedef.PA;
 
 import static org.apache.ignite.cache.CacheAtomicWriteOrderMode.PRIMARY;
 import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
@@ -40,6 +41,7 @@ import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheRebalanceMode.SYNC;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC;
 import static org.apache.ignite.testframework.GridTestUtils.runAsync;
+import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 
 /**
  */
@@ -148,11 +150,19 @@ public class IgniteCachePartitionedBackupNodeFailureRecoveryTest extends IgniteC
 
                         IgniteEx backUp = startGrid(2);
 
-                        IgniteCache<Integer, Integer> cache3 = backUp.cache(null);
+                        final IgniteCache<Integer, Integer> cache3 = backUp.cache(null);
 
                         lock.lock();
 
                         try {
+                            boolean res = waitForCondition(new PA() {
+                                @Override public boolean apply() {
+                                    return cache3.localPeek(finalKey) != null;
+                                }
+                            }, 1000);
+
+                            assertTrue(res);
+
                             Integer backUpVal = cache3.localPeek(finalKey);
 
                             Integer exp = cntr.get();

http://git-wip-us.apache.org/repos/asf/ignite/blob/0e78dd1d/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcProcessorValidationSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcProcessorValidationSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcProcessorValidationSelfTest.java
index aaee2a9..2cf0c8f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcProcessorValidationSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/OdbcProcessorValidationSelfTest.java
@@ -21,6 +21,8 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.OdbcConfiguration;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
@@ -36,7 +38,7 @@ public class OdbcProcessorValidationSelfTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
-        Ignition.stopAll(true);
+        stopAllGrids();
     }
 
     /**
@@ -159,6 +161,11 @@ public class OdbcProcessorValidationSelfTest extends GridCommonAbstractTest {
         cfg.setLocalHost("127.0.0.1");
         cfg.setOdbcConfiguration(odbcCfg);
 
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(new TcpDiscoveryVmIpFinder(true));
+
+        cfg.setDiscoverySpi(spi);
+
         if (success)
             Ignition.start(cfg);
         else {