[ https://issues.apache.org/jira/browse/IGNITE-23430?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Maksim Zhuravkov reassigned IGNITE-23430: ----------------------------------------- Assignee: Maksim Zhuravkov > Sql. Provide an ability to cancel query before first page ready > --------------------------------------------------------------- > > Key: IGNITE-23430 > URL: https://issues.apache.org/jira/browse/IGNITE-23430 > Project: Ignite > Issue Type: Improvement > Components: sql > Reporter: Konstantin Orlov > Assignee: Maksim Zhuravkov > Priority: Major > Labels: ignite-3 > > Currently, the only possible way to cancel a query prematurely is by invoking > {{cancel()}} on a {{ResultSet}} object. The problem is the result set is > returned only when first page is ready. For statements like DML and DDL this > means that result set will be returned only when operation is complete. > Proposed solution is to introduce new pair of entities to public API: > {code:java} > /** > * A handle which may be used to request the cancellation of execution. > */ > public interface CancelHandle { > /** A factory method to create a handle. */ > static CancelHandle create() {} > /** > * Abruptly terminates an execution of an associated process. > * > * <p>Control flow will return after the process has been terminated and > the resources associated with that process have been freed. > */ > void cancel(); > /** > * Abruptly terminates an execution of a associated process. > * > * @return A future that will be completed after the process has been > terminated and the resources associated with that process have > * been freed. > */ > CompletableFuture<Void> cancelAsync(); > /** > * Flag indicating whether cancellation was requested or not. > * > * <p>This method will return true even if cancellation has not been > completed yet. > * > * @return {@code true} when cancellation was requested. > */ > boolean isCancelled(); > /** > * Issue a token associated with this handle. > * > * <p>Token is reusable, meaning the same token may be used to link > several executions into a single cancellable. > */ > CancellationToken token(); > } > public interface CancellationToken { } > {code} > Also, a new group of {{execute<*>}} methods accepting optional > {{CancellationToken}} parameter must be introduced to sql facade: > {code:java} > public interface IgniteSql { > <...> > > ResultSet<SqlRow> execute( > @Nullable Transaction transaction, > @Nullable CancellationToken cancellationToken, > String query, > @Nullable Object... arguments > ); > > <...> > } > {code} > When user need a better control over query lifecycle, they should create > handle and propagate token to the execution: > {code:java} > IgniteSql sql = <acquire sql api>; > // create cancellation handle > CancelHandle handle = CancelHandle.create(); > // propagate cancellation token to an execution > sql.executeAsync(null, handle.token(), "<query text>"); > // propagate token from the same handle to more executions, if needed > sql.executeAsync(null, handle.token(), "<query text>"); > // cancel everything at once > handle.cancel(); > {code} > Definition of Done: new entities are introduced to public API and integrated > with single statement execution flow from embedded API. -- This message was sent by Atlassian Jira (v8.20.10#820010)