Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 77D12200C4F for ; Thu, 2 Mar 2017 08:51:44 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 7697C160B7A; Thu, 2 Mar 2017 07:51:44 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 980EB160B61 for ; Thu, 2 Mar 2017 08:51:43 +0100 (CET) Received: (qmail 59350 invoked by uid 500); 2 Mar 2017 07:51:42 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 59333 invoked by uid 99); 2 Mar 2017 07:51:42 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 02 Mar 2017 07:51:42 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8C1E8DF989; Thu, 2 Mar 2017 07:51:42 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: agoncharuk@apache.org To: commits@ignite.apache.org Date: Thu, 02 Mar 2017 07:51:43 -0000 Message-Id: In-Reply-To: <5d87fe9ae5cb4d2288aecab9e6512008@git.apache.org> References: <5d87fe9ae5cb4d2288aecab9e6512008@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/3] ignite git commit: ignite-db-x fix memory leak on destroy cache archived-at: Thu, 02 Mar 2017 07:51:44 -0000 ignite-db-x fix memory leak on destroy cache Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fa3eab33 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fa3eab33 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fa3eab33 Branch: refs/heads/ignite-3477 Commit: fa3eab3391794d08d61c84d8d4530ec51959b34e Parents: 718da72 Author: Dmitriy Govorukhin Authored: Tue Feb 28 20:04:06 2017 +0300 Committer: Dmitriy Govorukhin Committed: Tue Feb 28 20:04:06 2017 +0300 ---------------------------------------------------------------------- .../cache/IgniteCacheOffheapManagerImpl.java | 33 +++++++++++++++++++- .../cache/database/tree/BPlusTree.java | 18 +++++++++++ .../cache/database/tree/io/BPlusIO.java | 9 ++++++ 3 files changed, 59 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/fa3eab33/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 5df99b6..aa6fb94 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 @@ -23,6 +23,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import javax.cache.Cache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -68,6 +69,7 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteClosure; +import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgnitePredicate; import org.jetbrains.annotations.Nullable; @@ -1071,7 +1073,28 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple /** {@inheritDoc} */ @Override public void destroy() throws IgniteCheckedException { - dataTree.destroy(); + final AtomicReference exception = new AtomicReference<>(); + + dataTree.destroy(new IgniteInClosure() { + @Override public void apply(CacheSearchRow row) { + try { + rowStore.removeRow(row.link()); + } + catch (IgniteCheckedException e) { + U.error(log, "Fail remove row [link=" + row.link() + "]"); + + IgniteCheckedException ex = exception.get(); + + if (ex == null) + exception.set(e); + else + ex.addSuppressed(e); + } + } + }); + + if (exception.get() != null) + throw new IgniteCheckedException("Fail destroy store", exception.get()); } /** {@inheritDoc} */ @@ -1595,6 +1618,14 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple @Override public int getHash(long pageAddr, int idx) { return PageUtils.getInt(pageAddr, offset(idx) + 8); } + + /** {@inheritDoc} */ + @Override public void visit(long pageAddr, IgniteInClosure c) { + int cnt = getCount(pageAddr); + + for (int i = 0; i < cnt; i++) + c.apply(new CacheDataRowAdapter(getLink(pageAddr, i))); + } } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/fa3eab33/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java index aa61fbd..f1c16aa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java @@ -63,6 +63,7 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteInClosure; import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Bool.DONE; import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Bool.FALSE; @@ -1795,6 +1796,20 @@ public abstract class BPlusTree extends DataStructure implements * @throws IgniteCheckedException If failed. */ public final long destroy() throws IgniteCheckedException { + return destroy(null); + } + + /** + * Destroys tree. This method is allowed to be invoked only when the tree is out of use (no concurrent operations + * are trying to read or update the tree after destroy beginning). + * + * @param c Visitor closure. Visits only leaf pages. + * @return Number of pages recycled from this tree. If the tree was destroyed by someone else concurrently returns + * {@code 0}, otherwise it should return at least {@code 2} (for meta page and root page), unless this tree is + * used as metadata storage, or {@code -1} if we don't have a reuse list and did not do recycling at all. + * @throws IgniteCheckedException If failed. + */ + public final long destroy(IgniteInClosure c) throws IgniteCheckedException { if (!markDestroyed()) return 0; @@ -1819,6 +1834,9 @@ public abstract class BPlusTree extends DataStructure implements try { BPlusIO io = io(pageAddr); + if (c != null && io.isLeaf()) + io.visit(pageAddr, c); + long fwdPageId = io.getForward(pageAddr); bag.addFreePage(recyclePage(pageId, page, pageAddr)); http://git-wip-us.apache.org/repos/asf/ignite/blob/fa3eab33/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java index bcf2908..fe1a0d0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java @@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.cache.database.tree.io; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.pagemem.PageUtils; import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree; +import org.apache.ignite.lang.IgniteInClosure; /** * Abstract IO routines for B+Tree pages. @@ -391,4 +392,12 @@ public abstract class BPlusIO extends PageIO { private static void putBytes(long pageAddr, int pos, byte[] bytes) { PageUtils.putBytes(pageAddr, pos, bytes); } + + /** + * @param pageAddr Page address. + * @param c Closure. + */ + public void visit(long pageAddr, IgniteInClosure c) { + // No-op. + } }