This is the voting thread for PIP-149. It will stay open for at least 48
hours.

https://github.com/apache/pulsar/issues/14365

Pasted below for quoting convenience.

-----

Motivation

The Rest API was originally designed to be implemented asynchronously, but
with the iteration of functions, some synchronous implementations were
added, resulting in many asynchronous methods called synchronous
implementations. Also, many synchronous calls do not add timeouts. This
greatly reduces concurrency, user operations, and experience.
In order to prevent more problems, and improve code readability and
maintainability, we intend to refactor these synchronous calls and
standardize the implementation of the API.

Related discussion:
https://lists.apache.org/thread/pkkz2jgwtzpksp6d4rdm1pyxzb3z6vmg

Goals

Try to avoid synchronous method calls in asynchronous methods.
Async variable (AsyncResponse) is placed in the first parameter position.
Async variable (AsyncResponse) cannot be substituted into method
implementations.
Add more tests and increase the coverage.
Modification
Avoid synchronous method calls in asynchronous methods.

protected void internalDeleteNamespace(boolean authoritative) {
   validateTenantOperation(namespaceName.getTenant(),
TenantOperation.DELETE_NAMESPACE);
   validatePoliciesReadOnlyAccess();
}
Suggest to do like this:

protected CompletableFuture<Void> internalDeleteNamespace(boolean
authoritative) {
    return validateTenantOperationAsync(namespaceName.getTenant(),
TenantOperation.DELETE_NAMESPACE)
   .thenCompose(__ -> validatePoliciesReadOnlyAccessAsync());
}
Async variable (AsyncResponse) is placed in the first parameter position

public void deleteNamespace(@Suspended final AsyncResponse asyncResponse,
         @PathParam("tenant") String tenant,
         @PathParam("namespace") String namespace,
         @QueryParam("force") @DefaultValue("false") boolean force,
         @QueryParam("authoritative") @DefaultValue("false") boolean
authoritative) {

Async variable (AsyncResponse) cannot be substituted into method
implementations

internalCreateNonPartitionedTopicAsync(asyncResponse, authoritative,
properties);
Suggest to do like this:

internalCreateNonPartitionedTopicAsync(authoritative, properties)
        .thenAccept(__ ->
asyncResponse.resume(Response.noContent().build()))
        .exceptionally(ex -> {
            resumeAsyncResponseExceptionally(asyncResponse, ex.getCause());
            return null;
        });

Task tracking
In order to unify the modification and track the modified part, it's better
to open an issue to track, like #14353, #14013, #13854.

---
Best,
Mattison

Reply via email to