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); + } + } }
