From 06a44d05dc019917cda2637a7a2f88d55e25374c Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:31:13 +0800 Subject: [PATCH] fix: possible incorrect result set obtained by Gc synchronizer when sartup (#5325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind bug /area core /milestone 2.13.x #### What this PR does / why we need it: 修复启动时 GcSynchronizer 没有精准过滤出所需数据导致内存占用会出现较高峰值的问题 #### Which issue(s) this PR fixes: Fixes #5324 #### Does this PR introduce a user-facing change? ```release-note 修复启动时 GcSynchronizer 没有精准过滤出所需数据导致内存占用会出现较高峰值的问题 ``` --- .../halo/app/extension/gc/GcSynchronizer.java | 17 ++--------------- .../index/IndexedQueryEngineImpl.java | 18 ++++++++---------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/application/src/main/java/run/halo/app/extension/gc/GcSynchronizer.java b/application/src/main/java/run/halo/app/extension/gc/GcSynchronizer.java index bea81ae0a4..7fdeab68b6 100644 --- a/application/src/main/java/run/halo/app/extension/gc/GcSynchronizer.java +++ b/application/src/main/java/run/halo/app/extension/gc/GcSynchronizer.java @@ -1,9 +1,6 @@ package run.halo.app.extension.gc; -import static run.halo.app.extension.Comparators.compareCreationTimestamp; - import java.util.List; -import java.util.function.Predicate; import org.springframework.data.domain.Sort; import run.halo.app.extension.Extension; import run.halo.app.extension.ExtensionClient; @@ -64,8 +61,6 @@ public void start() { if (event instanceof SchemeRegistered registeredEvent) { var newScheme = registeredEvent.getNewScheme(); listDeleted(newScheme.type()).forEach(watcher::onDelete); - client.list(newScheme.type(), deleted(), compareCreationTimestamp(true)) - .forEach(watcher::onDelete); } }); client.watch(watcher); @@ -77,16 +72,8 @@ public void start() { List listDeleted(Class type) { var options = new ListOptions() .setFieldSelector( - FieldSelector.of(QueryFactory.all("metadata.deletionTimestamp")) + FieldSelector.of(QueryFactory.isNotNull("metadata.deletionTimestamp")) ); - return client.listAll(type, options, Sort.by("metadata.creationTimestamp")) - .stream() - .sorted(compareCreationTimestamp(true)) - .toList(); - } - - private Predicate deleted() { - return extension -> extension.getMetadata().getDeletionTimestamp() != null; + return client.listAll(type, options, Sort.by(Sort.Order.asc("metadata.creationTimestamp"))); } - } diff --git a/application/src/main/java/run/halo/app/extension/index/IndexedQueryEngineImpl.java b/application/src/main/java/run/halo/app/extension/index/IndexedQueryEngineImpl.java index ff11f4ca63..b3723fcb80 100644 --- a/application/src/main/java/run/halo/app/extension/index/IndexedQueryEngineImpl.java +++ b/application/src/main/java/run/halo/app/extension/index/IndexedQueryEngineImpl.java @@ -20,7 +20,6 @@ import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.PageRequest; -import run.halo.app.extension.index.query.All; import run.halo.app.extension.index.query.QueryIndexViewImpl; import run.halo.app.extension.router.selector.FieldSelector; import run.halo.app.extension.router.selector.LabelSelector; @@ -155,12 +154,13 @@ List doRetrieve(Indexer indexer, ListOptions options, Sort sort) { stopWatch.stop(); stopWatch.start("retrieve matched metadata names"); - var hasLabelSelector = hasLabelSelector(options.getLabelSelector()); - final List matchedByLabels = hasLabelSelector - ? retrieveForLabelMatchers(options.getLabelSelector().getMatchers(), fieldPathEntryMap, - allMetadataNames) - : allMetadataNames; - indexView.removeByIdNotIn(new TreeSet<>(matchedByLabels)); + if (hasLabelSelector(options.getLabelSelector())) { + var matchedByLabels = retrieveForLabelMatchers(options.getLabelSelector().getMatchers(), + fieldPathEntryMap, allMetadataNames); + if (allMetadataNames.size() != matchedByLabels.size()) { + indexView.removeByIdNotIn(new TreeSet<>(matchedByLabels)); + } + } stopWatch.stop(); stopWatch.start("retrieve matched metadata names by fields"); @@ -188,8 +188,6 @@ boolean hasLabelSelector(LabelSelector labelSelector) { } boolean hasFieldSelector(FieldSelector fieldSelector) { - return fieldSelector != null - && fieldSelector.query() != null - && !(fieldSelector.query() instanceof All); + return fieldSelector != null; } }