From 636ec6329a3e214ae67f875a927b04baae5a5878 Mon Sep 17 00:00:00 2001 From: contour <40132326+Contour-D@users.noreply.github.com> Date: Sat, 10 Jun 2023 22:48:14 +0800 Subject: [PATCH] Fix AttachmentReconciler repeated execution (#4052) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind bug #### What this PR does / why we need it: Fix AttachmentReconciler repeated execution. #### Which issue(s) this PR fixes: Fixes #3746 #### Special notes for your reviewer: The reconile method in run.halo.app.core.extension.reconciler.attachment.AttachmentReconciler will be executed repeatedly, uploading an attachment will be executed twice, because updating the finalizers property will be in onUpdate of run.halo.app.extension.controller.ExtensionWatcher Will request duplicate addition, I provide a fix for you to review #### Does this PR introduce a user-facing change? ```release-note 修复 AttachmentReconciler 重复执行 ``` --- .../attachment/AttachmentReconciler.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/attachment/AttachmentReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/attachment/AttachmentReconciler.java index f1ef94fcb..d525e2ffa 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/attachment/AttachmentReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/attachment/AttachmentReconciler.java @@ -40,11 +40,7 @@ public class AttachmentReconciler implements Reconciler { client.fetch(Attachment.class, request.name()).ifPresent(attachment -> { // TODO Handle the finalizer if (attachment.getMetadata().getDeletionTimestamp() != null) { - attachmentService.delete(attachment) - .doOnNext(deletedAttachment -> { - removeFinalizer(attachment.getMetadata().getName()); - }) - .blockOptional(); + removeFinalizer(attachment); return; } // add finalizer @@ -89,14 +85,25 @@ public class AttachmentReconciler implements Reconciler { }); } - void removeFinalizer(String attachmentName) { - client.fetch(Attachment.class, attachmentName).ifPresent(attachment -> { - var finalizers = attachment.getMetadata().getFinalizers(); - if (finalizers != null && finalizers.remove(Constant.FINALIZER_NAME)) { - // update it - client.update(attachment); - } - }); + void removeFinalizer(Attachment oldAttachment) { + if (!hasFinalizer(oldAttachment, Constant.FINALIZER_NAME)) { + return; + } + attachmentService.delete(oldAttachment).block(); + client.fetch(Attachment.class, oldAttachment.getMetadata().getName()) + .ifPresent(attachment -> { + var finalizers = attachment.getMetadata().getFinalizers(); + if (hasFinalizer(attachment, Constant.FINALIZER_NAME) + && finalizers.remove(Constant.FINALIZER_NAME)) { + // update it + client.update(attachment); + } + }); + } + + boolean hasFinalizer(Attachment attachment, String finalizer) { + var finalizers = attachment.getMetadata().getFinalizers(); + return finalizers != null && finalizers.contains(finalizer); } void addFinalizerIfNotSet(String attachmentName, Set existingFinalizers) {