Repository: ignite
Updated Branches:
  refs/heads/master 856b536db -> 44cabd841


ignite-3560 Offheap resources cleanup on H2 table destroy.


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

Branch: refs/heads/master
Commit: 44cabd84152b5d956666b6c906eb43763ab7d72f
Parents: 856b536
Author: sboikov <sboi...@gridgain.com>
Authored: Tue Jul 26 10:41:50 2016 +0300
Committer: sboikov <sboi...@gridgain.com>
Committed: Tue Jul 26 10:41:50 2016 +0300

----------------------------------------------------------------------
 .../processors/query/h2/IgniteH2Indexing.java   |  31 ++--
 .../cache/CacheIndexingOffheapCleanupTest.java  | 178 +++++++++++++++++++
 .../IgniteCacheWithIndexingTestSuite.java       |   2 +
 3 files changed, 196 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/44cabd84/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 535881e..e1b21e2 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -735,8 +735,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             U.close(stmt, log);
         }
 
-        if (tbl.luceneIdx != null)
-            U.closeQuiet(tbl.luceneIdx);
+        tbl.onDrop();
 
         tbl.schema.tbls.remove(tbl.name());
     }
@@ -1816,12 +1815,8 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
 
 //        unregisterMBean(); TODO 
https://issues.apache.org/jira/browse/IGNITE-2139
 
-        for (Schema schema : schemas.values()) {
-            for (TableDescriptor desc : schema.tbls.values()) {
-                if (desc.luceneIdx != null)
-                    U.closeQuiet(desc.luceneIdx);
-            }
-        }
+        for (Schema schema : schemas.values())
+            schema.onDrop();
 
         for (Connection c : conns)
             U.close(c, log);
@@ -2436,6 +2431,17 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
         }
 
         /**
+         *
+         */
+        void onDrop() {
+            dataTables.remove(tbl.identifier(), tbl);
+
+            tbl.destroy();
+
+            U.closeQuiet(luceneIdx);
+        }
+
+        /**
          * @param tbl Table.
          * @param idxName Index name.
          * @param cols Columns.
@@ -2668,13 +2674,8 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
          * Called after the schema was dropped.
          */
         public void onDrop() {
-            for (TableDescriptor tblDesc : tbls.values()) {
-                GridH2Table tbl = tblDesc.tbl;
-
-                dataTables.remove(tbl.identifier(), tbl);
-
-                tbl.destroy();
-            }
+            for (TableDescriptor tblDesc : tbls.values())
+                tblDesc.onDrop();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/44cabd84/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheIndexingOffheapCleanupTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheIndexingOffheapCleanupTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheIndexingOffheapCleanupTest.java
new file mode 100644
index 0000000..3d7e30a
--- /dev/null
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheIndexingOffheapCleanupTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.cache.query.annotations.QueryTextField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheMemoryMode.OFFHEAP_TIERED;
+
+/**
+ *
+ */
+public class CacheIndexingOffheapCleanupTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        startGrid(0);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        super.afterTest();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCacheDestroy() throws Exception {
+        Ignite ignite = ignite(0);
+
+        for (int i = 0; i < 5; i++) {
+            log.info("Iteration: " + i);
+
+            IgniteCache cache = ignite.createCache(cacheConfiguration());
+
+            for (int k = 0; k < 100; k++)
+                cache.put(k, new TestType());
+
+            GridUnsafeMemory mem = schemaMemory(ignite, cache.getName());
+
+            assertTrue(mem.allocatedSize() > 0);
+
+            ignite.destroyCache(cache.getName());
+
+            assertEquals(0, mem.allocatedSize());
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testStopNode() throws Exception {
+        Ignite ignite = ignite(0);
+
+        IgniteCache cache = ignite.createCache(cacheConfiguration());
+
+        for (int k = 0; k < 100; k++)
+            cache.put(k, new TestType());
+
+        GridUnsafeMemory mem = schemaMemory(ignite, cache.getName());
+
+        assertTrue(mem.allocatedSize() > 0);
+
+        stopGrid(0);
+
+        assertEquals(0, mem.allocatedSize());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testUndeploy() throws Exception {
+        Ignite ignite = ignite(0);
+
+        IgniteCache cache = ignite.createCache(cacheConfiguration());
+
+        for (int k = 0; k < 100; k++)
+            cache.put(k, new TestType());
+
+        GridUnsafeMemory mem = schemaMemory(ignite, cache.getName());
+
+        assertTrue(mem.allocatedSize() > 0);
+
+        ((IgniteKernal)ignite).context().query().onUndeploy("cache", 
U.detectClassLoader(TestType.class));
+
+        assertEquals(0, mem.allocatedSize());
+    }
+
+    /**
+     * @param ignite Node.
+     * @param cacheName Cache name.
+     * @return Memory.
+     */
+    private GridUnsafeMemory schemaMemory(Ignite ignite, String cacheName) {
+        Map<String, Object> schemas = 
GridTestUtils.getFieldValue(((IgniteKernal)ignite).context().query(),
+            "idx",
+            "schemas");
+
+        assertNotNull(schemas);
+
+        Object schema = schemas.get("\"" + cacheName + "\"");
+
+        assertNotNull(schema);
+
+        GridUnsafeMemory mem = GridTestUtils.getFieldValue(schema, "offheap");
+
+        assertNotNull(mem);
+
+        return mem;
+    }
+
+    /**
+     * @return Cache configuration.
+     */
+    private CacheConfiguration cacheConfiguration() {
+        CacheConfiguration ccfg = new CacheConfiguration();
+
+        ccfg.setName("cache");
+        ccfg.setMemoryMode(OFFHEAP_TIERED);
+        ccfg.setIndexedTypes(Integer.class, TestType.class);
+
+        return ccfg;
+    }
+
+    /**
+     *
+     */
+    static class TestType {
+        /** */
+        @QuerySqlField(index = true)
+        private int v1;
+
+        /** */
+        @QuerySqlField(index = true)
+        private String v2;
+
+        /** */
+        @QueryTextField
+        private String v3;
+
+        /**
+         *
+         */
+        public TestType() {
+            int v = ThreadLocalRandom.current().nextInt();
+
+            v1 = v;
+            v2 = String.valueOf(v);
+            v3 = v2;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/44cabd84/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
 
b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
index a85b7a6..5cdd744 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
@@ -20,6 +20,7 @@ package org.apache.ignite.testsuites;
 import junit.framework.TestSuite;
 import org.apache.ignite.internal.processors.cache.CacheConfigurationP2PTest;
 import org.apache.ignite.internal.processors.cache.CacheIndexStreamerTest;
+import 
org.apache.ignite.internal.processors.cache.CacheIndexingOffheapCleanupTest;
 import 
org.apache.ignite.internal.processors.cache.CacheOperationsWithExpirationTest;
 import 
org.apache.ignite.internal.processors.cache.CacheRandomOperationsMultithreadedTest;
 import 
org.apache.ignite.internal.processors.cache.GridCacheOffHeapAndSwapSelfTest;
@@ -76,6 +77,7 @@ public class IgniteCacheWithIndexingTestSuite extends 
TestSuite {
         suite.addTestSuite(CacheRandomOperationsMultithreadedTest.class);
         suite.addTestSuite(IgniteCacheStarvationOnRebalanceTest.class);
         suite.addTestSuite(CacheOperationsWithExpirationTest.class);
+        suite.addTestSuite(CacheIndexingOffheapCleanupTest.class);
 
         return suite;
     }

Reply via email to