Skip to content

Commit

Permalink
refactor: reduce the number of failures due to conflict post update (#…
Browse files Browse the repository at this point in the history
…5604)

#### What type of PR is this?
/kind improvement
/area core
/milestone 2.14.x

#### What this PR does / why we need it:
减少文章更新因版本号冲突而失败的次数

#### Which issue(s) this PR fixes:
Fixes #5579

#### Does this PR introduce a user-facing change?
```release-note
None
```
  • Loading branch information
guqing committed Mar 27, 2024
1 parent ec4c390 commit 867d86b
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 36 deletions.
@@ -1,16 +1,19 @@
package run.halo.app.content;

import java.security.Principal;
import java.time.Duration;
import java.time.Instant;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.lang.Nullable;
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.util.Assert;
import reactor.core.publisher.Mono;
import reactor.util.retry.Retry;
import run.halo.app.core.extension.content.Snapshot;
import run.halo.app.extension.MetadataUtil;
import run.halo.app.extension.ReactiveExtensionClient;
Expand Down Expand Up @@ -94,20 +97,23 @@ protected Mono<ContentWrapper> updateContent(String baseSnapshotName,
Assert.notNull(contentRequest, "The contentRequest must not be null");
Assert.notNull(baseSnapshotName, "The baseSnapshotName must not be null");
Assert.notNull(contentRequest.headSnapshotName(), "The headSnapshotName must not be null");
return client.fetch(Snapshot.class, contentRequest.headSnapshotName())
.flatMap(headSnapshot -> client.fetch(Snapshot.class, baseSnapshotName)
.map(baseSnapshot -> determineRawAndContentPatch(headSnapshot, baseSnapshot,
contentRequest)
return Mono.defer(() -> client.fetch(Snapshot.class, contentRequest.headSnapshotName())
.flatMap(headSnapshot -> client.fetch(Snapshot.class, baseSnapshotName)
.map(baseSnapshot -> determineRawAndContentPatch(headSnapshot, baseSnapshot,
contentRequest)
)
)
.flatMap(headSnapshot -> getContextUsername()
.map(username -> {
Snapshot.addContributor(headSnapshot, username);
return headSnapshot;
})
.defaultIfEmpty(headSnapshot)
)
.flatMap(client::update)
)
.flatMap(headSnapshot -> getContextUsername()
.map(username -> {
Snapshot.addContributor(headSnapshot, username);
return headSnapshot;
})
.defaultIfEmpty(headSnapshot)
)
.flatMap(client::update)
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
.filter(throwable -> throwable instanceof OptimisticLockingFailureException))
.flatMap(head -> restoredContent(baseSnapshotName, head));
}

Expand Down
Expand Up @@ -225,13 +225,11 @@ public Mono<Post> updatePost(PostRequest postRequest) {
return client.update(post);
});
}
return Mono.defer(() -> updateContent(baseSnapshot, postRequest.contentRequest())
.flatMap(contentWrapper -> {
post.getSpec().setHeadSnapshot(contentWrapper.getSnapshotName());
return client.update(post);
}))
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
.filter(throwable -> throwable instanceof OptimisticLockingFailureException));
return updateContent(baseSnapshot, postRequest.contentRequest())
.flatMap(contentWrapper -> {
post.getSpec().setHeadSnapshot(contentWrapper.getSnapshotName());
return client.update(post);
});
}

@Override
Expand Down
Expand Up @@ -156,13 +156,11 @@ public Mono<SinglePage> update(SinglePageRequest pageRequest) {
return client.update(page);
});
}
return Mono.defer(() -> updateContent(baseSnapshot, pageRequest.contentRequest())
.flatMap(contentWrapper -> {
page.getSpec().setHeadSnapshot(contentWrapper.getSnapshotName());
return client.update(page);
}))
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
.filter(throwable -> throwable instanceof OptimisticLockingFailureException));
return updateContent(baseSnapshot, pageRequest.contentRequest())
.flatMap(contentWrapper -> {
page.getSpec().setHeadSnapshot(contentWrapper.getSnapshotName());
return client.update(page);
});
}

private Mono<ListedSinglePage> getListedSinglePage(SinglePage singlePage) {
Expand Down
Expand Up @@ -193,11 +193,13 @@ Mono<ServerResponse> draftPost(ServerRequest request) {
Mono<ServerResponse> updateContent(ServerRequest request) {
String postName = request.pathVariable("name");
return request.bodyToMono(Content.class)
.flatMap(content -> client.fetch(Post.class, postName)
.flatMap(post -> {
PostRequest postRequest = new PostRequest(post, content);
return postService.updatePost(postRequest);
})
.flatMap(content -> Mono.defer(() -> client.fetch(Post.class, postName)
.flatMap(post -> {
PostRequest postRequest = new PostRequest(post, content);
return postService.updatePost(postRequest);
}))
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
.filter(throwable -> throwable instanceof OptimisticLockingFailureException))
)
.flatMap(post -> ServerResponse.ok().bodyValue(post));
}
Expand Down
Expand Up @@ -171,11 +171,13 @@ Mono<ServerResponse> draftSinglePage(ServerRequest request) {
Mono<ServerResponse> updateContent(ServerRequest request) {
String pageName = request.pathVariable("name");
return request.bodyToMono(Content.class)
.flatMap(content -> client.fetch(SinglePage.class, pageName)
.flatMap(page -> {
SinglePageRequest pageRequest = new SinglePageRequest(page, content);
return singlePageService.update(pageRequest);
})
.flatMap(content -> Mono.defer(() -> client.fetch(SinglePage.class, pageName)
.flatMap(page -> {
SinglePageRequest pageRequest = new SinglePageRequest(page, content);
return singlePageService.update(pageRequest);
}))
.retryWhen(Retry.backoff(5, Duration.ofMillis(100))
.filter(throwable -> throwable instanceof OptimisticLockingFailureException))
)
.flatMap(post -> ServerResponse.ok().bodyValue(post));
}
Expand Down

0 comments on commit 867d86b

Please sign in to comment.