You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2017/02/17 08:55:55 UTC

ignite git commit: IGNITE-4670: CPP: Added Cache.LoadCache() and Cache.LocalLoadCache() operations. This closes #1547.

Repository: ignite
Updated Branches:
  refs/heads/ignite-1.9 45577a91c -> aca315d88


IGNITE-4670: CPP: Added Cache.LoadCache() and Cache.LocalLoadCache() operations. This closes #1547.


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

Branch: refs/heads/ignite-1.9
Commit: aca315d888b227a36983f44d2874fde66fd11ab9
Parents: 45577a9
Author: isapego <ig...@gmail.com>
Authored: Fri Feb 17 11:55:10 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Fri Feb 17 11:55:10 2017 +0300

----------------------------------------------------------------------
 modules/platforms/cpp/core-test/Makefile.am     |   1 +
 .../cpp/core-test/config/cache-store.xml        |  71 +++++++++
 .../cpp/core-test/project/vs/core-test.vcxproj  |   5 +
 .../project/vs/core-test.vcxproj.filters        |   9 ++
 .../src/binary_identity_resolver_test.cpp       |   2 +-
 .../src/binary_reader_writer_raw_test.cpp       |   2 +-
 .../core-test/src/binary_reader_writer_test.cpp |   2 +-
 .../cpp/core-test/src/binary_session_test.cpp   |   2 +-
 .../cpp/core-test/src/cache_query_test.cpp      |   2 +-
 .../cpp/core-test/src/cache_store_test.cpp      | 151 +++++++++++++++++++
 .../cpp/core-test/src/continuous_query_test.cpp |   2 +-
 .../cpp/core-test/src/handle_registry_test.cpp  |   2 +-
 .../cpp/core-test/src/ignite_error_test.cpp     |   2 +-
 .../cpp/core-test/src/ignition_test.cpp         |   2 +-
 .../cpp/core-test/src/interop_memory_test.cpp   |   2 +-
 .../cpp/core-test/src/reference_test.cpp        |   2 +-
 .../platforms/cpp/core-test/src/test_utils.cpp  |   7 +
 .../cpp/core-test/src/transactions_test.cpp     |   2 +-
 .../cpp/core/include/ignite/cache/cache.h       |  54 +++++--
 .../cache/query/continuous/continuous_query.h   |   2 +-
 .../core/include/ignite/impl/cache/cache_impl.h |  19 +++
 .../ignite/impl/interop/interop_target.h        |  25 +++
 .../cpp/core/src/impl/cache/cache_impl.cpp      |  48 ++++++
 .../core/src/impl/interop/interop_target.cpp    |  36 +++--
 24 files changed, 412 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/Makefile.am b/modules/platforms/cpp/core-test/Makefile.am
index 566a827..a03d2df 100644
--- a/modules/platforms/cpp/core-test/Makefile.am
+++ b/modules/platforms/cpp/core-test/Makefile.am
@@ -57,6 +57,7 @@ ignite_tests_SOURCES = \
 	src/binary_identity_resolver_test.cpp \
     src/cache_test.cpp \
     src/cache_query_test.cpp \
