[jsword-devel] Concurrency issue?
Chris Burrell
chris at burrell.me.uk
Thu Mar 3 12:57:12 MST 2011
Actually this is a better test, since it exercises two different books (the
one in the previous email succesfully re-creates JS-109 though)
@Test
public void testConcurrencyIssueOnBookData() throws NoSuchKeyException,
BookException,
InterruptedException {
final String[] names = { "KJV", "ESV" };
final String ref = "Rom.1.1";
final Runnable r1 = new Runnable() {
@Override
public void run() {
final Book b0 = Books.installed().getBook(names[0]);
BookData bd1;
try {
bd1 = new BookData(b0, b0.getKey(ref));
bd1.getSAXEventProvider();
} catch (final NoSuchKeyException e) {
e.printStackTrace();
} catch (final BookException e) {
e.printStackTrace();
}
}
};
final Runnable r2 = new Runnable() {
@Override
public void run() {
final Book b0 = Books.installed().getBook(names[1]);
BookData bd1;
try {
bd1 = new BookData(b0, b0.getKey(ref));
bd1.getSAXEventProvider();
} catch (final NoSuchKeyException e) {
e.printStackTrace();
} catch (final BookException e) {
e.printStackTrace();
}
}
};
int ii = 0;
while (ii++ < 1000) {
final Thread t1 = new Thread(r1);
final Thread t2 = new Thread(r2);
t1.start();
t2.start();
t1.join();
t2.join();
}
}
On 3 March 2011 18:44, Chris Burrell <chris at burrell.me.uk> wrote:
> Thanks DM, I've now managed to narrow down the problem and have a unit test
> that replicates the issue:
>
> Could someone lend me a hand and run a simple junit test to test this on
> another environment? The test below fails on my laptop (java 1.6 update 22)
> with that particular error I described earlier.
>
> @Test
> public void testConcurrencyIssueOnBookData() throws NoSuchKeyException,
> BookException,
> InterruptedException {
> final String name = "KJV";
> final String ref = "Rom.1.1";
>
> final Runnable t = new Runnable() {
> @Override
> public void run() {
> final Book b0 = Books.installed().getBook(name);
> BookData bd1;
> try {
> bd1 = new BookData(b0, b0.getKey(ref));
> * bd1.getSAXEventProvider();*
> } catch (final NoSuchKeyException e) {
> e.printStackTrace();
> } catch (final BookException e) {
> e.printStackTrace();
> }
>
> }
> };
>
> int ii = 0;
> while (ii++ < 1000) {
> final Thread t1 = new Thread(t);
> final Thread t2 = new Thread(t);
> t1.start();
> t2.start();
>
> t1.join();
> t2.join();
> }
> }
>
> The issue I have in the test above occurs with this line:
> bd1.getSAXEventProvider(); (bold above)
>
> If I put a breakpoint on the call to getSAXEventProvider and let one thread
> run through things look alright. If I put it line below, I get one of three
> scenarios. (so we may be looking at a couple of bugs)
>
> 75% stacktrace as below
> 20% no text returned, or garbled text (e.g. cross refs showing in the text
> displayed when they weren't asked for...)
> 5% it works
>
> If someone could try and run it and feedback that would be helpful (running
> latest version of jsword)
> Chris
>
>
> On 28 February 2011 20:58, DM Smith <dmsmith at crosswire.org> wrote:
>
>> Chris,
>>
>> I haven't seen your problem before. However,
>>
>> The line:
>> requiredTransformation.iterator().next().getFile()
>> looks suspicious as the contract to iterator requires calling hasNext()
>> before calling next() and only calling next() when hasNext() returns true.
>>
>> The reason for this is that hasNext() typically sets up what next()
>> returns.
>>
>> Some implementations of an iterator will have the constructor setting up
>> the first value to return and having next() do double duty of setting up the
>> next value and returning the current value. In this case repeatedly calling
>> next might work.
>>
>> Also calling, iterator().next(), if calling next() without hasNext()
>> works, should only ever return the first value as the call to iterator
>> should set up a fresh iterator.
>>
>> In Him,
>> DM
>>
>>
>> On 02/27/2011 05:37 PM, Chris Burrell wrote:
>>
>> The code I'm running into issues with is here. It could well be I'm
>> mis-using the library?
>> final SAXEventProvider osissep = bookData.getSAXEventProvider();
>> TransformingSAXEventProvider htmlsep = null;
>> htmlsep = (TransformingSAXEventProvider) new Converter() {
>>
>> public SAXEventProvider convert(final SAXEventProvider
>> provider) throws TransformerException {
>> try {
>> // for now, we just assume that we'll only have
>> one option, but this may change later
>> // TODO, we can probably cache the resource
>> final TransformingSAXEventProvider tsep = new
>> TransformingSAXEventProvider(getClass()
>>
>> .getResource(requiredTransformation.iterator().next().getFile()).toURI(),
>> osissep);
>>
>> // set parameters here
>> setOptions(tsep, options, version, reference);
>> setupInterlinearOptions(tsep, interlinearVersion,
>> reference);
>> return tsep;
>> } catch (final URISyntaxException e) {
>> throw new StepInternalException("Failed to load
>> resource correctly", e);
>> }
>> }
>>
>> }.convert(osissep);
>>
>>
>> On 27 February 2011 16:52, Chris Burrell <chris at burrell.me.uk> wrote:
>>
>>> Hello...
>>>
>>> I was just wondering if someone has come across this issue before?
>>>
>>> I have two panes loading two passages (1 ESV, 1 KJV). I am getting the
>>> following issue fairly frequently. (this is different to the issue I raised
>>> quite a while ago, in that the one before was corruption in the book reading
>>> driver).
>>>
>>> Caused by: java.lang.IllegalStateException: Root element not set
>>> at org.jdom.Document.getRootElement(Document.java:218)
>>> at
>>> org.crosswire.jsword.book.filter.osis.OSISFilter.parse(OSISFilter.java:149)
>>> at
>>> org.crosswire.jsword.book.filter.osis.OSISFilter.toOSIS(OSISFilter.java:74)
>>> at
>>> org.crosswire.jsword.book.basic.AbstractPassageBook.getOsisIterator(AbstractPassageBook.java:90)
>>> at org.crosswire.jsword.book.BookData.getOsisContent(BookData.java:157)
>>> at
>>> org.crosswire.jsword.book.BookData.getOsisFragment(BookData.java:100)
>>> at
>>> org.crosswire.jsword.book.BookData.getSAXEventProvider(BookData.java:113)
>>> at
>>> com.tyndalehouse.step.core.service.impl.JSwordServiceImpl.getOsisText(JSwordServiceImpl.java:131)
>>> at
>>> com.tyndalehouse.step.core.service.impl.BibleInformationServiceImpl.getPassageText(BibleInformationServiceImpl.java:57)
>>> at
>>> com.tyndalehouse.step.rest.controllers.BibleController.getBibleText(BibleController.java:101)
>>> at
>>> com.tyndalehouse.step.rest.controllers.BibleController.getBibleText(BibleController.java:60)
>>> ... 28 more
>>>
>>> Also DM, have you started looking at JS-109? Just wondering...
>>> Chris
>>>
>>>
>>
>> _______________________________________________
>> jsword-devel mailing listjsword-devel at crosswire.orghttp://www.crosswire.org/mailman/listinfo/jsword-devel
>>
>>
>>
>> _______________________________________________
>> jsword-devel mailing list
>> jsword-devel at crosswire.org
>> http://www.crosswire.org/mailman/listinfo/jsword-devel
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/jsword-devel/attachments/20110303/c223f82c/attachment.html>
More information about the jsword-devel
mailing list