Author: vgritsenko
Date: Wed Apr 11 15:23:47 2007
New Revision: 527709
URL: http://svn.apache.org/viewvc?view=rev&rev=527709
Log:
concurrency fixes to filers from bug #42026
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java?view=diff&rev=527709&r1=527708&r2=527709
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTree.java Wed Apr
11 15:23:47 2007
@@ -63,7 +63,7 @@
* to store as many values and pointers on one page as is possible.
*
* <br>
- * This implementation supports the notion of nested roots. This means
+ * This implementation supports the notion of nested roots. This means
* that you can create a btree where the pointers actually point to the
* root of a separate btree being managed in the same file.
*
@@ -148,6 +148,19 @@
}
/**
+ * addKey adds a Value to the BTree and associates a pointer with
+ * it. The pointer can be used for referencing any type of data, it
+ * just so happens that Xindice uses it for referencing pages of
+ * associated data in the BTree file or other files.
+ *
+ * @param value The Value to add
+ * @return Pointer to the value
+ */
+ public long addKey(Value value) throws IOException, BTreeException {
+ return getRootNode().addKey(value);
+ }
+
+ /**
* addValue adds a Value to the BTree and associates a pointer with
* it. The pointer can be used for referencing any type of data, it
* just so happens that Xindice uses it for referencing pages of
@@ -625,6 +638,47 @@
}
}
return -1;
+
+ default :
+ throw new BTreeCorruptException("Invalid Page Type In
addValue");
+ }
+ }
+
+ public synchronized long addKey(Value value) throws IOException,
BTreeException {
+ if (value == null) {
+ throw new BTreeException(FaultCodes.DBE_CANNOT_CREATE, "Can't
add a null Value");
+ }
+
+ int idx = Arrays.binarySearch(values, value);
+
+ switch (ph.getStatus()) {
+ case BRANCH:
+ idx = idx < 0 ? -(idx + 1) : idx + 1;
+ return getChildNode(idx).addKey(value);
+
+ case LEAF:
+ if (idx >= 0) {
+ // Key already exists
+ return ptrs[idx];
+ } else {
+ // Value was not found
+ idx = -(idx + 1);
+
+ // Check to see if we've exhausted the block
+ boolean split = needSplit(value);
+
+ long pointer = getFreePage().getPageNum();
+ set(insertArrayValue(values, value, idx),
insertArrayLong(ptrs, pointer, idx));
+
+ if (split) {
+ split();
+ } else {
+ write();
+ }
+
+ fileHeader.incRecordCount();
+ return pointer;
+ }
default :
throw new BTreeCorruptException("Invalid Page Type In
addValue");
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java?view=diff&rev=527709&r1=527708&r2=527709
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/BTreeFiler.java
Wed Apr 11 15:23:47 2007
@@ -129,15 +129,8 @@
checkOpened();
try {
- Page p;
- try {
- long pos = findValue(key);
- p = getPage(pos);
- } catch (BTreeNotFoundException e) {
- p = getFreePage();
- addValue(key, p.getPageNum());
- fileHeader.incRecordCount();
- }
+ long pos = addKey(key);
+ Page p = getPage(pos);
BTreeFilerPageHeader ph = (BTreeFilerPageHeader) p.getPageHeader();
long t = System.currentTimeMillis();
@@ -150,6 +143,7 @@
writeValue(p, value);
flush();
} catch (IOException e) {
+ // FIXME: cleanup?
throw new FilerException(FaultCodes.DBE_CANNOT_CREATE,
"Can't write record '" + key + "': " +
e.getMessage(), e);
}
@@ -163,10 +157,8 @@
checkOpened();
try {
- long pos = findValue(key);
+ long pos = removeValue(key);
Page p = getPage(pos);
-
- removeValue(key);
unlinkPages(p);
fileHeader.decRecordCount();
Modified:
xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
URL:
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java?view=diff&rev=527709&r1=527708&r2=527709
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java Wed
Apr 11 15:23:47 2007
@@ -212,10 +212,7 @@
p = seekInsertionPage(key);
p.setKey(key);
writeValue(p, value);
- p = null;
} catch (Exception e) {
- throw new FilerException(FaultCodes.DBE_CANNOT_CREATE, "Exception:
" + e, e);
- } finally {
// FIXME It's not enough. At this point, new record could have
been added to the chain
if (p != null) {
p.getPageHeader().setStatus(DELETED);
@@ -225,6 +222,8 @@
// Double exception
}
}
+
+ throw new FilerException(FaultCodes.DBE_CANNOT_CREATE, "Exception:
" + e, e);
}
flush();