You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2018/10/19 12:39:39 UTC

ignite git commit: ignite-9720

Repository: ignite
Updated Branches:
  refs/heads/ignite-9720 [created] 057f4fdc7


ignite-9720


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

Branch: refs/heads/ignite-9720
Commit: 057f4fdc7ede35779e98b09a7e9c7a7844f3d70e
Parents: 82d2efe
Author: sboikov <sb...@apache.org>
Authored: Fri Oct 19 15:39:22 2018 +0300
Committer: sboikov <sb...@apache.org>
Committed: Fri Oct 19 15:39:22 2018 +0300

----------------------------------------------------------------------
 .../cache/persistence/CacheFreeList.java        |  32 ++++
 .../persistence/GridCacheOffheapManager.java    |  64 +++++--
 .../IgniteCacheDatabaseSharedManager.java       |  26 +--
 .../cache/persistence/LazyCacheFreeList.java    | 168 +++++++++++++++++++
 .../persistence/freelist/AbstractFreeList.java  |   9 +-
 .../cache/persistence/freelist/FreeList.java    |  13 ++
 .../cache/persistence/freelist/PagesList.java   |   4 +-
 7 files changed, 276 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheFreeList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheFreeList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheFreeList.java
new file mode 100644
index 0000000..2d79cd6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/CacheFreeList.java
@@ -0,0 +1,32 @@
+/*
+ * 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.persistence;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.processors.cache.persistence.freelist.FreeList;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
+
+/**
+ *
+ */
+public interface CacheFreeList<T extends Storable> extends FreeList<T>, ReuseList {
+    /**
+     * @throws IgniteCheckedException If failed.
+     */
+    public void saveMetadata() throws IgniteCheckedException;
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
index cb682f6..22249cd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
@@ -65,6 +65,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.topology.Grid
 import org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccVersion;
 import org.apache.ignite.internal.processors.cache.persistence.freelist.CacheFreeListImpl;
+import org.apache.ignite.internal.processors.cache.persistence.freelist.FreeList;
 import org.apache.ignite.internal.processors.cache.persistence.migration.UpgradePendingTreeToPerPartitionTask;
 import org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryEx;
 import org.apache.ignite.internal.processors.cache.persistence.partstate.GroupPartitionId;
@@ -246,7 +247,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
         RowStore rowStore0 = store.rowStore();
 
         if (rowStore0 != null) {
-            CacheFreeListImpl freeList = (CacheFreeListImpl)rowStore0.freeList();
+            CacheFreeList freeList = (CacheFreeList)rowStore0.freeList();
 
             freeList.saveMetadata();
 
@@ -880,7 +881,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
         for (CacheDataStore store : partDataStores.values()) {
             assert store instanceof GridCacheDataStore;
 
-            CacheFreeListImpl freeList = ((GridCacheDataStore)store).freeList;
+            FreeList<CacheDataRow> freeList = ((GridCacheDataStore)store).freeList;
 
             if (freeList == null)
                 continue;
@@ -1263,6 +1264,44 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
     /**
      *
      */
+    private static class PartitionCacheFreeList extends CacheFreeListImpl {
+        /** */
+        private final CacheGroupContext grp;
+
+        /** */
+        private final int partId;
+
+        /**
+         * @param grp Cache group.
+         * @param partId Partition.
+         * @param reuseRoot Reuse list root page.
+         * @throws IgniteCheckedException If failed.
+         */
+        PartitionCacheFreeList(CacheGroupContext grp, int partId, RootPage reuseRoot) throws IgniteCheckedException {
+            super(grp.groupId(),
+                grp.cacheOrGroupName() + "-" + partId,
+                grp.dataRegion().memoryMetrics(),
+                grp.dataRegion(),
+                null,
+                grp.shared().wal(),
+                reuseRoot.pageId().pageId(),
+                reuseRoot.isAllocated());
+
+            this.grp = grp;
+            this.partId = partId;
+        }
+
+        /** {@inheritDoc} */
+        @Override protected long allocatePageNoReuse() throws IgniteCheckedException {
+            assert grp.shared().database().checkpointLockIsHeldByThread();
+
+            return pageMem.allocatePage(grpId, partId, PageIdAllocator.FLAG_DATA);
+        }
+    }
+
+    /**
+     *
+     */
     public class GridCacheDataStore implements CacheDataStore {
         /** */
         private final int partId;
@@ -1271,7 +1310,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
         private String name;
 
         /** */
-        private volatile CacheFreeListImpl freeList;
+        private volatile CacheFreeList freeList;
 
         /** */
         private PendingEntriesTree pendingTree;
@@ -1318,7 +1357,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
                     return null;
             }
 
-            if (init.compareAndSet(false, true)) {
+            if (!init.get() && init.compareAndSet(false, true)) {
                 IgniteCacheDatabaseSharedManager dbMgr = ctx.database();
 
                 dbMgr.checkpointReadLock();
@@ -1328,20 +1367,9 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
 
                     RootPage reuseRoot = metas.reuseListRoot;
 
-                    freeList = new CacheFreeListImpl(
-                        grp.groupId(),
-                        grp.cacheOrGroupName() + "-" + partId,
-                        grp.dataRegion().memoryMetrics(),
-                        grp.dataRegion(),
-                        null,
-                        ctx.wal(),
-                        reuseRoot.pageId().pageId(),
-                        reuseRoot.isAllocated()) {
-                        /** {@inheritDoc} */
-                        @Override protected long allocatePageNoReuse() throws IgniteCheckedException {
-                            assert grp.shared().database().checkpointLockIsHeldByThread();
-
-                            return pageMem.allocatePage(grpId, partId, PageIdAllocator.FLAG_DATA);
+                    freeList = new LazyCacheFreeList() {
+                        @Override protected CacheFreeList createDelegate() throws IgniteCheckedException {
+                            return new PartitionCacheFreeList(grp, partId, reuseRoot);
                         }
                     };
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
index 28ce085..d146f43 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
@@ -106,10 +106,10 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
     protected DataRegion dfltDataRegion;
 
     /** */
-    protected Map<String, CacheFreeListImpl> freeListMap;
+    protected Map<String, CacheFreeList> freeListMap;
 
     /** */
-    private CacheFreeListImpl dfltFreeList;
+    private CacheFreeList dfltFreeList;
 
     /** Page size from memory configuration, may be set only for fake(standalone) IgniteCacheDataBaseSharedManager */
     private int pageSize;
@@ -195,13 +195,13 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
             boolean persistenceEnabled = memPlcCfg.isPersistenceEnabled();
 
             CacheFreeListImpl freeList = new CacheFreeListImpl(0,
-                    cctx.igniteInstanceName(),
-                    memMetrics,
-                    memPlc,
-                    null,
-                    persistenceEnabled ? cctx.wal() : null,
-                    0L,
-                    true);
+                cctx.igniteInstanceName(),
+                memMetrics,
+                memPlc,
+                null,
+                persistenceEnabled ? cctx.wal() : null,
+                0L,
+                true);
 
             freeListMap.put(memPlcCfg.getName(), freeList);
         }
@@ -328,11 +328,11 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
         final String dataRegName = dataRegCfg.getName();
 
         return new IgniteOutClosure<Long>() {
-            private CacheFreeListImpl freeList;
+            private CacheFreeList freeList;
 
             @Override public Long apply() {
                 if (freeList == null) {
-                    CacheFreeListImpl freeList0 = freeListMap.get(dataRegName);
+                    CacheFreeList freeList0 = freeListMap.get(dataRegName);
 
                     if (freeList0 == null)
                         return 0L;
@@ -611,7 +611,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      */
     public void dumpStatistics(IgniteLogger log) {
         if (freeListMap != null) {
-            for (CacheFreeListImpl freeList : freeListMap.values())
+            for (CacheFreeList freeList : freeListMap.values())
                 freeList.dumpStatistics(log);
         }
     }
@@ -922,7 +922,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
 
         int sysPageSize = pageMem.systemPageSize();
 
-        CacheFreeListImpl freeListImpl = freeListMap.get(plcCfg.getName());
+        CacheFreeList freeListImpl = freeListMap.get(plcCfg.getName());
 
         for (;;) {
             long allocatedPagesCnt = pageMem.loadedPages();

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/LazyCacheFreeList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/LazyCacheFreeList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/LazyCacheFreeList.java
new file mode 100644
index 0000000..1cbd841
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/LazyCacheFreeList.java
@@ -0,0 +1,168 @@
+/*
+ * 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.persistence;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseBag;
+import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+/**
+ *
+ */
+public abstract class LazyCacheFreeList implements CacheFreeList<CacheDataRow> {
+    /** */
+    private static final AtomicReferenceFieldUpdater<LazyCacheFreeList, CountDownLatch> initLatchUpdater =
+        AtomicReferenceFieldUpdater.newUpdater(LazyCacheFreeList.class, CountDownLatch.class, "initLatch");
+
+    /** */
+    private volatile CacheFreeList delegate;
+
+    /** */
+    private IgniteCheckedException initErr;
+
+    /** */
+    private volatile CountDownLatch initLatch;
+
+    /** {@inheritDoc} */
+    @Override public void saveMetadata() throws IgniteCheckedException {
+        CacheFreeList delegate = this.delegate;
+
+        if (delegate != null)
+            delegate.saveMetadata();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void insertDataRow(CacheDataRow row) throws IgniteCheckedException {
+        initDelegateIfNeeded().insertDataRow(row);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean updateDataRow(long link, CacheDataRow row) throws IgniteCheckedException {
+        return initDelegateIfNeeded().updateDataRow(link, row);
+    }
+
+    /** {@inheritDoc} */
+    @Override public <S, R> R updateDataRow(long link, PageHandler<S, R> pageHnd, S arg) throws IgniteCheckedException {
+        return (R)initDelegateIfNeeded().updateDataRow(link, pageHnd, arg);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void removeDataRowByLink(long link) throws IgniteCheckedException {
+        initDelegateIfNeeded().removeDataRowByLink(link);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int emptyDataPages() {
+        try {
+            return initDelegateIfNeeded().emptyDataPages();
+        }
+        catch (IgniteCheckedException e) {
+            throw new IgniteException("Failed to initialize FreeList", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public long freeSpace() {
+        try {
+            return initDelegateIfNeeded().freeSpace();
+        }
+        catch (IgniteCheckedException e) {
+            throw new IgniteException("Failed to initialize FreeList", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public void dumpStatistics(IgniteLogger log) {
+        CacheFreeList delegate = this.delegate;
+
+        if (delegate != null)
+            delegate.dumpStatistics(log);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void addForRecycle(ReuseBag bag) throws IgniteCheckedException {
+        initDelegateIfNeeded().addForRecycle(bag);
+    }
+
+    /** {@inheritDoc} */
+    @Override public long takeRecycledPage() throws IgniteCheckedException {
+        return initDelegateIfNeeded().takeRecycledPage();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long recycledPagesCount() throws IgniteCheckedException {
+        return  initDelegateIfNeeded().recycledPagesCount();
+    }
+
+    /**
+     * @return Cache free list.
+     * @throws IgniteCheckedException If failed.
+     */
+    protected abstract CacheFreeList createDelegate() throws IgniteCheckedException;
+
+    /**
+     * @return Cache free list.
+     * @throws IgniteCheckedException If failed to initialize free list.
+     */
+    private CacheFreeList initDelegateIfNeeded() throws IgniteCheckedException {
+        CacheFreeList delegate = this.delegate;
+
+        if (delegate != null)
+            return delegate;
+
+        CountDownLatch initLatch = this.initLatch;
+
+        if (initLatch != null)
+            U.await(initLatch);
+        else {
+            initLatch = new CountDownLatch(1);
+
+            if (initLatchUpdater.compareAndSet(this, null, initLatch)) {
+                try {
+                    this.delegate = createDelegate();
+                }
+                catch (IgniteCheckedException e) {
+                    this.initErr = e;
+                }
+                finally {
+                    initLatch.countDown();
+                }
+            }
+            else {
+                initLatch = this.initLatch;
+
+                assert initLatch != null;
+
+                U.await(initLatch);
+            }
+        }
+
+        IgniteCheckedException initErr = this.initErr;
+
+        if (initErr != null)
+            throw initErr;
+
+        return this.delegate;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/AbstractFreeList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/AbstractFreeList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/AbstractFreeList.java
index 4e1f783..b446ccb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/AbstractFreeList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/AbstractFreeList.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.pagemem.wal.record.delta.DataPageInsertFragmen
 import org.apache.ignite.internal.pagemem.wal.record.delta.DataPageInsertRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.DataPageRemoveRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.DataPageUpdateRecord;
+import org.apache.ignite.internal.processors.cache.persistence.CacheFreeList;
 import org.apache.ignite.internal.processors.cache.persistence.DataRegion;
 import org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl;
 import org.apache.ignite.internal.processors.cache.persistence.Storable;
@@ -44,7 +45,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  */
-public abstract class AbstractFreeList<T extends Storable> extends PagesList implements FreeList<T>, ReuseList {
+public abstract class AbstractFreeList<T extends Storable> extends PagesList implements CacheFreeList<T> {
     /** */
     private static final int BUCKETS = 256; // Must be power of 2.
 
@@ -371,11 +372,7 @@ public abstract class AbstractFreeList<T extends Storable> extends PagesList imp
         init(metaPageId, initNew);
     }
 
-    /**
-     * Calculates free space tracked by this FreeListImpl instance.
-     *
-     * @return Free space available for use, in bytes.
-     */
+    /** {@inheritDoc} */
     public long freeSpace() {
         long freeSpace = 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/FreeList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/FreeList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/FreeList.java
index e73124e..29e8400 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/FreeList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/FreeList.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.processors.cache.persistence.Storable;
 import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler;
 
 /**
+ *
  */
 public interface FreeList<T extends Storable> {
     /**
@@ -57,6 +58,18 @@ public interface FreeList<T extends Storable> {
     public void removeDataRowByLink(long link) throws IgniteCheckedException;
 
     /**
+     * @return Number of empty data pages in free list.
+     */
+    public int emptyDataPages();
+
+    /**
+     * Calculates free space tracked by this free list.
+     *
+     * @return Free space available for use, in bytes.
+     */
+    public long freeSpace();
+
+    /**
      * @param log Logger.
      */
     public void dumpStatistics(IgniteLogger log);

http://git-wip-us.apache.org/repos/asf/ignite/blob/057f4fdc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/PagesList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/PagesList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/PagesList.java
index f1cc32a..e08439d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/PagesList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/PagesList.java
@@ -251,9 +251,7 @@ public abstract class PagesList extends DataStructure {
         }
     }
 
-    /**
-     * @throws IgniteCheckedException If failed.
-     */
+    /** {@inheritDoc} */
     public void saveMetadata() throws IgniteCheckedException {
         assert metaPageId != 0;