Mulgara Project: Issueshttps://code.mulgara.org/https://code.mulgara.org/favicon.ico?15861924492008-05-19T00:46:11ZMulgara Project
Redmine Mulgara - Bug #123 (Closed): Detect deceased rmi clients and clean uphttps://code.mulgara.org/issues/1232008-05-19T00:46:11Zronald -ronald@foo.bar
<p>If an rmi client goes away (exits, is killed, whatever) while holding<br />the write lock then mulgara will stay locked up forever. One of the<br />rmi wrapper classes needs to implement <code>java.rmi.Unreferenced</code> to get<br />notified when clients disappear and needs to abort that client's<br />transaction, if any.</p>
<p>See also <a class="external" href="http://java.sun.com/j2se/1.5.0/docs/guide/rmi/faq.html#leases2">http://java.sun.com/j2se/1.5.0/docs/guide/rmi/faq.html#leases2</a> .</p>
<p>Note that <a class="issue tracker-9 status-27 priority-27 priority-high3 closed" title="Feature: Abort idle transactions on timeout (Closed)" href="https://code.mulgara.org/issues/121">#121</a> will help here, but catching the unreferenced<br />notifications has the potential to clean things up much quicker<br />because in a typical production internal network environment the rmi<br />lease timeouts can be set much lower than the transaction timeout.</p> Mulgara - Feature #122 (Closed): Support XAResource.setTransactionTimeouthttps://code.mulgara.org/issues/1222008-05-19T00:38:16Zronald -ronald@foo.bar
<p><code>MulgaraXAResource</code> currently ignores the timeout and returns false. Instead<br />it should set the underlying transaction timeout.</p>
<p>This depends on <a class="issue tracker-9 status-27 priority-27 priority-high3 closed" title="Feature: Abort idle transactions on timeout (Closed)" href="https://code.mulgara.org/issues/121">#121</a> for complete functionality.</p> Mulgara - Feature #121 (Closed): Abort idle transactions on timeouthttps://code.mulgara.org/issues/1212008-05-19T00:33:42Zronald -ronald@foo.bar
<p>If a client goes away while holding the write lock, the write lock is<br />never released, leading to mulgara being locked forever. Currently the<br />timeout "only" sets the timeout on the internal transaction manager<br />which just causes the transaction to be marked for rollback on a<br />timeout. However, setting the timeout should also start a timer which<br />is used to abort a non-active transaction (this should happened for<br />both read-write as well as read-only transactions as the latter could<br />be holding on to a phase, leading to a "memory leak").</p> Mulgara - Bug #70 (Closed): Using a database-session in multiple threads can deadlock the serverhttps://code.mulgara.org/issues/702007-09-11T10:56:51Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">We have a shutdown handler on the client that closes open sessions;
<span class="nt"><br/></span>
however, this shutdown handler is run is separate thread of its own.
<span class="nt"><br/></span>
So an abort of the client while it's doing a db operation can generate
<span class="nt"><br/></span>
the following sequence of events which leads to a deadlock:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
{noformat}
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Thread-1 Thread-2
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>set autocommit off
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>insert ... close()
<span class="nt"><br/></span>
{noformat}
<span class="nt"><br/></span>
<span class="nt"><br/></span>
(i.e. the insert and the close happen almost simultaneously). The
<span class="nt"><br/></span>
resulting stack traces are roughly:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
{noformat}
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Thread-1:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>DatabaseSession.insert()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>DatabaseSession.execute()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransaxction.execute()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransaction.deactivate() <span class="ni">&lt;</span>---- monitor held
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransaction.commitTransation()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransactionManager.transacactionComplete()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransactionManager.acquireMutex() <span class="ni">&lt;</span>--- blocked
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Thread-2:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>DatabaseSession.close()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransactionManager.rollbackCurrentTransactions()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransactionManager.acquireMutex() <span class="ni">&lt;</span>--- mutex held
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransaction.execute()
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>MulgaraTransaction.activate() <span class="ni">&lt;</span>--- blocked
<span class="nt"><br/></span>
{noformat}
<span class="nt"><br/></span>
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #48 (Closed): update results incorrect when autocommit on and multiple sessions are...https://code.mulgara.org/issues/482007-02-28T04:02:05Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The following sequence illustrates the problem:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>In first db session:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>insert <span class="ni">&lt;</span>a:foo<span class="ni">&gt;</span> <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> 'hi' into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> ;
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>insert <span class="ni">&lt;</span>a:foo<span class="ni">&gt;</span> <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> 'bye' into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> ;
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>delete select $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> where $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> ;
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>insert <span class="ni">&lt;</span>a:foo<span class="ni">&gt;</span> <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> 'blah' into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> ;
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Then in second db session:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>select $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> where $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o ;
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The final select should return a single result:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>a:foo a:bar <span class="ni">&quot;</span>blah<span class="ni">&quot;</span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
but really returns
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>a:foo a:bar <span class="ni">&quot;</span>blah<span class="ni">&quot;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>a:foo a:bar <span class="ni">&quot;</span>hi<span class="ni">&quot;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>a:foo a:bar <span class="ni">&quot;</span>bye<span class="ni">&quot;</span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
If the 'delete select' or the last 'insert' is followed by a 'set
<span class="nt"><br/></span>
autocommit on' then the result is correct. Also, if the query is done
<span class="nt"><br/></span>
in the same db session then the result is correct.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
I'm attaching two patches. The first actually does three things:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;</span>- it adds a log message when the [[TransactionalAnswer]] is cloned so
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>that all instance creations are logged (this bug was leading to
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>'TransactionalAnswer not closed' warnings for these cloned
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>instances)
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;</span>- it makes sure the query answer in a 'delete select' or 'insert
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>select' is properly closed.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;</span>- it makes sure the query answers are properly closed in
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>RelationalResolution - I noticed these while searching the code
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;</span>for other [[LocalizedTuples]] usage after finding the above problem.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The second patch is a test case for this problem: it fails with stock
<span class="nt"><br/></span>
rev <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/trac/changeset/192"</span><span class="nt">></span>192<span class="nt"></a></span>, but that succeeds with the first patch applied.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
I'm not 100% convinced that the first patch is the true solution, but
<span class="nt"><br/></span>
it does fix numerous 'TransactionalAnswer not closed' warnings and
<span class="nt"><br/></span>
does seem to work. I.e. I think it should probably be applied, but
<span class="nt"><br/></span>
something else is probably also needed.
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #44 (Closed): Error during transaction.commit() causes infinite recursion and loopinghttps://code.mulgara.org/issues/442007-02-25T09:13:24Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">This is svn head (rev <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/trac/changeset/189"</span><span class="nt">></span>189<span class="nt"></a></span>), i.e. with the new transaction code.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
Here's a small snippet of the stack when the error is triggered:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>at org.objectweb.jotm.TransactionImpl.commit(TransactionImpl.java:222)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>at org.mulgara.resolver.MulgaraTransaction.terminateTransaction(MulgaraTransaction.java:330)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>at org.mulgara.resolver.MulgaraTransaction.deactivate(MulgaraTransaction.java:154)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>at org.mulgara.resolver.MulgaraTransaction.execute(MulgaraTransaction.java:207)
<span class="nt"><br/></span>
<span class="nt"><br/></span>
If commit() throws an exception, implicitRollback() will be invoked at
<span class="nt"><br/></span>
line 333, which in turn call checkActivated() on line 262, which in
<span class="nt"><br/></span>
turn calls implicitRollback() on line 442 because inuse is 0 (from
<span class="nt"><br/></span>
deactivate()).
<span class="nt"><br/></span>
<span class="nt"><br/></span>
At this point things go horribly wrong...
<span class="nt"><br/></span>
<span class="nt"><br/></span>
An easy way to trigger this is run out of disk space where the db
<span class="nt"><br/></span>
resides (e.g. on linux create a fs on a small file and mount using the
<span class="nt"><br/></span>
loop device: 'dd if=/dev/zero of=/tmp/mdb bs=4096 count=1000',
<span class="nt"><br/></span>
'mke2fs /tmp/mdb', 'mount -o loop /tmp/mdb /mnt/disk').
<span class="nt"><br/></span>
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #41 (Closed): ItqlInterpreterBean doesn't close subanswershttps://code.mulgara.org/issues/412007-02-12T05:20:16Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">[[ItqlInterpreterBean]] does not close subanswers due to an inverted logic bug
<span class="nt"><br/></span>
in appendSolution():
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>if (tmpAnswer == null) {
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>tmpAnswer.close();
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>}
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The attached patch fixes this and cleans up the code a little (the
<span class="nt"><br/></span>
check is not needed and should therefore be removed, as all it does is
<span class="nt"><br/></span>
create the opportunity for bugs).
</code></pre> Mulgara - Bug #40 (Closed): MINUS operator fails when subtrahend is emptyhttps://code.mulgara.org/issues/402007-02-05T23:32:52Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The following simple example fails with an [[IllegalArgumentException]]
<span class="nt"><br/></span>
(<span class="ni">&quot;</span>tuples must have variables in common for subtraction to occur<span class="ni">&quot;</span>):
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>delete select $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> where $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo&gt;;"</span><span class="nt">></span>local:///topazproject#foo<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>insert <span class="ni">&lt;</span>a:foo<span class="ni">&gt;</span> <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> '0' into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo&gt;;"</span><span class="nt">></span>local:///topazproject#foo<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>select $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#foo"</span><span class="nt">></span>local:///topazproject#foo<span class="nt"></a></span><span class="ni">&gt;</span> where $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $o and $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> $x minus $s <span class="ni">&lt;</span>a:bar<span class="ni">&gt;</span> '1';
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The problem is in [[TuplesOperations]].java . Line 304,
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Set matchingVars = getMatchingVars(minuend, subtrahend);
<span class="nt"><br/></span>
<span class="nt"><br/></span>
returns a non-empty set consisting of [$s]; but the sort() call on
<span class="nt"><br/></span>
line 324 returns a truly empty tuples (line 749), which causes the
<span class="nt"><br/></span>
exception on line 103 of Difference.java because getMatchingVars()
<span class="nt"><br/></span>
now returns empty.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
Attached is a simple patch which adds an explicit check for an empty
<span class="nt"><br/></span>
minued or subtrahend.
</code></pre> Mulgara - Bug #36 (Closed): Basic query failurehttps://code.mulgara.org/issues/362006-11-20T23:50:01Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The following setup demonstrates the problem:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>drop <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test&gt;;"</span><span class="nt">></span>local:///topazproject#test<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>create <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test&gt;;"</span><span class="nt">></span>local:///topazproject#test<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>insert
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:bar<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>user:joe<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>topaz:implies<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:set<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>topaz:implies<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:get<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test&gt;;"</span><span class="nt">></span>local:///topazproject#test<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>select $s $p $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test"</span><span class="nt">></span>local:///topazproject#test<span class="nt"></a></span><span class="ni">&gt;</span> where (
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>$s $p $o
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>and ($s <span class="ni">&lt;</span>mulgara:is<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:bar<span class="ni">&gt;</span>)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>) or (
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>($s $impliedBy $o and $impliedBy <span class="ni">&lt;</span>topaz:implies<span class="ni">&gt;</span> $p)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>and ($s <span class="ni">&lt;</span>mulgara:is<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:bar<span class="ni">&gt;</span>)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>);
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>select $s $p $o from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test"</span><span class="nt">></span>local:///topazproject#test<span class="nt"></a></span><span class="ni">&gt;</span> where (
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>$s $p $o
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>or ($s $impliedBy $o and $impliedBy <span class="ni">&lt;</span>topaz:implies<span class="ni">&gt;</span> $p)
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>) and ($s <span class="ni">&lt;</span>mulgara:is<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:bar<span class="ni">&gt;</span>);
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The two queries are logically equivalent (the <span class="ni">&lt;</span>mulgara:is<span class="ni">&gt;</span> term is duplicated in the first query, and factored out in the second query). However, while the first query returns three statements, the second query only returns one. Specifically, the first query returns
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:bar<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>user:joe<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:bar<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>user:joe<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:bar<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:get<span class="ni">&gt;</span> <span class="ni">&lt;</span>user:joe<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
but the second returns only
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:bar<span class="ni">&gt;</span> <span class="ni">&lt;</span>foo:set<span class="ni">&gt;</span> <span class="ni">&lt;</span>user:joe<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #35 (Closed): the 'minus' function does not seem to be documented anywherehttps://code.mulgara.org/issues/352006-11-14T04:35:30Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">I couldn't find any mention in the docs of the 'minus' function. It would be quite useful
<span class="nt"><br/></span>
if it were properly documented.
</code></pre> Mulgara - Bug #34 (Closed): NUC-disjunction fails when one term is unconstrained.https://code.mulgara.org/issues/342006-11-14T04:02:50Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The following is a minimal example that triggers the bug:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>create <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test&gt;;"</span><span class="nt">></span>local:///topazproject#test<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>insert
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:one<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:type<span class="ni">&gt;</span> <span class="ni">&lt;</span>t:p<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:one<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:hasA<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:one<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:one<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:hasB<span class="ni">&gt;</span> 'mollusks'
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:two<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:type<span class="ni">&gt;</span> <span class="ni">&lt;</span>t:p<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:two<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:hasA<span class="ni">&gt;</span> <span class="ni">&lt;</span>bar:two<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>foo:two<span class="ni">&gt;</span> <span class="ni">&lt;</span>p:hasB<span class="ni">&gt;</span> 'mollusks'
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>into <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test&gt;;"</span><span class="nt">></span>local:///topazproject#test<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;</span>select $a $t from <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///topazproject#test"</span><span class="nt">></span>local:///topazproject#test<span class="nt"></a></span><span class="ni">&gt;</span> where
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>$b <span class="ni">&lt;</span>p:type<span class="ni">&gt;</span> <span class="ni">&lt;</span>t:p<span class="ni">&gt;</span> and
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>$b <span class="ni">&lt;</span>p:hasA<span class="ni">&gt;</span> $a and
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>(
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>($b <span class="ni">&lt;</span>p:hasB<span class="ni">&gt;</span> 'mollusks' and $t <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/mulgara#is"</span><span class="nt">></span>http://mulgara.org/mulgara#is<span class="nt"></a></span><span class="ni">&gt;</span> '0')
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>or
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>($t <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/mulgara#is"</span><span class="nt">></span>http://mulgara.org/mulgara#is<span class="nt"></a></span><span class="ni">&gt;</span> '1')
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>);
<span class="nt"><br/></span>
<span class="nt"><br/></span>
The result is
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>QueryException thrown in resolve:
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>org.mulgara.query.QueryException: Failed to resolve query
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Caused by: org.mulgara.query.TuplesException: Prefix failed to meet defined minimum prefix
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #33 (Closed): can create same model twice with different typeshttps://code.mulgara.org/issues/332006-11-13T06:59:54Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The following is accepted by mulgara:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>create <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///foo#m1&gt;;"</span><span class="nt">></span>local:///foo#m1<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>create <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///foo#m1"</span><span class="nt">></span>local:///foo#m1<span class="nt"></a></span><span class="ni">&gt;</span> <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/mulgara#XMLSchemaModel&gt;;"</span><span class="nt">></span>http://mulgara.org/mulgara#XMLSchemaModel<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
This then results in a partially unusable database, as this
<span class="nt"><br/></span>
error cannot be corrected anymore. E.g.
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>drop <span class="ni">&lt;</span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///foo#m1&gt;;"</span><span class="nt">></span>local:///foo#m1<span class="ni">&amp;</span>gt;;<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
produces the error
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Error resolving [$s $p $o $_from] from <span class="nt"><a</span> <span class="na">href=</span><span class="s">"local:///foo#m1"</span><span class="nt">></span>local:///foo#m1<span class="nt"></a></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;</span>Model 287 has more than one type!
<span class="nt"><br/></span>
<span class="nt"><br/></span>
It would be more robust if the 'create' checked that the model type
<span class="nt"><br/></span>
is the same in the case where the model already exists.
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #32 (Closed): reference to kowari class in services filehttps://code.mulgara.org/issues/322006-11-13T06:42:27Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">src/jar/dtd/META-INF/services/javax.xml.parsers.DocumentBuilderFactory
<span class="nt"><br/></span>
contains a reference to a (non-existent) kowari class. Patch:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
--------------------------------------------------------------------------
<span class="nt"><br/></span>
Index: src/jar/dtd/META-INF/services/javax.xml.parsers.DocumentBuilderFactory
<span class="nt"><br/></span>
===================================================================
<span class="nt"><br/></span>
--- src/jar/dtd/META-INF/services/javax.xml.parsers.DocumentBuilderFactory (revision <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/trac/changeset/127"</span><span class="nt">></span>127<span class="nt"></a></span>)
<span class="nt"><br/></span>
+++ src/jar/dtd/META-INF/services/javax.xml.parsers.DocumentBuilderFactory (working copy)
<span class="nt"><br/></span>
@@ -1 +1 @@
<span class="nt"><br/></span>
-org.kowari.xml.ResourceDocumentBuilderFactory
<span class="nt"><br/></span>
+org.mulgara.xml.ResourceDocumentBuilderFactory
<span class="nt"><br/></span>
--------------------------------------------------------------------------
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #29 (Closed): Apply old memory leak patchhttps://code.mulgara.org/issues/292006-10-28T06:08:06Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">The Fedora folks found and a fixed a memory leak in Kowari 1.0.5. It
<span class="nt"><br/></span>
looks like this patch is still needed. See also
<span class="nt"><br/></span>
[<span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://prototypo.blogspot.com/2005/09/kowari-memory-leak-found-and-fixed.html"</span><span class="nt">></span>http://prototypo.blogspot.com/2005/09/kowari-memory-leak-found-and-fixed.html<span class="nt"></a></span>]
<span class="nt"><br/></span>
Here is the one-line patch against Mulgara svn head:
<span class="nt"><br/></span>
<span class="nt"><br/></span>
-----------------------------------------------------------------
<span class="nt"><br/></span>
Index: src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java
<span class="nt"><br/></span>
===================================================================
<span class="nt"><br/></span>
--- src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java (revision <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://mulgara.org/trac/changeset/106"</span><span class="nt">></span>106<span class="nt"></a></span>)
<span class="nt"><br/></span>
+++ src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java (working copy)
<span class="nt"><br/></span>
@@ -1070,6 +1070,7 @@
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>public Phase() throws IOException {
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>synchronized (FreeList.this) {
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>if (currentPhase != null) {
<span class="nt"><br/></span>
+ removeClosedPhases();
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>sequenceNumber = currentPhase.sequenceNumber + 1;
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>head = currentPhase.head;
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>tail = currentPhase.tail;
<span class="nt"><br/></span>
-----------------------------------------------------------------
<span class="nt"><br/></span>
</code></pre> Mulgara - Bug #1 (Closed): ItqlInterpreterBean.execute() generates wrong result doc if more than ...https://code.mulgara.org/issues/12006-06-10T03:10:14Zronald -ronald@foo.bar
<pre>
<code class="html syntaxhl">If more than command is supplied to [[ItqlInterpreterBean]].execute() then
<span class="nt"><br/></span>
output produced looks like
<span class="nt"><br/></span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&lt;</span>answer<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>query<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>variables<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/variables<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>variables<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/variables<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>...
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/solution<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span>/query<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="ni">&nbsp;&nbsp;&lt;</span>/answer<span class="ni">&gt;</span>
<span class="nt"><br/></span>
<span class="nt"><br/></span>
i.e. all answers appear in the same <span class="ni">&quot;</span>query<span class="ni">&quot;</span> element. I think the
<span class="nt"><br/></span>
intention was that each command's output appear in a separate <span class="ni">&quot;</span>query<span class="ni">&quot;</span>
<span class="nt"><br/></span>
element. This would make more sense and be easier to parse.
<span class="nt"><br/></span>
</code></pre>