You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dg...@apache.org on 2018/10/13 18:36:48 UTC
ignite git commit: IGNITE-9612 Improve checkpoint mark phase speed -
Fixes #4971.
Repository: ignite
Updated Branches:
refs/heads/master f07bdaa07 -> 6041cda5a
IGNITE-9612 Improve checkpoint mark phase speed - Fixes #4971.
Signed-off-by: Dmitriy Govorukhin <dm...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6041cda5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6041cda5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6041cda5
Branch: refs/heads/master
Commit: 6041cda5a0b7331c33ec643d0c8ccbd77a120a86
Parents: f07bdaa
Author: ascherbakoff <al...@gmail.com>
Authored: Sat Oct 13 21:35:36 2018 +0300
Committer: Dmitriy Govorukhin <dm...@gmail.com>
Committed: Sat Oct 13 21:35:36 2018 +0300
----------------------------------------------------------------------
.../persistence/GridCacheOffheapManager.java | 32 +++++++++---
.../partstate/PartitionAllocationMap.java | 55 +++++++++++++-------
2 files changed, 62 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/6041cda5/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 c6f8415..c7a6e97 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
@@ -171,7 +171,19 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
Executor execSvc = ctx.executor();
- if (ctx.nextSnapshot() && ctx.needToSnapshot(grp.cacheOrGroupName())) {
+ boolean needSnapshot = ctx.nextSnapshot() && ctx.needToSnapshot(grp.cacheOrGroupName());
+
+ boolean hasNonEmptyGroups = false;
+
+ for (CacheDataStore store : partDataStores.values()) {
+ if (notEmpty(store)) {
+ hasNonEmptyGroups = true;
+
+ break;
+ }
+ }
+
+ if (needSnapshot && hasNonEmptyGroups) {
if (execSvc == null)
updateSnapshotTag(ctx);
else {
@@ -190,7 +202,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
reuseList.saveMetadata();
for (CacheDataStore store : partDataStores.values())
- saveStoreMetadata(store, ctx, false);
+ saveStoreMetadata(store, ctx, false, needSnapshot);
}
else {
execSvc.execute(() -> {
@@ -205,7 +217,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
for (CacheDataStore store : partDataStores.values())
execSvc.execute(() -> {
try {
- saveStoreMetadata(store, ctx, false);
+ saveStoreMetadata(store, ctx, false, needSnapshot);
}
catch (IgniteCheckedException e) {
throw new IgniteException(e);
@@ -215,18 +227,24 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
}
/**
+ * @return {@code True} is group is not empty.
+ */
+ private boolean notEmpty(CacheDataStore store) {
+ return store.rowStore() != null && (store.fullSize() > 0 || store.updateCounter() > 0);
+ }
+
+ /**
* @param store Store to save metadata.
* @throws IgniteCheckedException If failed.
*/
private void saveStoreMetadata(
CacheDataStore store,
Context ctx,
- boolean beforeDestroy
+ boolean beforeDestroy,
+ boolean needSnapshot
) throws IgniteCheckedException {
RowStore rowStore0 = store.rowStore();
- boolean needSnapshot = ctx != null && ctx.nextSnapshot() && ctx.needToSnapshot(grp.cacheOrGroupName());
-
if (rowStore0 != null) {
CacheFreeListImpl freeList = (CacheFreeListImpl)rowStore0.freeList();
@@ -617,7 +635,7 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
ctx.database().checkpointReadLock();
try {
- saveStoreMetadata(store, null, true);
+ saveStoreMetadata(store, null, true, false);
}
finally {
ctx.database().checkpointReadUnlock();
http://git-wip-us.apache.org/repos/asf/ignite/blob/6041cda5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/partstate/PartitionAllocationMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/partstate/PartitionAllocationMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/partstate/PartitionAllocationMap.java
index cab90c5..808ab41 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/partstate/PartitionAllocationMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/partstate/PartitionAllocationMap.java
@@ -20,7 +20,8 @@ package org.apache.ignite.internal.processors.cache.persistence.partstate;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
-import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.ignite.internal.pagemem.FullPageId;
import org.apache.ignite.internal.pagemem.PageIdAllocator;
import org.apache.ignite.internal.pagemem.PageIdUtils;
@@ -37,7 +38,11 @@ import org.jetbrains.annotations.Nullable;
public class PartitionAllocationMap {
/** Maps following pairs: (groupId, partId) -> (lastAllocatedCount, allocatedCount) */
@GridToStringInclude
- private final NavigableMap<GroupPartitionId, PagesAllocationRange> map = new ConcurrentSkipListMap<>();
+ private final Map<GroupPartitionId, PagesAllocationRange> writeMap = new ConcurrentHashMap<>();
+
+ /** Map used by snapshot executor. */
+ @GridToStringInclude
+ private NavigableMap<GroupPartitionId, PagesAllocationRange> readMap;
/** Partitions forced to be skipped. */
@GridToStringInclude
@@ -51,14 +56,14 @@ public class PartitionAllocationMap {
* @return value or null
*/
@Nullable public PagesAllocationRange get(GroupPartitionId key) {
- return map.get(key);
+ return readMap.get(key);
}
/**
* @param fullPageId Full page id.
*/
@Nullable public PagesAllocationRange get(FullPageId fullPageId) {
- return map.get(createCachePartId(fullPageId));
+ return readMap.get(createCachePartId(fullPageId));
}
/**
@@ -73,27 +78,27 @@ public class PartitionAllocationMap {
/** @return <tt>true</tt> if this map contains no key-value mappings */
public boolean isEmpty() {
- return map.isEmpty();
+ return readMap.isEmpty();
}
/** @return the number of key-value mappings in this map. */
public int size() {
- return map.size();
+ return readMap.size();
}
/** @return keys (all caches partitions) */
public Set<GroupPartitionId> keySet() {
- return map.keySet();
+ return readMap.keySet();
}
/** @return values (allocation ranges) */
public Iterable<PagesAllocationRange> values() {
- return map.values();
+ return readMap.values();
}
/** @return Returns the first (lowest) key currently in this map. */
public GroupPartitionId firstKey() {
- return map.firstKey();
+ return readMap.firstKey();
}
/**
@@ -103,11 +108,7 @@ public class PartitionAllocationMap {
* @return {@code true} if skipped partition was added to the ignore list during this call.
*/
public boolean forceSkipIndexPartition(int grpId) {
- GroupPartitionId idxId = new GroupPartitionId(grpId, PageIdAllocator.INDEX_PARTITION);
-
- map.remove(idxId);
-
- return skippedParts.add(idxId);
+ return skippedParts.add(new GroupPartitionId(grpId, PageIdAllocator.INDEX_PARTITION));
}
/**
@@ -117,17 +118,17 @@ public class PartitionAllocationMap {
* @return first found key which is greater than provided
*/
@Nullable public GroupPartitionId nextKey(@NotNull final GroupPartitionId key) {
- return map.navigableKeySet().higher(key);
+ return readMap.navigableKeySet().higher(key);
}
/** @return set view of the mappings contained in this map, sorted in ascending key order */
public Set<Map.Entry<GroupPartitionId, PagesAllocationRange>> entrySet() {
- return map.entrySet();
+ return readMap.entrySet();
}
/** @return <tt>true</tt> if this map contains a mapping for the specified key */
public boolean containsKey(GroupPartitionId key) {
- return map.containsKey(key);
+ return readMap.containsKey(key);
}
/**
@@ -137,7 +138,25 @@ public class PartitionAllocationMap {
* <tt>key</tt>.
*/
public PagesAllocationRange put(GroupPartitionId key, PagesAllocationRange val) {
- return !skippedParts.contains(key) ? map.put(key, val) : null;
+ return writeMap.put(key, val);
+ }
+
+ /**
+ * Prepare map for snapshot.
+ */
+ public void prepareForSnapshot() {
+ if (readMap != null)
+ return;
+
+ readMap = new TreeMap<>();
+
+ for (Map.Entry<GroupPartitionId, PagesAllocationRange> entry : writeMap.entrySet()) {
+ if (!skippedParts.contains(entry.getKey()))
+ readMap.put(entry.getKey(), entry.getValue());
+ }
+
+ skippedParts.clear();
+ writeMap.clear();
}
/** {@inheritDoc} */