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.
      *

Reply via email to