incubator-jena-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andy Seaborne (JIRA)" <>
Subject [jira] Commented: (JENA-29) cancellation during query execution
Date Wed, 16 Feb 2011 20:59:25 GMT


Andy Seaborne commented on JENA-29:

Re: 2) The use case that several groups have is to set an upper cost bound on a query issued
by SPARQL protocol through Fuseki or 
Joseki.   No server-side application specific behaviour.  In fact, if the application can
be involved, the scope for control is greater. In the case inside Fuseki, there is no application
specifc code and the default behaviour should be most appropriate for multiple use cases.

Suppose there are 100 countries in a database with their populations. The query is to find
the top 10 most populous countries, that is ORDER BY + LIMIT 10.  If the sort engine has seen
20 countries and is stopped, 10 results appear in the "do your best" case. But if China isn't
in the result, then it is going to be a surprise. 

But note also the application maybe doing "top 10", "next 10" in pages in the application
logic - ORDER BY and no LIMIT.  Simon - you described the contract for sort as "in either
S or TS, it holds that s1<=s2 according to the given ordering criteria" which is true.
But the contract goes further, item one is the max or min, the first ten are the top 10.

Choices I see are:
1/ The cancel call can take an optional argument giving the style.
2/ The hasNext/next indicates "end" but can be continued to get remaining stuff.
3/ It's a configuration setting of the execution.

Of the these, 1 or 3 tells the cancellation mechanism what is required of it in doign the
cancellation, not after the cancellation as happen in 2.  I prefer 3 as it's the earliest
point the execution plan can be informed and there's a mechanism that's already in place (e.g.
union query).

Simon - your clients can get the behaviour you currently provide them by setting the context
for the execution.

> cancellation during query execution
> -----------------------------------
>                 Key: JENA-29
>                 URL:
>             Project: Jena
>          Issue Type: Improvement
>          Components: ARQ, TDB
>            Reporter: Simon Helsen
>            Assignee: Andy Seaborne
>         Attachments: JENA-29_ARQ_r8489.patch, JENA-29_TDB_r8489.patch, JENA-29_tests_ARQ_r8489.patch,
jena.patch, jenaAddition.patch, queryIterRepeatApply.patch
> The requested improvement and proposed patch is made by Simon Helsen on behalf of IBM
> ARQ query execution currently does not have a satisfactory way to cancel a running query
in a safe way. Moreover, cancel (unlike a hard abort) is especially useful if it is able to
provide partial result sets (i.e. all the results it managed to compute up to when the cancellation
was requested). Although the exact cancellation behavior depends on the capabilities of the
underlying triple store, the proposed patch merely relies on the iterators used by ARQ.
> Here is a more detailed explanation of the proposed changes:
> 1) the cancel() method in the QueryIterator initiates a cancellation request (first boolean
flag). In analogy with closeIterator(), it propagates through all chained iterators, so the
entire calculation is aware that a cancellation is requested
> 2) to ensure a thread-safe semantics, the cancelRequest becomes a real cancel once nextBinding()
has been called. It sets the second boolean which is used in hasNext(). This 2-phase approach
is critical since the cancel() method can be called at any time during a query execution by
the external thread. And because the behavior of hasNext() is such that it has to return the
*same* value until next() is called, this is the only way to guarantee semantic safety when
cancel() is invoked (let me re-phrase this: it is the only way I was able to make it actually
> 3) cancel() does not close anything since it allows execution to finish normally and
the client is responsible to call close() just like with a regular execution. Note that the
client has to call cancel() explicitly (typically in another thread) and has to assume that
the returning result set may be incomplete if this method is called (it is undetermined whether
the result is _actually_ incomplete)
> 4) in order to deal with order-by and groups, I had to make two more changes. First,
I had to make QueryIterSort and QueryIterGroup a slightly bit more lazy. Currently, the full
result set is calculated during plan calculation. With my proposed adjustments, this full
result set is called on the first call to any of its Iterator methods (e.g. hasNext). This
change does not AFAIK affect the semantics. Second, because the desired behavior of cancelling
a sort or group query is to make sure everything is sorted/grouped even if the total result
set is not completed, I added an exception which reverses the cancellation request of the
encompassing iterator (as an example see cancel() in QueryIterSort). This makes sure that
the entire subset of found and sorted elements is returned, not just the first element. However,
it also implies in the case of sort that when a query is cancelled, it will first sort the
partially complete result set before returning to the client.
> the attached patch is based on ARQ 2.8.5 (and a few classes in TDB 0.8.7 -> possibly
the other triple store implementations need adjustement as well)

This message is automatically generated by JIRA.
For more information on JIRA, see:


View raw message