+    src/cache_store_test.cpp \
     src/continuous_query_test.cpp \
     src/concurrent_test.cpp \
     src/ignition_test.cpp \

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/config/cache-store.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/config/cache-store.xml b/modules/platforms/cpp/core-test/config/cache-store.xml
new file mode 100644
index 0000000..94c7ddd
--- /dev/null
+++ b/modules/platforms/cpp/core-test/config/cache-store.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<!--
+    Ignite Spring configuration file to startup grid cache.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/util
+        http://www.springframework.org/schema/util/spring-util.xsd">
+    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+        <property name="localHost" value="127.0.0.1"/>
+        <property name="connectorConfiguration"><null/></property>
+
+        <property name="cacheConfiguration">
+            <list>
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache1"/>
+                    <property name="cacheMode" value="PARTITIONED"/>
+                    <property name="atomicityMode" value="TRANSACTIONAL"/>
+                    <property name="writeSynchronizationMode" value="FULL_SYNC"/>
+
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.internal.processors.cache.MapCacheStoreStrategy.MapStoreFactory"/>
+                    </property>
+
+                    <property name="writeBehindEnabled" value="false"/>
+
+                    <property name="readThrough" value="false"/>
+                    <property name="writeThrough" value="true"/>
+                </bean>
+            </list>
+        </property>
+
+        <property name="discoverySpi">
+            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                <property name="ipFinder">
+                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
+                        <property name="addresses">
+                            <list>
+                                <!-- In distributed environment, replace with actual host IP address. -->
+                                <value>127.0.0.1:47500</value>
+                            </list>
+                        </property>
+                    </bean>
+                </property>
+                <property name="socketTimeout" value="300" />
+            </bean>
+        </property>
+    </bean>
+</beans>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
index d39746e..1b77c40 100644
--- a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
+++ b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
@@ -34,13 +34,18 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\config\cache-identity.xml" />
+    <None Include="..\..\config\cache-query-continuous.xml" />
     <None Include="..\..\config\cache-query.xml" />
+    <None Include="..\..\config\cache-store.xml">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="..\..\config\cache-test.xml" />
     <None Include="..\..\config\invalid.xml" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\binary_object_test.cpp" />
     <ClCompile Include="..\..\src\binary_identity_resolver_test.cpp" />
+    <ClCompile Include="..\..\src\cache_store_test.cpp" />
     <ClCompile Include="..\..\src\cache_test.cpp" />
     <ClCompile Include="..\..\src\concurrent_test.cpp" />
     <ClCompile Include="..\..\src\decimal_test.cpp" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
index 22048b1..d70b5c2 100644
--- a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
+++ b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
@@ -73,6 +73,9 @@
     <ClCompile Include="..\..\src\test_utils.cpp">
       <Filter>Code</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\cache_store_test.cpp">
+      <Filter>Code</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\teamcity_messages.h">
@@ -124,5 +127,11 @@
     <None Include="..\..\config\cache-identity.xml">
       <Filter>Configs</Filter>
     </None>
+    <None Include="..\..\config\cache-query-continuous.xml">
+      <Filter>Configs</Filter>
+    </None>
+    <None Include="..\..\config\cache-store.xml">
+      <Filter>Configs</Filter>
+    </None>
   </ItemGroup>
 </Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp b/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
