default <T> CompletionStage<T> makeContextAware(CompletionStage<T> stage) {
        requireNonNull(stage, "stage");
        if (stage instanceof ContextHolder) {
            final RequestContext context = ((ContextHolder) stage).context();
            if (this == context) {
                return stage;
            }
            if (root() != context.root()) {
                throw new IllegalArgumentException(
                        "cannot create a context aware future using " + stage);
            }
        }
        final CompletableFuture<T> future = JavaVersionSpecific.get().newContextAwareFuture(this);
        stage.handle((result, cause) -> {
            try (SafeCloseable ignored = push()) {
                if (cause != null) {
                    future.completeExceptionally(cause);
                } else {
                    future.complete(result);
                }
            } catch (Throwable t) {
                future.completeExceptionally(t);
            }
            return null;
        });
        return future;
    }
Returns a {@link CompletionStage} that makes sure the current {@link RequestContext} is set and
then invokes the input {@code stage}.
core/src/main/java/com/linecorp/armeria/common/RequestContext.java