You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by vg...@apache.org on 2005/12/15 22:55:13 UTC
svn commit: r357076 - in /xml/xindice/trunk:
java/src/org/apache/xindice/core/Collection.java
java/src/org/apache/xindice/core/Database.java status.xml
Author: vgritsenko
Date: Thu Dec 15 13:55:05 2005
New Revision: 357076
URL: http://svn.apache.org/viewcvs?rev=357076&view=rev
Log:
Make an attempt to lock a database before opening it up.
Prevents opening up same database by different processes,
resulting in database corruption.
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java
xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java
xml/xindice/trunk/status.xml
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java
URL: http://svn.apache.org/viewcvs/xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java?rev=357076&r1=357075&r2=357076&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java Thu Dec 15 13:55:05 2005
@@ -68,7 +68,8 @@
*
* @version CVS $Revision$, $Date$
*/
-public class Collection extends CollectionManager implements Named, DBObject, Configurable {
+public class Collection extends CollectionManager
+ implements Named, DBObject, Configurable {
private static final Log log = LogFactory.getLog(Collection.class);
@@ -1414,7 +1415,6 @@
}
try {
filer = (Filer) Class.forName(className).newInstance();
- // filer.setCollection(this);
filer.setLocation(getCollectionRoot(), getName());
filer.setConfig(filerConfig);
if (!filer.exists()) {
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java
URL: http://svn.apache.org/viewcvs/xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java?rev=357076&r1=357075&r2=357076&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java Thu Dec 15 13:55:05 2005
@@ -20,7 +20,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-// import org.apache.xindice.core.meta.TimeRecord;
import org.apache.xindice.core.query.QueryEngine;
import org.apache.xindice.server.Xindice;
import org.apache.xindice.util.Configuration;
@@ -33,8 +32,11 @@
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -49,6 +51,7 @@
public static final String DBROOT = "dbroot";
public static final String NAME = "name";
+
private static final String QUERYENGINE = "queryengine";
private static final String COLKEY = "database.xml";
private static final String DATABASE = "database";
@@ -126,18 +129,27 @@
}
}
+
//
// Instance...
//
- private DocumentCache docCache = new DocumentCache();
- private QueryEngine engine = new QueryEngine(this);
- private boolean metaEnabled = false;
- private boolean metaInit = false;
- private MetaSystemCollection metaSystemCollection = null;
- private boolean sysInit = false;
- private SystemCollection systemCollection = null;
+
+ private DocumentCache docCache;
+ private QueryEngine engine;
+ private boolean metaEnabled;
+ private boolean metaInit;
+ private MetaSystemCollection metaSystemCollection;
+ private boolean sysInit;
+ private SystemCollection systemCollection;
+ private FileOutputStream lock;
+ public Database() {
+ super();
+ this.docCache = new DocumentCache();
+ this.engine = new QueryEngine(this);
+ }
+
/**
* @see org.apache.xindice.core.DBObject#close()
*/
@@ -149,6 +161,14 @@
flushConfig();
super.close();
+ // Release database lock
+ try {
+ this.lock.close();
+ } catch (IOException e) {
+ // Ignore IO exception
+ }
+ this.lock = null;
+
synchronized (databases) {
databases.remove(getName());
}
@@ -230,9 +250,11 @@
* @see org.apache.xindice.util.Configurable#setConfig(org.apache.xindice.util.Configuration)
*/
public void setConfig(Configuration config) throws XindiceException {
+ // FIXME Get rid of super.setConfig here?
super.setConfig(config);
setCanonicalName('/' + getName());
+ // Determine database root directory
String dbroot = config.getAttribute(DBROOT);
File dbrootDir = new File(dbroot);
if (!dbrootDir.isAbsolute()) {
@@ -256,12 +278,27 @@
throw new XindiceException("Can't get canonical path", e);
}
}
-
setCollectionRoot(dbrootDir);
if (log.isInfoEnabled()) {
log.info("Database points to " + dbrootDir.getAbsolutePath());
}
+ // Put a lock (at least attempt to) on the database
+ // FIXME: Use JDK1.4 FileLock
+ File lock = new File(getCollectionRoot(), "db.lock");
+ try {
+ if (lock.exists() && !lock.delete()) {
+ throw new IOException("Could not delete lock file.");
+ }
+ this.lock = new FileOutputStream(lock);
+ this.lock.write(new Date().toString().getBytes());
+ } catch (IOException e) {
+ throw new XindiceException("Unable to open lock file " + lock + ". " +
+ "Make sure database is not open by another process. " +
+ "Exception: " + e);
+ }
+
+ // Initialize query engine
try {
Configuration queryCfg = config.getChild(QUERYENGINE);
if (queryCfg != null) {
@@ -273,6 +310,7 @@
}
}
+ // Initialize system collection
if (!sysInit) {
systemCollection = new SystemCollection(this);
systemCollection.init();
Modified: xml/xindice/trunk/status.xml
URL: http://svn.apache.org/viewcvs/xml/xindice/trunk/status.xml?rev=357076&r1=357075&r2=357076&view=diff
==============================================================================
--- xml/xindice/trunk/status.xml (original)
+++ xml/xindice/trunk/status.xml Thu Dec 15 13:55:05 2005
@@ -73,7 +73,12 @@
</todo>
<changes>
- <release version="1.1b5-dev" date="May 25 2005">
+ <release version="1.1b5-dev" date="Dec 15 2005">
+ <action dev="VG" type="update">
+ Make an attempt to lock a database before opening it up.
+ Prevents opening up same database by different processes,
+ resulting in database corruption.
+ </action>
<action dev="VG" type="fix" fixes-bug="30878" due-to="Todd Byrne">
Make sure that XUpdate commands are run only once per document.
In case XUpdate command does not complete successfully, revert