Repository: ignite
Updated Branches:
  refs/heads/ignite-5075-pds a814dc4f1 -> 44d5e92bb


ignite-5075


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

Branch: refs/heads/ignite-5075-pds
Commit: 44d5e92bb82875336017a53b5bde59f274206db7
Parents: a814dc4
Author: sboikov <[email protected]>
Authored: Mon May 29 11:34:08 2017 +0300
Committer: sboikov <[email protected]>
Committed: Mon May 29 11:34:08 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheOffheapManager.java        |   6 +-
 .../cache/IgniteCacheOffheapManagerImpl.java    |   4 +-
 .../cache/database/MetadataStorage.java         |   2 +-
 .../query/h2/database/H2TreeIndex.java          |  19 +-
 .../cache/database/GridCacheOffheapManager.java |  14 +-
 .../IgnitePersistentStoreCacheGroupsTest.java   | 176 ++++++++++++++++++-
 6 files changed, 205 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
index 65ba4b2..793ca97 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
@@ -316,17 +316,19 @@ public interface IgniteCacheOffheapManager {
     public GridAtomicLong globalRemoveId();
 
     /**
+     * @param cacheId Cache ID.
      * @param idxName Index name.
      * @return Root page for index tree.
      * @throws IgniteCheckedException If failed.
      */
-    public RootPage rootPageForIndex(String idxName) throws 
IgniteCheckedException;
+    public RootPage rootPageForIndex(int cacheId, String idxName) throws 
IgniteCheckedException;
 
     /**
+     * @param cacheId Cache ID.
      * @param idxName Index name.
      * @throws IgniteCheckedException If failed.
      */
-    public void dropRootPageForIndex(String idxName) throws 
IgniteCheckedException;
+    public void dropRootPageForIndex(int cacheId, String idxName) throws 
IgniteCheckedException;
 
     /**
      * @param idxName Index name.

http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 50e01e5..9cb8159 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -711,14 +711,14 @@ public class IgniteCacheOffheapManagerImpl implements 
IgniteCacheOffheapManager
     }
 
     /** {@inheritDoc} */
-    @Override public RootPage rootPageForIndex(String idxName) throws 
IgniteCheckedException {
+    @Override public RootPage rootPageForIndex(int cacheId, String idxName) 
throws IgniteCheckedException {
         long pageId = allocateForTree();
 
         return new RootPage(new FullPageId(pageId, grp.groupId()), true);
     }
 
     /** {@inheritDoc} */
-    @Override public void dropRootPageForIndex(String idxName) throws 
IgniteCheckedException {
+    @Override public void dropRootPageForIndex(int cacheId, String idxName) 
throws IgniteCheckedException {
         // No-op.
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
index 20123f4..139bf73 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
@@ -288,7 +288,7 @@ public class MetadataStorage implements MetaStore {
         PageUtils.putByte(dstPageAddr, dstOff, len);
         dstOff++;
 
-        PageHandler.copyMemory(srcPageAddr, srcOff, dstPageAddr, dstOff, len);
+        PageHandler.copyMemory(srcPageAddr, dstPageAddr, srcOff, dstOff, len);
         srcOff += len;
         dstOff += len;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
index 0cfb6a0..b84daf1 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
@@ -24,7 +24,6 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import 
org.apache.ignite.internal.processors.cache.database.IgniteCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cache.database.RootPage;
 import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
@@ -325,10 +324,12 @@ public class H2TreeIndex extends GridH2IndexBase {
     @Override public void destroy() {
         try {
             if (cctx.affinityNode()) {
-                for (H2Tree tree : segments) {
+                for (int i = 0; i < segments.length; i++) {
+                    H2Tree tree = segments[i];
+
                     tree.destroy();
 
-                    cctx.offheap().dropRootPageForIndex(tree.getName());
+                    dropMetaPage(tree.getName(), i);
                 }
             }
         }
@@ -412,10 +413,20 @@ public class H2TreeIndex extends GridH2IndexBase {
 
     /**
      * @param name Name.
+     * @param segIdx Segment index.
      * @return RootPage for meta page.
      * @throws IgniteCheckedException If failed.
      */
     private RootPage getMetaPage(String name, int segIdx) throws 
IgniteCheckedException {
-        return cctx.offheap().rootPageForIndex(name + "%" + segIdx);
+        return cctx.offheap().rootPageForIndex(cctx.cacheId(), name + "%" + 
segIdx);
+    }
+
+    /**
+     * @param name Name.
+     * @param segIdx Segment index.
+     * @throws IgniteCheckedException If failed.
+     */
+    private void dropMetaPage(String name, int segIdx) throws 
IgniteCheckedException {
+        cctx.offheap().dropRootPageForIndex(cctx.cacheId(), name + "%" + 
segIdx);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheOffheapManager.java
----------------------------------------------------------------------
diff --git 
a/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheOffheapManager.java
 
b/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheOffheapManager.java
index be3c5e1..f14a534 100644
--- 
a/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheOffheapManager.java
+++ 
b/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheOffheapManager.java
@@ -369,14 +369,18 @@ public class GridCacheOffheapManager extends 
IgniteCacheOffheapManagerImpl imple
     }
 
     /** {@inheritDoc} */
-    @Override public RootPage rootPageForIndex(String idxName) throws 
IgniteCheckedException {
-        // TODO IGNITE-5075: per cache?
+    @Override public RootPage rootPageForIndex(int cacheId, String idxName) 
throws IgniteCheckedException {
+        if (grp.sharedGroup())
+            idxName = Integer.toString(cacheId) + "_" + idxName;
+
         return metaStore.getOrAllocateForTree(idxName);
     }
 
     /** {@inheritDoc} */
-    @Override public void dropRootPageForIndex(String idxName) throws 
IgniteCheckedException {
-        // TODO IGNITE-5075: per cache?
+    @Override public void dropRootPageForIndex(int cacheId, String idxName) 
throws IgniteCheckedException {
+        if (grp.sharedGroup())
+            idxName = Integer.toString(cacheId) + "_" + idxName;
+
         metaStore.dropRootPage(idxName);
     }
 
@@ -994,7 +998,7 @@ public class GridCacheOffheapManager extends 
IgniteCacheOffheapManagerImpl imple
         /** {@inheritDoc} */
         @Override public void updateCounter(long val) {
             try {
-                CacheDataStore delegate0 = init0(false);
+                CacheDataStore delegate0 = init0(true);
 
                 if (delegate0 != null)
                     delegate0.updateCounter(val);

http://git-wip-us.apache.org/repos/asf/ignite/blob/44d5e92b/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheGroupsTest.java
----------------------------------------------------------------------
diff --git 
a/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheGroupsTest.java
 
b/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheGroupsTest.java
index e2bec8d..d2a5177 100644
--- 
a/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheGroupsTest.java
+++ 
b/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheGroupsTest.java
@@ -17,16 +17,26 @@
 
 package org.apache.ignite.cache.database;
 
+import java.io.Serializable;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import javax.cache.Cache;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.BinaryConfiguration;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.configuration.PersistentStoreConfiguration;
 import 
org.apache.ignite.internal.processors.cache.database.wal.FileWriteAheadLogManager;
+import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
@@ -82,6 +92,8 @@ public class IgnitePersistentStoreCacheGroupsTest extends 
GridCommonAbstractTest
 
         cfg.setPersistentStoreConfiguration(new 
PersistentStoreConfiguration());
 
+        cfg.setBinaryConfiguration(new 
BinaryConfiguration().setCompactFooter(false));
+
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
 
         if (ccfgs != null) {
@@ -131,6 +143,124 @@ public class IgnitePersistentStoreCacheGroupsTest extends 
GridCommonAbstractTest
     }
 
     /**
+     * @throws Exception If failed.
+     */
+    public void testClusterRestartCachesWithH2Indexes() throws Exception {
+        CacheConfiguration[] ccfgs1 = new CacheConfiguration[5];
+
+        // Several caches with the same indexed type (and index names).
+        ccfgs1[0] = cacheConfiguration(GROUP1, "c1", PARTITIONED, ATOMIC, 1).
+            setIndexedTypes(Integer.class, Person.class);
+        ccfgs1[1] = cacheConfiguration(GROUP1, "c2", PARTITIONED, 
TRANSACTIONAL, 1).
+            setIndexedTypes(Integer.class, Person.class);
+        ccfgs1[2] = cacheConfiguration(GROUP2, "c3", PARTITIONED, ATOMIC, 1).
+            setIndexedTypes(Integer.class, Person.class);
+        ccfgs1[3] = cacheConfiguration(GROUP2, "c4", PARTITIONED, 
TRANSACTIONAL, 1).
+            setIndexedTypes(Integer.class, Person.class);
+        ccfgs1[4] = cacheConfiguration(null, "c5", PARTITIONED, ATOMIC, 1).
+            setIndexedTypes(Integer.class, Person.class);
+
+        String[] caches = {"c1", "c2", "c3", "c4", "c5"};
+
+        startGrids(3);
+
+        Ignite node = ignite(0);
+
+        node.createCaches(Arrays.asList(ccfgs1));
+
+        for (String cacheName : caches) {
+            IgniteCache<Object, Object> cache = node.cache(cacheName);
+
+            for (int i = 0; i < 10; i++)  {
+                cache.put(i, new Person("" + i, cacheName));
+
+                assertEquals(new Person("" + i, cacheName), cache.get(i));
+            }
+
+            assertEquals(10, cache.size());
+        }
+
+        stopAllGrids();
+
+        startGrids(3);
+
+        node = ignite(0);
+
+        checkPersons(caches, node);
+        checkPersonsQuery(caches, node);
+
+        Random rnd = ThreadLocalRandom.current();
+
+        int idx = rnd.nextInt(caches.length);
+
+        String cacheName = caches[idx];
+
+        node.destroyCache(cacheName);
+
+        IgniteCache<Object, Object> cache = node.createCache(ccfgs1[idx]);
+
+        for (int i = 0; i < 10; i++)  {
+            cache.put(i, new Person("" + i, cacheName));
+
+            assertEquals(new Person("" + i, cacheName), cache.get(i));
+        }
+
+        assertEquals(10, cache.size());
+
+        checkPersons(caches, node);
+        checkPersonsQuery(caches, node);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCreateDropCache() throws Exception {
+        ccfgs = new CacheConfiguration[]{cacheConfiguration(GROUP1, "c1", 
PARTITIONED, ATOMIC, 1)
+            .setIndexedTypes(Integer.class, Person.class)};
+
+        Ignite ignite = startGrid();
+
+        ignite.cache("c1").destroy();
+
+        stopGrid();
+    }
+
+    /**
+     * @param caches Cache names to invoke a query against to.
+     * @param node Ignite node.
+     */
+    private void checkPersons(String[] caches, Ignite node) {
+        for (String cacheName : caches) {
+            IgniteCache<Object, Object> cache = node.cache(cacheName);
+
+            for (int i = 0; i < 10; i++)
+                assertEquals(new Person("" + i, cacheName), cache.get(i));
+
+            assertEquals(10, cache.size());
+        }
+    }
+
+    /**
+     * @param caches Cache names to invoke a query against to.
+     * @param node Ignite node.
+     */
+    private void checkPersonsQuery(String[] caches, Ignite node) {
+        SqlQuery<Integer, Person> qry = new SqlQuery<>(
+            Person.class, "SELECT p.* FROM Person p WHERE p.lname=? ORDER BY 
p.fname");
+
+        for (String cacheName : caches) {
+            IgniteCache<Object, Object> cache = node.cache(cacheName);
+
+            List<Cache.Entry<Integer, Person>> persons = 
cache.query(qry.setArgs(cacheName)).getAll();
+
+            for (int i = 0; i < 10; i++)
+                assertEquals(new Person("" + i, cacheName), 
persons.get(i).getValue());
+
+            assertEquals(10, persons.size());
+        }
+    }
+
+    /**
      * @param nodes Nodes number.
      * @param staticCaches {@code True} if caches should be statically 
configured.
      * @throws Exception If failed.
@@ -180,8 +310,7 @@ public class IgnitePersistentStoreCacheGroupsTest extends 
GridCommonAbstractTest
             for (int i = 0; i < 10; i++)
                 assertEquals(cacheName + i, cache.get(i));
 
-            // TODO IGNITE-5075.
-            // assertEquals(10, cache.size());
+            assertEquals(10, cache.size());
         }
     }
 
@@ -211,4 +340,47 @@ public class IgnitePersistentStoreCacheGroupsTest extends 
GridCommonAbstractTest
 
         return ccfg;
     }
+
+    /**
+     *
+     */
+    static class Person implements Serializable {
+        /** */
+        @QuerySqlField(index = true, groups = "full_name")
+        String fName;
+
+        /** */
+        @QuerySqlField(index = true, groups = "full_name")
+        String lName;
+
+        /**
+         * @param fName First name.
+         * @param lName Last name.
+         */
+        public Person(String fName, String lName) {
+            this.fName = fName;
+            this.lName = lName;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(Person.class, this);
+        }
+
+        /** {@inheritDoc} */
+        @Override public boolean equals(Object o) {
+            if (this == o)
+                return true;
+            if (o == null || getClass() != o.getClass())
+                return false;
+            Person person = (Person)o;
+            return Objects.equals(fName, person.fName) &&
+                Objects.equals(lName, person.lName);
+        }
+
+        /** {@inheritDoc} */
+        @Override public int hashCode() {
+            return Objects.hash(fName, lName);
+        }
+    }
 }

Reply via email to