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();


Reply via email to