[jsword-devel] [JIRA] Commented: (JS-109) Modules are not read in a thread safe way
Chris Burrell (JIRA)
jira at crosswire.org
Thu Apr 26 03:17:33 MST 2012
[ http://www.crosswire.org/bugs/browse/JS-109?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=26570#comment-26570 ]
Chris Burrell commented on JS-109:
----------------------------------
Here was the JUnit test previously shared on the list in case it helps. This test reproduces the issue:
@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) {
LOGGER.error("A jsword error during test", e);
Assert.fail("JSword bug has occured");
} catch (final BookException e) {
LOGGER.error("A jsword error during test", e);
Assert.fail("JSword bug has occured");
}
}
};
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) {
LOGGER.error("A jsword error during test", e);
Assert.fail("JSword bug has occured");
} catch (final BookException e) {
LOGGER.error("A jsword error during test", e);
Assert.fail("JSword bug has occured");
}
}
};
int ii = 0;
while (ii++ < 15) {
final Thread t1 = new Thread(r1);
final Thread t2 = new Thread(r2);
t1.start();
t2.start();
t1.join();
t2.join();
}
}
> Modules are not read in a thread safe way
> -----------------------------------------
>
> Key: JS-109
> URL: http://www.crosswire.org/bugs/browse/JS-109
> Project: JSword
> Issue Type: Bug
> Components: o.c.jsword.passage
> Affects Versions: 1.6.1
> Reporter: Chris Burrell
> Assignee: DM Smith
>
> I believe the problem is because ZVerseBackend is not thread-safe. Being a singleton, it starts sharing all its arrays declared as member variables. As a result, when two passages from the same "Book" (for e.g. KJV) are used, there is corruption, since the data read for Thread A might also be shared by Thread B!
> A few solutions I can think of:
> - do they need to be singletons? I guess it makes sense, but what is the cost involved in them being singletons? Don't know the code base well enough yet.
> - do the member variables need to member variables, or can be make them local variables? Do they share state across methods?
> - If the option above doesn't work, then synchronising the method might be worth looking at, however, in a web environment, that would potentially cause serious bottlenecks, especially if there is a default version (and default passage) that is displayed when the user brings the page up.
> Any thoughts?
> Chris
> On 7 November 2010 00:04, Chris Burrell <chris at burrell.me.uk> wrote:
> On this last note, I believe we have concurrency issues. I have a two column page, displaying one passage each. On load of the page they load up a passage each, but then this once, the passage on the right (only verse 1) has gone to the left (which was requesting just one verse but from a different passage:
> left pane: requested Acts 2:10, got Romans 1:1
> right pane: corrupt XML in verse 1, verse 2 seems to be Romans 1:2-following
> Anyone else come across those issues?
> Chris
> On 6 November 2010 20:53, Chris Burrell <chris at burrell.me.uk> wrote:
> Another question too. It seems sometimes, both in bible desktop and my current application, the html rendered is broken?
> Any ideas why that might be?
> For example, I get:
> "<div class="passageText ui-widget"><div><h2 class="heading">Acts 2:10</h2><span class="verse"><span class="w"><sup class="verseNumber">10</sup></span><span class="w"><span class="text">emma="strong:G1909" morph="robinson:PREP" src="4">upon every soul of man that doeth evil, of the Jew first, and also of the Gentile;</span></span></span> </div></div>"
> The above in bold shows that it didn't get XSLTed properly.
> Instead of "<div class="passageText ui-widget"><div><h2 class="heading">Acts 2:10</h2><span class="verse"><sup class="verseNumber">10</sup><span class="w"><span class="text"> </span> </span><span class="w"><span class="text"> </span> </span><span class="w"><span class="text">Phrygia</span></span>, <span class="w"><span class="text"> </span> </span><span class="w"><span class="text">and</span></span> <span class="w"><span class="text">Pamphylia</span></span>, <span class="w"><span class="text">in Egypt</span></span>, <span class="w"><span class="text">and</span></span> <span class="w"><span class="text">in the parts</span></span> <span class="w"><span class="text">of Libya</span></span> <span class="w"><span class="text">about</span></span> <span class="w"><span class="text">Cyrene</span></span>, <span class="w"><span class="text">and</span></span> <span class="w"><span class="text">strangers</span></span> <span class="w"><span class="text">of Rome</span></span>, <span class="w"><span class="text">Jews</span></span> <span class="w"><span class="text"> </span> </span><span class="w"><span class="text">and</span></span> <span class="w"><span class="text">proselytes</span></span>,</span> </div></div>"
> So somehow it lost a whole load on the way out of the XSLT? The only difference is that the first one is on startup of the server, the second is with a refresh in the browser. Perhaps something hasn't loaded up correctly/entirely?
> Chris
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jsword-devel
mailing list