You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "Benoit Tellier (Jira)" <se...@james.apache.org> on 2022/08/20 06:17:00 UTC

[jira] [Closed] (JAMES-3779) Tasks are doing seaky blocking calls

     [ https://issues.apache.org/jira/browse/JAMES-3779?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Benoit Tellier closed JAMES-3779.
---------------------------------
    Resolution: Fixed

Done

> Tasks are doing seaky blocking calls
> ------------------------------------
>
>                 Key: JAMES-3779
>                 URL: https://issues.apache.org/jira/browse/JAMES-3779
>             Project: James Server
>          Issue Type: Bug
>          Components: cassandra, task
>            Reporter: Benoit Tellier
>            Priority: Major
>
> h2. What is the problem
> h4. Blocking call into Task constructor
> Some of our tasks do blocking calls into their constructors.
> Example:
> {code:java}
>     public ClearMailRepositoryTask(List<MailRepository> mailRepositories, MailRepositoryPath path) {
>         this.mailRepositories = mailRepositories;
>         this.mailRepositoryPath = path;
>         this.initialCount = getRemainingSize(); // blocking
>     }
> {code}
> Logic into constructor:
>  - Is clearly an anti-pattern
>  - This stuff get's deserialized so we should be really careful with what get's into the constructor
>  - We don't expect blocking calls when deserializing
> We should get rid of all those blocking calls into constructors.
> h4. Blocking calls when generating task details
> We might need to do backend calls when generating task details, eg querying the DB to know how much records remains.
> The issue here is that those blocking calls are 'hidden'. We should enable tasks to expose a publisher for getting their details, allowing to wrap "on demand" their details.
> {code:java}
> interface Task {
>     default Optional<TaskExecutionDetails.AdditionalInformation> details() {
>         return Optional.empty();
>     }
>     default Publisher<TaskExecutionDetails.AdditionalInformation> detailsReactive() {
>         return Mono.fromCallable(() -> details)
>             .handle(ReactorUtils::publishIfPresent);
>     }
> }
> {code}
> This would enable:
>   - To preserve the non blocking chain
>   - To wrap blocking calls only where needed.
> h3. Why is this needed?
> The Cassandra driver 4 work highlighted the limitation of our task system. We got away with quick fixes but a little redesign will get this sorted.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org