Fixed test failure caused by my last commit.

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1788 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 9a8b144..d8dcbef 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
@@ -931,66 +931,80 @@
 
         @Override
         public void add(ITupleReference tuple) throws IndexException, 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();
-            }
-
-            if (spaceUsed + spaceNeeded > leafMaxBytes) {
-                leafFrontier.lastTuple.resetByTupleIndex(leafFrame, leafFrame.getTupleCount() - 1);
-                if (verifyInput) {
-                    verifyInputTuple(tuple, leafFrontier.lastTuple);
+                // try to free space by compression
+                if (spaceUsed + spaceNeeded > leafMaxBytes) {
+                    leafFrame.compress();
+                    spaceUsed = leafFrame.getBuffer().capacity() - leafFrame.getTotalFreeSpace();
                 }
-                int splitKeySize = tupleWriter.bytesRequired(leafFrontier.lastTuple, 0, cmp.getKeyFieldCount());
-                splitKey.initData(splitKeySize);
-                tupleWriter.writeTupleFields(leafFrontier.lastTuple, 0, cmp.getKeyFieldCount(), splitKey.getBuffer()
-                        .array(), 0);
-                splitKey.getTuple().resetByTupleOffset(splitKey.getBuffer(), 0);
-                splitKey.setLeftPage(leafFrontier.pageId);
-                leafFrontier.pageId = freePageManager.getFreePage(metaFrame);
 
-                ((IBTreeLeafFrame) leafFrame).setNextLeaf(leafFrontier.pageId);
-                leafFrontier.page.releaseWriteLatch();
-                bufferCache.unpin(leafFrontier.page);
+                if (spaceUsed + spaceNeeded > leafMaxBytes) {
+                    leafFrontier.lastTuple.resetByTupleIndex(leafFrame, leafFrame.getTupleCount() - 1);
+                    if (verifyInput) {
+                        verifyInputTuple(tuple, leafFrontier.lastTuple);
+                    }
+                    int splitKeySize = tupleWriter.bytesRequired(leafFrontier.lastTuple, 0, cmp.getKeyFieldCount());
+                    splitKey.initData(splitKeySize);
+                    tupleWriter.writeTupleFields(leafFrontier.lastTuple, 0, cmp.getKeyFieldCount(), splitKey
+                            .getBuffer().array(), 0);
+                    splitKey.getTuple().resetByTupleOffset(splitKey.getBuffer(), 0);
+                    splitKey.setLeftPage(leafFrontier.pageId);
+                    leafFrontier.pageId = freePageManager.getFreePage(metaFrame);
 
-                splitKey.setRightPage(leafFrontier.pageId);
-                propagateBulk(1);
+                    ((IBTreeLeafFrame) leafFrame).setNextLeaf(leafFrontier.pageId);
+                    leafFrontier.page.releaseWriteLatch();
+                    bufferCache.unpin(leafFrontier.page);
 
-                leafFrontier.page = bufferCache
-                        .pin(BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId), true);
-                leafFrontier.page.acquireWriteLatch();
+                    splitKey.setRightPage(leafFrontier.pageId);
+                    propagateBulk(1);
+
+                    leafFrontier.page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId),
+                            true);
+                    leafFrontier.page.acquireWriteLatch();
+                    leafFrame.setPage(leafFrontier.page);
+                    leafFrame.initBuffer((byte) 0);
+                } else {
+                    if (verifyInput && leafFrame.getTupleCount() > 0) {
+                        leafFrontier.lastTuple.resetByTupleIndex(leafFrame, leafFrame.getTupleCount() - 1);
+                        verifyInputTuple(tuple, leafFrontier.lastTuple);
+                    }
+                }
+
                 leafFrame.setPage(leafFrontier.page);
-                leafFrame.initBuffer((byte) 0);
-            } else {
-            	if (verifyInput && leafFrame.getTupleCount() > 0) {   
-            		leafFrontier.lastTuple.resetByTupleIndex(leafFrame, leafFrame.getTupleCount() - 1);
-            		verifyInputTuple(tuple, leafFrontier.lastTuple);
-            	}
+                ((IBTreeLeafFrame) leafFrame).insertSorted(tuple);
+            } catch (IndexException e) {
+                handleException();
+                throw e;
+            } catch (HyracksDataException e) {
+                handleException();
+                throw e;
+            } catch (RuntimeException e) {
+                handleException();
+                throw e;
             }
-
-            leafFrame.setPage(leafFrontier.page);
-            ((IBTreeLeafFrame) leafFrame).insertSorted(tuple);
         }
 
         protected void verifyInputTuple(ITupleReference tuple, ITupleReference prevTuple) throws IndexException,
                 HyracksDataException {
             // New tuple should be strictly greater than last tuple.
             if (cmp.compare(tuple, prevTuple) != 1) {
-                // Unpin and unlatch pages.
-                for (NodeFrontier nodeFrontier : nodeFrontiers) {
-                    nodeFrontier.page.releaseWriteLatch();
-                    bufferCache.unpin(nodeFrontier.page);
-                }
                 throw new BTreeUnsortedInputException("Input stream given to BTree bulk load is not sorted.");
             }
         }
         
+        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-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index b400283..aa6ef70 100644
--- a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -431,9 +431,25 @@
 
         @Override
         public void add(ITupleReference tuple) throws IndexException, HyracksDataException {
-            bulkLoader.add(tuple);
+        	try {
+        		bulkLoader.add(tuple);
+        	} catch (IndexException e) {
+        		handleException();
+        		throw e;
+        	} catch (HyracksDataException e) {
+        		handleException();
+        		throw e;
+        	} catch (RuntimeException e) {
+                handleException();
+                throw e;
+            }
         }
 
+        protected void handleException() throws HyracksDataException {
+        	diskBTree.deactivate();
+    		diskBTree.destroy();
+        }
+        
         @Override
         public void end() throws HyracksDataException {
             bulkLoader.end();
diff --git a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexExamplesTest.java b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
index ecd3676..a93efa6 100644
--- a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
+++ b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
@@ -63,7 +63,7 @@
      * field. Fill index with random values using insertions (not bulk load).
      * Perform scans and range search.
      */
-    //@Test
+    @Test
     public void fixedLengthKeyValueExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Fixed-Length Key,Value Example.");
@@ -141,7 +141,7 @@
      * value field. Fill index with random values using insertions (not bulk
      * load) Perform scans and range search.
      */
-    //@Test
+    @Test
     public void twoFixedLengthKeysOneFixedLengthValueExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Composite Key Test");
@@ -222,7 +222,7 @@
      * field and one variable-length value field. Fill BTree with random values
      * using insertions (not bulk load) Perform ordered scans and range search.
      */
-    //@Test
+    @Test
     public void varLenKeyValueExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Variable-Length Key,Value Example");
@@ -302,7 +302,7 @@
      * value field. Fill B-tree with random values using insertions, then delete
      * entries one-by-one. Repeat procedure a few times on same BTree.
      */
-    //@Test
+    @Test
     public void deleteExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Deletion Example");
@@ -404,7 +404,7 @@
      * value field. Fill B-tree with random values using insertions, then update
      * entries one-by-one. Repeat procedure a few times on same BTree.
      */
-    //@Test
+    @Test
     public void updateExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Update example");
@@ -490,7 +490,7 @@
      * Load a tree with 100,000 tuples. BTree has a composite key to "simulate"
      * non-unique index creation.
      */
-    //@Test
+    @Test
     public void bulkLoadExample() throws Exception {
         if (LOGGER.isLoggable(Level.INFO)) {
             LOGGER.info("Bulk load example");