index 6cede4e..9a06c3c 100644
--- a/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_identity_resolver_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <sstream>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
index b6d9eab..bd3868a 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_raw_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
index fa36dac..dd5743a 100644
--- a/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_reader_writer_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/binary_session_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/binary_session_test.cpp b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
index d178921..0b9b34d 100644
--- a/modules/platforms/cpp/core-test/src/binary_session_test.cpp
+++ b/modules/platforms/cpp/core-test/src/binary_session_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/cache_query_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/cache_query_test.cpp b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
index b61e289..28eb3fd 100644
--- a/modules/platforms/cpp/core-test/src/cache_query_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cache_query_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <sstream>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/cache_store_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/cache_store_test.cpp b/modules/platforms/cpp/core-test/src/cache_store_test.cpp
new file mode 100644
index 0000000..f1b4630
--- /dev/null
+++ b/modules/platforms/cpp/core-test/src/cache_store_test.cpp
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _MSC_VER
+#   define BOOST_TEST_DYN_LINK
+#endif
+
+#include <boost/test/unit_test.hpp>
+
+#include "ignite/common/utils.h"
+
+#include "ignite/ignite.h"
+#include "ignite/ignition.h"
+#include "ignite/test_utils.h"
+
+using namespace ignite;
+using namespace boost::unit_test;
+
+/*
+ * Test setup fixture.
+ */
+struct CacheStoreTestSuiteFixture
+{
+    /* Nodes started during the test. */
+    Ignite node1;
+
+    /*
+     * Constructor.
+     */
+    CacheStoreTestSuiteFixture() : 
+        node1(ignite_test::StartNode("cache-store.xml", "node1"))
+    {
+        // No-op.
+    }
+
+    /*
+     * Destructor.
+     */
+    ~CacheStoreTestSuiteFixture()
+    {
+        GetCache().RemoveAll();
+
+        Ignition::StopAll(true);
+    }
+
+    /**
+     * Cache accessor.
+     */
+    cache::Cache<int64_t, std::string> GetCache()
+    {
+        return node1.GetOrCreateCache<int64_t, std::string>("cache1");
+    }
+};
+
+void FillStore(cache::Cache<int64_t, std::string>& cache, int64_t n)
+{
+    for (int64_t i = 0; i < n; ++i)
+        cache.Put(i, common::LexicalCast<std::string>(i));
+
+    cache.Clear();
+}
+
+BOOST_FIXTURE_TEST_SUITE(CacheStoreTestSuite, CacheStoreTestSuiteFixture)
+
+BOOST_AUTO_TEST_CASE(LoadCacheSingleNodeNoPredicate)
+{
+    const int64_t entriesNum = 100;
+
+    cache::Cache<int64_t, std::string> cache = GetCache();
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    FillStore(cache, entriesNum);
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    cache.LoadCache();
+
+    BOOST_CHECK(!cache.IsEmpty());
+
+    BOOST_CHECK_EQUAL(cache.Size(cache::IGNITE_PEEK_MODE_PRIMARY), entriesNum);
+
+    std::string val42 = cache.Get(42);
+
+    BOOST_CHECK_EQUAL(val42, "42");
+}
+
+BOOST_AUTO_TEST_CASE(LoadCacheSeveralNodesNoPredicate)
+{
+    BOOST_CHECKPOINT("Starting additional node");
+    Ignite node2 = ignite_test::StartNode("cache-store.xml", "node2");
+
+    const int64_t entriesNum = 100;
+
+    cache::Cache<int64_t, std::string> cache = GetCache();
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    FillStore(cache, entriesNum);
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    cache.LoadCache();
+
+    BOOST_CHECK(!cache.IsEmpty());
+
+    BOOST_CHECK_EQUAL(cache.Size(cache::IGNITE_PEEK_MODE_PRIMARY), entriesNum);
+
+    std::string val42 = cache.Get(42);
+
+    BOOST_CHECK_EQUAL(val42, "42");
+}
+
+BOOST_AUTO_TEST_CASE(LocalLoadCacheSingleNodeNoPredicate)
+{
+    const int64_t entriesNum = 100;
+
+    cache::Cache<int64_t, std::string> cache = GetCache();
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    FillStore(cache, entriesNum);
+
+    BOOST_CHECK(cache.IsEmpty());
+
+    cache.LocalLoadCache();
+
+    BOOST_CHECK(!cache.IsEmpty());
+
+    BOOST_CHECK_EQUAL(cache.Size(cache::IGNITE_PEEK_MODE_PRIMARY), entriesNum);
+
+    std::string val42 = cache.Get(42);
+
+    BOOST_CHECK_EQUAL(val42, "42");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/continuous_query_test.cpp b/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
index 6ce38de..1be21c1 100644
--- a/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
+++ b/modules/platforms/cpp/core-test/src/continuous_query_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <deque>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/handle_registry_test.cpp b/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
index 0956d9b..db75e0b 100644
--- a/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
+++ b/modules/platforms/cpp/core-test/src/handle_registry_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/ignite_error_test.cpp b/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
index 8e379e3..69ad8cf 100644
--- a/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
+++ b/modules/platforms/cpp/core-test/src/ignite_error_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/ignition_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/ignition_test.cpp b/modules/platforms/cpp/core-test/src/ignition_test.cpp
index 17f78ae..52a51d0 100644
--- a/modules/platforms/cpp/core-test/src/ignition_test.cpp
+++ b/modules/platforms/cpp/core-test/src/ignition_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/interop_memory_test.cpp b/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
index 1c782b5..9bd3ef1 100644
--- a/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
+++ b/modules/platforms/cpp/core-test/src/interop_memory_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/reference_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/reference_test.cpp b/modules/platforms/cpp/core-test/src/reference_test.cpp
index b240e2e..a5ac559 100644
--- a/modules/platforms/cpp/core-test/src/reference_test.cpp
+++ b/modules/platforms/cpp/core-test/src/reference_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <memory>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/test_utils.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/test_utils.cpp b/modules/platforms/cpp/core-test/src/test_utils.cpp
index 1378487..b706511 100644
--- a/modules/platforms/cpp/core-test/src/test_utils.cpp
+++ b/modules/platforms/cpp/core-test/src/test_utils.cpp
@@ -37,6 +37,13 @@ namespace ignite_test
         cfg.jvmOpts.push_back("-DIGNITE_CONSOLE_APPENDER=false");
         cfg.jvmOpts.push_back("-DIGNITE_UPDATE_NOTIFIER=false");
 
+        bool homeFound;
+        std::string home = jni::ResolveIgniteHome(0, &homeFound);
+
+        assert(homeFound);
+
+        cfg.jvmClassPath = jni::CreateIgniteClasspath(0, &home, true);
+
 #ifdef IGNITE_TESTS_32
         cfg.jvmInitMem = 256;
         cfg.jvmMaxMem = 768;

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core-test/src/transactions_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/transactions_test.cpp b/modules/platforms/cpp/core-test/src/transactions_test.cpp
index 98856d6..3bf1ac6 100644
--- a/modules/platforms/cpp/core-test/src/transactions_test.cpp
+++ b/modules/platforms/cpp/core-test/src/transactions_test.cpp
@@ -16,7 +16,7 @@
  */
 
 #ifndef _MSC_VER
-    #define BOOST_TEST_DYN_LINK
+#   define BOOST_TEST_DYN_LINK
 #endif
 
 #include <boost/test/unit_test.hpp>

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/include/ignite/cache/cache.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/cache/cache.h b/modules/platforms/cpp/core/include/ignite/cache/cache.h
index 54c0f96..f179830 100644
--- a/modules/platforms/cpp/core/include/ignite/cache/cache.h
+++ b/modules/platforms/cpp/core/include/ignite/cache/cache.h
@@ -30,17 +30,17 @@
 #include <ignite/common/concurrent.h>
 #include <ignite/ignite_error.h>
 
-#include "ignite/cache/cache_peek_mode.h"
-#include "ignite/cache/query/query_cursor.h"
-#include "ignite/cache/query/query_fields_cursor.h"
-#include "ignite/cache/query/query_scan.h"
-#include "ignite/cache/query/query_sql.h"
-#include "ignite/cache/query/query_text.h"
-#include "ignite/cache/query/query_sql_fields.h"
-#include "ignite/cache/query/continuous/continuous_query_handle.h"
-#include "ignite/cache/query/continuous/continuous_query.h"
-#include "ignite/impl/cache/cache_impl.h"
-#include "ignite/impl/operations.h"
+#include <ignite/cache/cache_peek_mode.h>
+#include <ignite/cache/query/query_cursor.h>
+#include <ignite/cache/query/query_fields_cursor.h>
+#include <ignite/cache/query/query_scan.h>
+#include <ignite/cache/query/query_sql.h>
+#include <ignite/cache/query/query_text.h>
+#include <ignite/cache/query/query_sql_fields.h>
+#include <ignite/cache/query/continuous/continuous_query_handle.h>
+#include <ignite/cache/query/continuous/continuous_query.h>
+#include <ignite/impl/cache/cache_impl.h>
+#include <ignite/impl/operations.h>
 
 namespace ignite
 {
@@ -57,6 +57,9 @@ namespace ignite
          * of this class instance will only create another reference to the same
          * underlying object. Underlying object released automatically once all
          * the instances are destructed.
+         *
+         * @tparam K Cache key type.
+         * @tparam V Cache value type.
          */
         template<typename K, typename V>
         class IGNITE_IMPORT_EXPORT Cache
@@ -1456,6 +1459,35 @@ namespace ignite
                 return impl.IsValid();
             }
 
+            /**
+             * Executes LocalLoadCache on all cache nodes.
+             */
+            void LoadCache()
+            {
+                IgniteError err;
+
+                impl.Get()->LoadCache(err);
+
+                IgniteError::ThrowIfNeeded(err);
+            }
+
+            /**
+             * Loads state from the underlying persistent storage.
+             *
+             * This method is not transactional and may end up loading a stale value into
+             * cache if another thread has updated the value immediately after it has been
+             * loaded. It is mostly useful when pre-loading the cache from underlying
+             * data store before start, or for read-only caches.
+             */
+            void LocalLoadCache()
+            {
+                IgniteError err;
+
+                impl.Get()->LocalLoadCache(err);
+
+                IgniteError::ThrowIfNeeded(err);
+            }
+
         private:
             /** Implementation delegate. */
             common::concurrent::SharedPointer<impl::cache::CacheImpl> impl;

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/include/ignite/cache/query/continuous/continuous_query.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/cache/query/continuous/continuous_query.h b/modules/platforms/cpp/core/include/ignite/cache/query/continuous/continuous_query.h
index 781ce2e..82bb125 100644
--- a/modules/platforms/cpp/core/include/ignite/cache/query/continuous/continuous_query.h
+++ b/modules/platforms/cpp/core/include/ignite/cache/query/continuous/continuous_query.h
@@ -198,7 +198,7 @@ namespace ignite
                     /**
                      * Set cache entry event listener.
                      *
-                     * @param val Cache entry event listener. Invoked on the
+                     * @param lsnr Cache entry event listener. Invoked on the
                      *     node where continuous query execution has been
                      *     started.
                      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h b/modules/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h
index 535e3ec..18c3410 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h
@@ -360,6 +360,25 @@ namespace ignite
                     const common::concurrent::SharedPointer<query::continuous::ContinuousQueryImplBase> qry,
                     const ignite::cache::query::ScanQuery& initialQry, IgniteError& err);
 
+                /**
+                 * Executes LocalLoadCache on all cache nodes.
+                 *
+                 * @param err Error.
+                 */
+                void LoadCache(IgniteError& err);
+
+                /**
+                 * Loads state from the underlying persistent storage.
+                 *
+                 * This method is not transactional and may end up loading a stale value into
+                 * cache if another thread has updated the value immediately after it has been
+                 * loaded. It is mostly useful when pre-loading the cache from underlying
+                 * data store before start, or for read-only caches.
+                 *
+                 * @param err Error.
+                 */
+                void LocalLoadCache(IgniteError& err);
+
             private:
                 IGNITE_NO_COPY_ASSIGNMENT(CacheImpl)
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h b/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
index 432d2ac..f959f95 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
@@ -34,6 +34,21 @@ namespace ignite
             {
             public:
                 /**
+                 * Operation result.
+                 */
+                enum OperationResult
+                {
+                    /** Null. */
+                    ResultNull = 0,
+
+                    /** Success. */
+                    ResultSuccess = 1,
+
+                    /** Error. */
+                    ResultError = -1
+                };
+
+                /**
                  * Constructor used to create new instance.
                  *
                  * @param env Environment.
@@ -98,6 +113,16 @@ namespace ignite
                 void OutInOpX(int32_t opType, InputOperation& inOp, OutputOperation& outOp, IgniteError* err);
 
                 /**
+                 * In stream out long operation.
+                 *
+                 * @param opType Type of operation.
+                 * @param outInMem Input and output memory.
+                 * @param err Error.
+                 * @return Operation result.
+                 */
+                OperationResult InStreamOutLong(int32_t opType, InteropMemory& outInMem, IgniteError* err);
+
+                /**
                 * Internal out-in operation.
                 *
                 * @param opType Operation type.

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/src/impl/cache/cache_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/cache/cache_impl.cpp b/modules/platforms/cpp/core/src/impl/cache/cache_impl.cpp
index 5d09e46..f439f76 100644
--- a/modules/platforms/cpp/core/src/impl/cache/cache_impl.cpp
+++ b/modules/platforms/cpp/core/src/impl/cache/cache_impl.cpp
@@ -70,9 +70,15 @@ namespace ignite
             /** Operation: GetAndReplace. */
             const int32_t OP_GET_AND_REPLACE = 10;
 
+            /** Operation: LoadCache */
+            const int32_t OP_LOAD_CACHE = 15;
+
             /** Operation: LocalEvict. */
             const int32_t OP_LOCAL_EVICT = 16;
 
+            /** Operation: LocalLoadCache */
+            const int32_t OP_LOC_LOAD_CACHE = 17;
+
             /** Operation: LocalClear. */
             const int32_t OP_LOCAL_CLEAR = 20;
 
@@ -325,6 +331,48 @@ namespace ignite
                 return QueryContinuous(qry, initialQry, OP_QRY_SCAN, OP_QRY_CONTINUOUS, err);
             }
 
+            void CacheImpl::LoadCache(IgniteError& err)
+            {
+                JniErrorInfo jniErr;
+
+                SharedPointer<InteropMemory> mem = GetEnvironment().AllocateMemory();
+                InteropOutputStream out(mem.Get());
+                BinaryWriterImpl writer(&out, GetEnvironment().GetTypeManager());
+
+                // Predicate. Always null for now.
+                writer.WriteNull();
+
+                // Arguments. No arguments supported for now.
+                writer.WriteInt32(0);
+
+                out.Synchronize();
+
+                InStreamOutLong(OP_LOAD_CACHE, *mem.Get(), &err);
+
+                IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, &err);
+            }
+
+            void CacheImpl::LocalLoadCache(IgniteError & err)
+            {
+                JniErrorInfo jniErr;
+
+                SharedPointer<InteropMemory> mem = GetEnvironment().AllocateMemory();
+                InteropOutputStream out(mem.Get());
+                BinaryWriterImpl writer(&out, GetEnvironment().GetTypeManager());
+
+                // Predicate. Always null for now.
+                writer.WriteNull();
+
+                // Arguments. No arguments supported for now.
+                writer.WriteInt32(0);
+
+                out.Synchronize();
+
+                InStreamOutLong(OP_LOC_LOAD_CACHE, *mem.Get(), &err);
+
+                IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, &err);
+            }
+
             struct DummyQry { void Write(BinaryRawWriter&) const { }};
 
             ContinuousQueryHandleImpl* CacheImpl::QueryContinuous(const SharedPointer<ContinuousQueryImplBase> qry,

http://git-wip-us.apache.org/repos/asf/ignite/blob/aca315d8/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp b/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
index 4992ccb..32be8bc 100644
--- a/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
+++ b/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
@@ -31,21 +31,6 @@ namespace ignite
     {
         namespace interop
         {
-            /**
-             * Operation result.
-             */
-            enum OperationResult
-            {
-                /** Null. */
-                ResultNull = 0,
-
-                /** Object. */
-                ResultObject = 1,
-
-                /** Error. */
-                ResultError = -1
-            };
-
             InteropTarget::InteropTarget(SharedPointer<IgniteEnvironment> env, jobject javaRef) :
                 env(env), javaRef(javaRef)
             {
@@ -178,7 +163,7 @@ namespace ignite
 
                     IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
 
-                    if (jniErr.code == IGNITE_JNI_ERR_SUCCESS && res == ResultObject)
+                    if (jniErr.code == IGNITE_JNI_ERR_SUCCESS && res == ResultSuccess)
                         ReadFrom(outInMem.Get(), outOp);
                     else if (res == ResultNull)
                         outOp.SetNull();
@@ -187,6 +172,25 @@ namespace ignite
                 }
             }
 
+            InteropTarget::OperationResult InteropTarget::InStreamOutLong(int32_t opType,
+                InteropMemory& outInMem, IgniteError* err)
+            {
+                JniErrorInfo jniErr;
+
+                int64_t outInPtr = outInMem.PointerLong();
+
+                if (outInPtr)
+                {
+                    int64_t res = env.Get()->Context()->TargetInStreamOutLong(javaRef, opType, outInPtr, &jniErr);
+
+                    IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
+
+                    return static_cast<OperationResult>(res);
+                }
+
+                return ResultError;
+            }
+
             int64_t InteropTarget::OutInOpLong(int32_t opType, int64_t val, IgniteError* err)
             {
                 JniErrorInfo jniErr;