Go to file
John Niang c80c5e23c6
Refactor the transformation between data buffers and input stream (#4391)
#### What type of PR is this?

/kind cleanup
/area core
/milestone 2.9.x

#### What this PR does / why we need it:

Before this, If we use a file with length less than 256KB for recovery, the process remains stagnant until we cancel the request.

This PR refactors the transformation between data buffers and input stream and resolve the issue above. We should avoid returning InputStream directly in reactive stream.

- DataBufferUtils before

    ```java
        public static InputStream toInputStream(Flux<DataBuffer> content) throws IOException {
            var pos = new PipedOutputStream();
            var pis = new PipedInputStream(pos);
            write(content, pos)
                .doOnComplete(() -> {
                    try {
                        pos.close();
                    } catch (IOException ignored) {
                        // Ignore the error
                    }
                })
                .subscribeOn(Schedulers.boundedElastic())
                .subscribe(releaseConsumer(), error -> {
                    if (error instanceof IOException) {
                        // Ignore the error
                        return;
                    }
                    log.error("Failed to write DataBuffer into OutputStream", error);
                });
            return pis;
    ```

- DataBufferUtils after

    ```java
        public static Mono<InputStream> toInputStream(Publisher<DataBuffer> content,
            Scheduler scheduler) {
            return Mono.create(sink -> {
                try {
                    var pos = new PipedOutputStream();
                    var pis = new PipedInputStream(pos);
                    var disposable = write(content, pos)
                        .subscribeOn(scheduler)
                        .subscribe(releaseConsumer(), sink::error, () -> FileUtils.closeQuietly(pos),
                            Context.of(sink.contextView()));
                    sink.onDispose(disposable);
                    sink.success(pis);
                } catch (IOException e) {
                    sink.error(e);
                }
            });
    ```

#### Special notes for your reviewer:

Please test for plugins, themes and migrations.

#### Does this PR introduce a user-facing change?

```release-note
解决备份恢复时因文件小于 256KB 而导致接口卡住的问题。
```
2023-08-12 09:14:11 +00:00
.github chore: add sponsorship entry and sponsor image (#4233) 2023-07-16 16:14:19 +00:00
api refactor: improve the system initialization process (#4306) 2023-08-11 09:10:35 +08:00
application Refactor the transformation between data buffers and input stream (#4391) 2023-08-12 09:14:11 +00:00
buildSrc Support publishing to maven central repository (#3767) 2023-04-18 14:28:23 +08:00
config/checkstyle chore: add checkstyle rule (#2091) 2022-05-17 06:46:11 +00:00
console refactor: improve the system initialization process (#4306) 2023-08-11 09:10:35 +08:00
docs Support backup and restore (#4206) 2023-07-24 08:26:16 +00:00
gradle/wrapper Upgrade to Gradle 8.0.2 (#3543) 2023-03-21 02:44:27 +00:00
hack chore: add cherry_pick_pull.sh for cherry-picking pull request (#1554) 2021-12-03 10:21:24 +08:00
platform Upgrade to SpringDoc 2.2.0 for OpenAPI 3.1 support (#4384) 2023-08-08 07:02:12 +00:00
.dockerignore Refactor project structure for a better development (#3552) 2023-03-23 08:02:33 +00:00
.editorconfig Support backup and restore (#4206) 2023-07-24 08:26:16 +00:00
.gitattributes Refactor .gitignore 2019-04-03 11:37:59 +08:00
.gitignore Refactor project structure for a better development (#3552) 2023-03-23 08:02:33 +00:00
CODE_OF_CONDUCT.md docs: add CODE_OF_CONDUCT.md (#2150) 2022-06-12 08:10:12 +00:00
CONTRIBUTING.md chore: add cherry_pick_pull.sh for cherry-picking pull request (#1554) 2021-12-03 10:21:24 +08:00
Dockerfile Refactor project structure for a better development (#3552) 2023-03-23 08:02:33 +00:00
LICENSE Create LICENSE 2018-03-21 21:39:46 +08:00
OWNERS chore: add @LIlGG to reviewers list (#3292) 2023-02-13 01:48:18 +00:00
README.md docs: add appstore link in readme (#4370) 2023-08-03 06:05:26 +00:00
SECURITY.md docs: update SECURITY.md for Halo 2.x (#3780) 2023-04-19 02:47:00 +00:00
gradle.properties Prepare for developing Halo 2.9.0 (#4344) 2023-08-01 07:33:45 +00:00
gradlew Upgrade to Gradle 8.0.2 (#3543) 2023-03-21 02:44:27 +00:00
gradlew.bat Upgrade to Gradle 8.0.2 (#3543) 2023-03-21 02:44:27 +00:00
settings.gradle Refactor project structure for a better development (#3552) 2023-03-23 08:02:33 +00:00

README.md

Halo logo

Halo [ˈheɪloʊ],强大易用的开源建站工具。

GitHub release Docker pulls GitHub last commit GitHub Workflow Status Codecov percentage
官网 文档 社区 Gitee Telegram 频道


快速开始

docker run \
  -it -d \
  --name halo \
  -p 8090:8090 \
  -v ~/.halo2:/root/.halo2 \
  halohub/halo:2.8 \
  --halo.security.initializer.superadminusername=admin \
  --halo.security.initializer.superadminpassword=P@88w0rd

以上仅作为体验使用,详细部署文档请查阅:https://docs.halo.run/getting-started/install/docker-compose

在线体验

生态

可访问 官方应用市场awesome-halo 仓库 查看已经适用于 Halo 2.x 的主题和插件,以及适用于 Halo 1.x 的相关仓库。

许可证

license

Halo 使用 GPL-v3.0 协议开源,请遵守开源协议。

赞助

如果 Halo 对你有帮助,欢迎赞助我们,感谢以下赞助者对 Halo 项目的支持:

sponsors

贡献

参考 CONTRIBUTING

状态

Repobeats analytics