Repository: ignite Updated Branches: refs/heads/ignite-10043 9a6d642f8 -> bc1ac15c3
IGNITE-8735 Metastorage creates its own index partition - Fixes #5383. Signed-off-by: Ivan Rakov <ira...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a74d9c4f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a74d9c4f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a74d9c4f Branch: refs/heads/ignite-10043 Commit: a74d9c4f66f407bfde56173a727b2545cc3bfb99 Parents: 3c54f38 Author: Alexey Stelmak <spiderru5...@gmail.com> Authored: Thu Nov 15 15:28:22 2018 +0300 Committer: Ivan Rakov <ira...@apache.org> Committed: Thu Nov 15 15:28:22 2018 +0300 ---------------------------------------------------------------------- .../internal/pagemem/PageIdAllocator.java | 3 + .../persistence/metastorage/MetaStorage.java | 7 ++ .../metastorage/MetastorageTree.java | 9 +++ .../metastorage/IgniteMetaStorageBasicTest.java | 78 ++++++++++++++++++++ 4 files changed, 97 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a74d9c4f/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageIdAllocator.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageIdAllocator.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageIdAllocator.java index c6aeabe..b3e4b07 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageIdAllocator.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageIdAllocator.java @@ -35,6 +35,9 @@ public interface PageIdAllocator { /** Special partition reserved for index space. */ public static final int INDEX_PARTITION = 0xFFFF; + /** Special partition reserved for metastore space. */ + public static final int METASTORE_PARTITION = 0x0; + /** * Allocates a page from the space for the given partition ID and the given flags. * http://git-wip-us.apache.org/repos/asf/ignite/blob/a74d9c4f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java index 4a243aa..91fbec0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java @@ -28,6 +28,7 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.pagemem.FullPageId; +import org.apache.ignite.internal.pagemem.PageIdAllocator; import org.apache.ignite.internal.pagemem.PageIdUtils; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager; @@ -62,6 +63,7 @@ import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.marshaller.jdk.JdkMarshaller; import org.jetbrains.annotations.NotNull; +import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA; import static org.apache.ignite.internal.pagemem.PageIdUtils.itemId; import static org.apache.ignite.internal.pagemem.PageIdUtils.pageId; @@ -507,6 +509,11 @@ public class MetaStorage implements DbCheckpointListener, ReadOnlyMetastorage, R return SimpleDataPageIO.VERSIONS; } + /** {@inheritDoc} */ + @Override protected long allocatePageNoReuse() throws IgniteCheckedException { + return pageMem.allocatePage(grpId, PageIdAllocator.METASTORE_PARTITION, FLAG_DATA); + } + /** * Read row from data pages. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/a74d9c4f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java index 00db5cd..27de684 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache.persistence.metastorage; import java.util.concurrent.atomic.AtomicLong; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.pagemem.PageIdAllocator; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.pagemem.PageUtils; import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager; @@ -31,6 +32,9 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseL import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA; +import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX; + /** * */ @@ -94,6 +98,11 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage return rowStore; } + /** {@inheritDoc} */ + @Override protected long allocatePageNoReuse() throws IgniteCheckedException { + return pageMem.allocatePage(grpId, PageIdAllocator.METASTORE_PARTITION, FLAG_DATA); + } + /** * */ http://git-wip-us.apache.org/repos/asf/ignite/blob/a74d9c4f/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/IgniteMetaStorageBasicTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/IgniteMetaStorageBasicTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/IgniteMetaStorageBasicTest.java index e5a53fa..b6dfc12 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/IgniteMetaStorageBasicTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/IgniteMetaStorageBasicTest.java @@ -17,6 +17,9 @@ package org.apache.ignite.internal.processors.cache.persistence.metastorage; import java.io.Serializable; +import java.util.HashSet; +import java.util.List; +import java.util.Random; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.configuration.DataRegionConfiguration; @@ -79,6 +82,81 @@ public class IgniteMetaStorageBasicTest extends GridCommonAbstractTest { } /** + * + */ + public void testMetaStorageMassivePutFixed() throws Exception { + IgniteEx ig = startGrid(0); + + ig.cluster().active(true); + + IgniteCacheDatabaseSharedManager db = ig.context().cache().context().database(); + + MetaStorage metaStorage = db.metaStorage(); + + assertNotNull(metaStorage); + + Random rnd = new Random(); + + db.checkpointReadLock(); + + int size; + try { + for (int i = 0; i < 10_000; i++) { + size = rnd.nextBoolean() ? 3500 : 2 * 3500; + String key = "TEST_KEY_" + (i % 1000); + + byte[] arr = new byte[size]; + rnd.nextBytes(arr); + + metaStorage.remove(key); + + metaStorage.putData(key, arr/*b.toString().getBytes()*/); + } + } + finally { + db.checkpointReadUnlock(); + } + } + + /** + * + */ + public void testMetaStorageMassivePutRandom() throws Exception { + IgniteEx ig = startGrid(0); + + ig.cluster().active(true); + + IgniteCacheDatabaseSharedManager db = ig.context().cache().context().database(); + + MetaStorage metaStorage = db.metaStorage(); + + assertNotNull(metaStorage); + + Random rnd = new Random(); + + db.checkpointReadLock(); + + int size; + try { + for (int i = 0; i < 50_000; i++) { + size = 100 + rnd.nextInt(9000); + + String key = "TEST_KEY_" + (i % 2_000); + + byte[] arr = new byte[size]; + rnd.nextBytes(arr); + + metaStorage.remove(key); + + metaStorage.putData(key, arr/*b.toString().getBytes()*/); + } + } + finally { + db.checkpointReadUnlock(); + } + } + + /** * Verifies that MetaStorage after massive amounts of keys stored and updated keys restores its state successfully * after restart. *