eXist 1.4 final is out!

After another 2 months of hard work or 412 revisions later, we are proud to release eXist 1.4 (codename: Eindhoven) today. Changes since the release candidate include some performance-critical fixes to the collection and nodes caching, as well as improvements in the Lucene index and other extension modules. Based on user feedback, the URL rewriting and MVC framework has been extended to adopt it to more complex real-world scenarios. Examples and documentation have been greatly enhanced.

The release also features experimental support for server-side debugging of XQuery scripts based on the dbgp protocol. The debugger is still a bit limited on the client side (we used emacs and vi since they already implement dbgp), but otherwise usable. We're looking forward to provide a complete implementation in 1.4.1 and would like encourage users to help us testing in the meantime.

For the main features of 1.4, please refer to the previous release note or the press summary.

We would like to thank all committers and users who made this possible. In particular, we had lots of people testing the release, checking the documentation or suggesting fixes. Thanks for your contribution!

We highly recommend that users of 1.2 upgrade to 1.4 after they have tested this release. In 1.4, eXist’s XQuery engine has been redesigned to improve the processing of queries against in-memory documents. This has been causing many issues on 1.2.

1.4 Release Candidate

We are happy to announce a release candidate for eXist version 1.4 is now available for download. The final release should follow soon after, and will supersede the current 1.2 series as the stable branch.

Among many other things, the 1.4 release features:

  • Faster, feature rich full text indexing. This is based on Apache Lucene which has been transparently integrated into the XQuery engine and works well with other modules in eXist, e.g. match highlighting and KWIC display.
  • Support for XProc and easier integration of XForms (via XSLTForms).
  • Documentation - many improvements and additions, including better XQuery function documentation.

However, the most important change of this release is behind the scenes – eXist’s XQuery engine has been redesigned to improve the processing of queries against in-memory documents. This has been the major bottleneck of the 1.2.x series; Experience shows that many applications will benefit from the newly redesigned core. Additionally there have been many small optimizations to the query engine, thus enabling eXist to further optimise its use of indexes or avoid unnecessary steps when evaluating positional predicates.

Please have a look at the Upgrade Guide before installing the new version. N.B. –Several important default settings have changed!

eXist 1.2.6 Maintenance Release

eXist 1.2.6 is another maintenance release, containing fixes for critical stability issues we found while working on the 1.3 branch. Important changes include:

  • automatic document defragmentation could have unpredictable results if nodes were updated during a query
  • Java service wrapper sometimes killed eXist too early, causing corruptions in the db (see )
  • fixed db corruption after crash recovery
  • query optimizer in some cases failed to analyze called functions, thus causing bad performance
  • fixed evaluation of positional predicates with a //n abbreviated step (which translates to /desendant-or-self::node()/n)

Like all releases in the 1.2.x series, eXist 1.2.6 is not meant to introduce new features (those are reserved for 1.3/1.4). The only new feature in 1.2.6 is support for incremental backups.

I will now continue to wrap up 1.3. We still lack documentation and there are a few regressions to fix before 1.3 can be handed out.

Java Service Wrapper Issues

I recently had some problems with a Windows server running eXist trunk as a service. The service restarted a few times during the day (mainly due to memory issues which have been fixed since then). However, eXist did not get online again after the first restart. What happened?

The Java service wrapper has a timeout: when launching a new JVM, it will only wait for a certain time for the newly started process to respond. If it doesn't respond within that timeframe, the wrapper will assume that something went wrong and kills the process. It then starts the next attempt.

Now, during the first restart, eXist detected that it wasn't terminated cleanly. It thus triggered a recovery run, which also involved a reindex. This all happened within the service startup method, and since the reindex took longer than 60 seconds, the service wrapper timed out and killed eXist. During the next restart, eXist would again start the recovery - and get killed again! The wrapper never gave it enough time to get up. Even worse, crashing eXist during the recovery phase can cause serious damage to the database files.

We have now introduced a callback mechanism which can be used by the service wrapper to communicate with eXist. eXist will periodically send a signal to the wrapper while it's starting up or shutting down. The wrapper will extend its timeouts accordingly.

The required changes are available in SVN trunk and have also been ported back to the eXist-stable-1.2 branch (which is the basis of all 1.2.x releases). If you experience corruptions after a service restart, please consider an update. We are also thinking about a 1.2.6 release.

TwitterReader.jpg

Kurt Cagle today published an article on DevX.com: "From Social to Serious: Combining Twitter and RESTful Web Services". Using the implementation of a twitter reader as an example, the article demonstrates how to build a RESTful data application. It covers many topics along the way, including request routing and XProc.

Note: if you are using the trunk version of eXist, you may want to look at XQueryURLRewrite, which is the successor of the RedirectorServlet used by Kurt.