fix: possible incorrect result set obtained by Gc synchronizer when sartup (#5325)

#### 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 没有精准过滤出所需数据导致内存占用会出现较高峰值的问题
```
pull/5301/head^2
guqing 2024-02-05 14:31:13 +08:00 committed by GitHub
parent dcef5d4157
commit 06a44d05dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 25 deletions

View File

@ -1,9 +1,6 @@
package run.halo.app.extension.gc; package run.halo.app.extension.gc;
import static run.halo.app.extension.Comparators.compareCreationTimestamp;
import java.util.List; import java.util.List;
import java.util.function.Predicate;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import run.halo.app.extension.Extension; import run.halo.app.extension.Extension;
import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ExtensionClient;
@ -64,8 +61,6 @@ class GcSynchronizer implements Synchronizer<GcRequest> {
if (event instanceof SchemeRegistered registeredEvent) { if (event instanceof SchemeRegistered registeredEvent) {
var newScheme = registeredEvent.getNewScheme(); var newScheme = registeredEvent.getNewScheme();
listDeleted(newScheme.type()).forEach(watcher::onDelete); listDeleted(newScheme.type()).forEach(watcher::onDelete);
client.list(newScheme.type(), deleted(), compareCreationTimestamp(true))
.forEach(watcher::onDelete);
} }
}); });
client.watch(watcher); client.watch(watcher);
@ -77,16 +72,8 @@ class GcSynchronizer implements Synchronizer<GcRequest> {
<E extends Extension> List<E> listDeleted(Class<E> type) { <E extends Extension> List<E> listDeleted(Class<E> type) {
var options = new ListOptions() var options = new ListOptions()
.setFieldSelector( .setFieldSelector(
FieldSelector.of(QueryFactory.all("metadata.deletionTimestamp")) FieldSelector.of(QueryFactory.isNotNull("metadata.deletionTimestamp"))
); );
return client.listAll(type, options, Sort.by("metadata.creationTimestamp")) return client.listAll(type, options, Sort.by(Sort.Order.asc("metadata.creationTimestamp")));
.stream()
.sorted(compareCreationTimestamp(true))
.toList();
} }
private <E extends Extension> Predicate<E> deleted() {
return extension -> extension.getMetadata().getDeletionTimestamp() != null;
}
} }

View File

@ -20,7 +20,6 @@ import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListOptions;
import run.halo.app.extension.ListResult; import run.halo.app.extension.ListResult;
import run.halo.app.extension.PageRequest; 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.index.query.QueryIndexViewImpl;
import run.halo.app.extension.router.selector.FieldSelector; import run.halo.app.extension.router.selector.FieldSelector;
import run.halo.app.extension.router.selector.LabelSelector; import run.halo.app.extension.router.selector.LabelSelector;
@ -155,12 +154,13 @@ public class IndexedQueryEngineImpl implements IndexedQueryEngine {
stopWatch.stop(); stopWatch.stop();
stopWatch.start("retrieve matched metadata names"); stopWatch.start("retrieve matched metadata names");
var hasLabelSelector = hasLabelSelector(options.getLabelSelector()); if (hasLabelSelector(options.getLabelSelector())) {
final List<String> matchedByLabels = hasLabelSelector var matchedByLabels = retrieveForLabelMatchers(options.getLabelSelector().getMatchers(),
? retrieveForLabelMatchers(options.getLabelSelector().getMatchers(), fieldPathEntryMap, fieldPathEntryMap, allMetadataNames);
allMetadataNames) if (allMetadataNames.size() != matchedByLabels.size()) {
: allMetadataNames; indexView.removeByIdNotIn(new TreeSet<>(matchedByLabels));
indexView.removeByIdNotIn(new TreeSet<>(matchedByLabels)); }
}
stopWatch.stop(); stopWatch.stop();
stopWatch.start("retrieve matched metadata names by fields"); stopWatch.start("retrieve matched metadata names by fields");
@ -188,8 +188,6 @@ public class IndexedQueryEngineImpl implements IndexedQueryEngine {
} }
boolean hasFieldSelector(FieldSelector fieldSelector) { boolean hasFieldSelector(FieldSelector fieldSelector) {
return fieldSelector != null return fieldSelector != null;
&& fieldSelector.query() != null
&& !(fieldSelector.query() instanceof All);
} }
} }