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

Andy Seaborne closed JENA-522.
------------------------------

    
> DatasetGraphWithLock claims to support multiple readers but appears not to
> --------------------------------------------------------------------------
>
>                 Key: JENA-522
>                 URL: https://issues.apache.org/jira/browse/JENA-522
>             Project: Apache Jena
>          Issue Type: Bug
>          Components: ARQ
>    Affects Versions: Jena 2.11.0
>            Reporter: Rob Vesse
>            Assignee: Andy Seaborne
>              Labels: concurrency, lock, multi-threading
>             Fix For: Jena 2.11.0
>
>         Attachments: JENA-522.patch
>
>
> This bug originates out of a StackOverflow question pertaining to jena-text
> http://stackoverflow.com/q/18385738/107591
> However upon investigation the culprit appears to be 
> {{DatasetGraphWithLock}}, reproducing my analysis from my SO answer here:
> {quote}
> The issue is that the dataset with inference implicitly uses ARQ's standard 
> in-memory Dataset implementation and this does not support transactions.
> However text datasets which correspond to {{DatasetGraphText}} internally 
> (and in your stack trace) requires the wrapped dataset to support 
> transactions and where they do not wraps them with {{DatasetGraphWithLock}}. 
> It is this that appears to be encountering the problem with the lock, the 
> documentation states that this should support multiple readers but having 
> followed the logic of the code I'm not sure that it actually allows this.
> {quote}
> I put together the following test case which illustrates the issue:
> {noformat}
>     @Test
>     public synchronized void dsg_with_lock_concurrency_02() throws 
> InterruptedException, ExecutionException, TimeoutException {
>         ExecutorService executor = Executors.newCachedThreadPool();
>         try {
>             final DatasetGraphWithLock dsg = new 
> DatasetGraphWithLock(DatasetGraphFactory.createMem());
>             Callable<Boolean> callable = new Callable<Boolean>() {
>                 @Override
>                 public Boolean call() throws Exception {
>                     // Get a read lock
>                     dsg.begin(ReadWrite.READ);
>                     // Hold the lock for a short time
>                     try {
>                         Thread.sleep(500);
>                     } catch (InterruptedException e) {
>                         // Ignore error
>                     }
>                     // Release the lock
>                     dsg.commit();
>                     return true;
>                 }
>             };
>             // Run the callable a bunch of times
>             List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
>             for (int i = 0; i < 100; i++) {
>                 futures.add(executor.submit(callable));
>             }
>             // Check all the futures come back OK
>             for (Future<Boolean> f : futures) {
>                 Assert.assertTrue(f.get(3, TimeUnit.SECONDS));
>             }
>         } finally {
>             executor.shutdownNow();
>         }
>     }
> {noformat}
> So the problem appears to be that DatasetGraphWithLock claims multi-reader 
> support but in reality does not allow this.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to