Added exception handling in the rtree bulkload, to release all latches in case the bulkload failed. The btree bulkload already does that.

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@2554 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
index 0d8be60..d825b89 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
@@ -997,14 +997,6 @@
             }
         }
 
-        protected void handleException() throws HyracksDataException {
-            // Unlatch and unpin pages.
-            for (NodeFrontier nodeFrontier : nodeFrontiers) {
-                nodeFrontier.page.releaseWriteLatch();
-                bufferCache.unpin(nodeFrontier.page);
-            }
-        }
-
         protected void propagateBulk(int level) throws HyracksDataException {
             if (splitKey.getBuffer() == null)
                 return;
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/impls/AbstractTreeIndex.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/impls/AbstractTreeIndex.java
index c1ed1ce..9bf4a4f 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/impls/AbstractTreeIndex.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/impls/AbstractTreeIndex.java
@@ -289,6 +289,14 @@
 

         public abstract void add(ITupleReference tuple) throws IndexException, HyracksDataException;

 

+        protected void handleException() throws HyracksDataException {

+            // Unlatch and unpin pages.

+            for (NodeFrontier nodeFrontier : nodeFrontiers) {

+                nodeFrontier.page.releaseWriteLatch();

+                bufferCache.unpin(nodeFrontier.page);

+            }

+        }

+

         @Override

         public void end() throws HyracksDataException {

             // copy the root generated from the bulk-load to *the* root page location

diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
index f8e8c0a..e39ab50 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
@@ -870,34 +870,43 @@
 
         @Override
         public void add(ITupleReference tuple) throws HyracksDataException {
-            NodeFrontier leafFrontier = nodeFrontiers.get(0);
+            try {
+                NodeFrontier leafFrontier = nodeFrontiers.get(0);
 
-            int spaceNeeded = tupleWriter.bytesRequired(tuple) + slotSize;
-            int spaceUsed = leafFrame.getBuffer().capacity() - leafFrame.getTotalFreeSpace();
+                int spaceNeeded = tupleWriter.bytesRequired(tuple) + slotSize;
+                int spaceUsed = leafFrame.getBuffer().capacity() - leafFrame.getTotalFreeSpace();
 
-            // try to free space by compression
-            if (spaceUsed + spaceNeeded > leafMaxBytes) {
-                leafFrame.compress();
-                spaceUsed = leafFrame.getBuffer().capacity() - leafFrame.getTotalFreeSpace();
-            }
+                // try to free space by compression
+                if (spaceUsed + spaceNeeded > leafMaxBytes) {
+                    leafFrame.compress();
+                    spaceUsed = leafFrame.getBuffer().capacity() - leafFrame.getTotalFreeSpace();
+                }
 
-            if (spaceUsed + spaceNeeded > leafMaxBytes) {
-                propagateBulk(1, false);
+                if (spaceUsed + spaceNeeded > leafMaxBytes) {
+                    propagateBulk(1, false);
 
-                leafFrontier.pageId = freePageManager.getFreePage(metaFrame);
+                    leafFrontier.pageId = freePageManager.getFreePage(metaFrame);
 
-                leafFrontier.page.releaseWriteLatch();
-                bufferCache.unpin(leafFrontier.page);
+                    leafFrontier.page.releaseWriteLatch();
+                    bufferCache.unpin(leafFrontier.page);
 
-                leafFrontier.page = bufferCache
-                        .pin(BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId), true);
-                leafFrontier.page.acquireWriteLatch();
+                    leafFrontier.page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId),
+                            true);
+                    leafFrontier.page.acquireWriteLatch();
+                    leafFrame.setPage(leafFrontier.page);
+                    leafFrame.initBuffer((byte) 0);
+                }
+
                 leafFrame.setPage(leafFrontier.page);
-                leafFrame.initBuffer((byte) 0);
+                leafFrame.insert(tuple, -1);
+            } catch (HyracksDataException e) {
+                handleException();
+                throw e;
+            } catch (RuntimeException e) {
+                handleException();
+                throw e;
             }
 
-            leafFrame.setPage(leafFrontier.page);
-            leafFrame.insert(tuple, -1);
         }
 
         public void end() throws HyracksDataException {