[NO ISSUE][STO] Add a callback on recycling of memory components

- user model changes: no
- storage format changes: no
- interface change: yes
  - ILSMIOOperationCallbackFactory.createIoOpCallback now takes
    the ILSMIndex as a parameter.
  - Remove ILSMIOOperationCallback.setNumOfMutableComponents
    The callback can find out the number of mutable components
    on instantiation since the lsm index is now passed.
  - ILSMIOOperationCallback.allocated was added.
    It gets called whenever a memory component is allocated.
  - ILSMIOOperationCallback.recycled was added.
    It gets called whenever a memory component is recycled.
  - ILSMIndex.hasMemoryComponent is replaced with
    ILSMIndex.getNumberOfMemoryComponents

Change-Id: I578ffd7ef17784034c94f3c0d23cd5094e39f6e0
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2126
Sonar-Qube: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Contrib: Jenkins <[email protected]>
Integration-Tests: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/e32cb676
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/e32cb676
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/e32cb676

Branch: refs/heads/master
Commit: e32cb6765387061baa3ff5cc6ff14b65b6533dbd
Parents: 76d24d4
Author: Abdullah Alamoudi <[email protected]>
Authored: Mon Nov 6 11:30:25 2017 -0800
Committer: abdullah alamoudi <[email protected]>
Committed: Mon Nov 6 15:14:57 2017 -0800

----------------------------------------------------------------------
 .../TestLsmBtreeIoOpCallbackFactory.java        |  9 +++--
 .../common/context/DatasetLifecycleManager.java | 15 ++++----
 .../asterix/common/context/DatasetResource.java | 11 +++---
 .../AbstractLSMIOOperationCallback.java         | 36 +++++++++++++-------
 .../LSMBTreeIOOperationCallback.java            |  5 +--
 .../LSMBTreeIOOperationCallbackFactory.java     |  5 +--
 .../LSMBTreeWithBuddyIOOperationCallback.java   |  5 +++
 ...TreeWithBuddyIOOperationCallbackFactory.java |  5 +--
 .../LSMInvertedIndexIOOperationCallback.java    |  5 +--
 ...InvertedIndexIOOperationCallbackFactory.java |  5 +--
 .../LSMRTreeIOOperationCallback.java            |  5 +--
 .../LSMRTreeIOOperationCallbackFactory.java     |  5 +--
 .../LSMBTreeIOOperationCallbackTest.java        | 11 +++---
 ...SMBTreeWithBuddyIOOperationCallbackTest.java | 11 +++---
 ...LSMInvertedIndexIOOperationCallbackTest.java | 11 +++---
 .../LSMRTreeIOOperationCallbackTest.java        | 11 +++---
 .../am/common/impls/AbstractTreeIndex.java      |  5 ---
 .../dataflow/ExternalBTreeLocalResource.java    |  2 +-
 .../ExternalBTreeWithBuddyLocalResource.java    |  2 +-
 .../btree/dataflow/LSMBTreeLocalResource.java   |  4 +--
 .../am/lsm/btree/impls/ExternalBTree.java       | 12 +++----
 .../lsm/btree/impls/ExternalBTreeWithBuddy.java | 10 ++----
 .../storage/am/lsm/btree/impls/LSMBTree.java    | 20 +++++------
 .../btree/impls/LSMBTreeMemoryComponent.java    |  5 +--
 .../impls/LSMBTreeWithBuddyMemoryComponent.java |  9 ++---
 .../am/lsm/btree/utils/LSMBTreeUtil.java        | 19 ++++++-----
 .../AbstractLSMWithBuddyMemoryComponent.java    |  6 ++--
 .../lsm/common/api/ILSMIOOperationCallback.java | 16 ++++++++-
 .../api/ILSMIOOperationCallbackFactory.java     |  2 +-
 .../storage/am/lsm/common/api/ILSMIndex.java    |  5 +++
 .../lsm/common/impls/AbstractLSMComponent.java  |  4 ++-
 .../common/impls/AbstractLSMDiskComponent.java  |  4 +--
 .../am/lsm/common/impls/AbstractLSMIndex.java   | 17 ++++-----
 .../impls/AbstractLSMMemoryComponent.java       |  6 ++--
 .../BlockingIOOperationCallbackWrapper.java     | 10 ++++--
 .../storage/am/lsm/common/impls/LSMHarness.java | 13 ++++---
 .../impls/NoOpIOOperationCallbackFactory.java   | 12 +++++--
 .../common/impls/StubIOOperationCallback.java   | 20 +++++++----
 .../lsm/common/impls/ThreadCountingTracker.java |  2 +-
 .../dataflow/LSMInvertedIndexLocalResource.java | 12 +++----
 .../invertedindex/impls/LSMInvertedIndex.java   | 21 ++++++------
 .../impls/LSMInvertedIndexMemoryComponent.java  |  8 ++---
 .../impls/PartitionedLSMInvertedIndex.java      | 14 ++++----
 .../inmemory/InMemoryInvertedIndex.java         |  5 ---
 .../ondisk/OnDiskInvertedIndex.java             |  5 ---
 .../invertedindex/util/InvertedIndexUtils.java  | 22 ++++++------
 .../dataflow/ExternalRTreeLocalResource.java    |  2 +-
 .../rtree/dataflow/LSMRTreeLocalResource.java   |  4 +--
 .../LSMRTreeWithAntiMatterLocalResource.java    |  4 +--
 .../am/lsm/rtree/impls/AbstractLSMRTree.java    | 14 ++++----
 .../am/lsm/rtree/impls/ExternalRTree.java       | 13 +++----
 .../storage/am/lsm/rtree/impls/LSMRTree.java    | 16 +++++----
 .../rtree/impls/LSMRTreeMemoryComponent.java    |  8 ++---
 .../impls/LSMRTreeWithAntiMatterTuples.java     |  8 ++---
 .../am/lsm/rtree/utils/LSMRTreeUtils.java       | 27 ++++++++-------
 .../apache/hyracks/storage/common/IIndex.java   |  7 ++--
 .../am/lsm/btree/LSMBTreeBulkLoadTest.java      |  4 +--
 .../am/lsm/btree/LSMBTreeDeleteTest.java        |  4 +--
 .../am/lsm/btree/LSMBTreeExamplesTest.java      |  2 +-
 .../am/lsm/btree/LSMBTreeFileManagerTest.java   |  8 ++---
 .../am/lsm/btree/LSMBTreeFilterMergeTest.java   |  4 +--
 .../btree/LSMBTreeFilterMergeTestDriver.java    |  3 +-
 .../am/lsm/btree/LSMBTreeInsertTest.java        |  4 +--
 .../am/lsm/btree/LSMBTreeLifecycleTest.java     |  4 +--
 .../storage/am/lsm/btree/LSMBTreeMergeTest.java |  4 +--
 .../am/lsm/btree/LSMBTreeMergeTestDriver.java   |  3 +-
 ...MBTreeModificationOperationCallbackTest.java | 10 +++---
 .../am/lsm/btree/LSMBTreeMultiBulkLoadTest.java |  4 +--
 .../btree/LSMBTreeScanDiskComponentsTest.java   | 15 ++++----
 .../LSMBTreeSearchOperationCallbackTest.java    |  2 +-
 ...TreeUpdateInPlaceScanDiskComponentsTest.java | 11 +++---
 .../am/lsm/btree/LSMBTreeUpdateInPlaceTest.java |  9 +++--
 .../am/lsm/btree/LSMBTreeUpdateTest.java        |  4 +--
 .../storage/am/lsm/btree/impl/TestLsmBtree.java |  9 ++---
 .../btree/impl/TestLsmBtreeLocalResource.java   |  4 +--
 .../am/lsm/btree/impl/TestLsmBtreeUtil.java     |  6 ++--
 .../multithread/LSMBTreeMultiThreadTest.java    |  4 +--
 .../btree/multithread/LSMBTreeTestWorker.java   |  5 +--
 .../am/lsm/btree/perf/LSMTreeRunner.java        |  6 ++--
 .../am/lsm/btree/util/LSMBTreeTestContext.java  | 10 +++---
 .../am/lsm/btree/util/LSMBTreeTestHarness.java  | 10 +++---
 .../LSMInvertedIndexMergeTest.java              |  3 +-
 .../PartitionedLSMInvertedIndexMergeTest.java   |  3 +-
 .../common/LSMInvertedIndexTestHarness.java     | 10 +++---
 .../multithread/LSMInvertedIndexTestWorker.java |  4 +--
 .../util/LSMInvertedIndexTestContext.java       | 14 ++++----
 .../am/lsm/rtree/LSMRTreeBulkLoadTest.java      |  2 +-
 .../am/lsm/rtree/LSMRTreeDeleteTest.java        |  2 +-
 .../am/lsm/rtree/LSMRTreeExamplesTest.java      |  2 +-
 .../am/lsm/rtree/LSMRTreeInsertTest.java        |  2 +-
 .../am/lsm/rtree/LSMRTreeLifecycleTest.java     |  2 +-
 .../storage/am/lsm/rtree/LSMRTreeMergeTest.java |  2 +-
 .../am/lsm/rtree/LSMRTreeMergeTestDriver.java   |  3 +-
 ...SMRTreeWithAntiMatterTuplesBulkLoadTest.java |  2 +-
 .../LSMRTreeWithAntiMatterTuplesDeleteTest.java |  2 +-
 ...SMRTreeWithAntiMatterTuplesExamplesTest.java |  2 +-
 .../LSMRTreeWithAntiMatterTuplesInsertTest.java |  2 +-
 ...MRTreeWithAntiMatterTuplesLifecycleTest.java |  2 +-
 .../LSMRTreeWithAntiMatterTuplesMergeTest.java  |  2 +-
 .../multithread/LSMRTreeMultiThreadTest.java    |  2 +-
 .../rtree/multithread/LSMRTreeTestWorker.java   |  4 +--
 ...TreeWithAntiMatterTuplesMultiThreadTest.java |  2 +-
 .../LSMRTreeWithAntiMatterTuplesTestWorker.java |  3 +-
 .../am/lsm/rtree/util/LSMRTreeTestContext.java  |  6 ++--
 .../am/lsm/rtree/util/LSMRTreeTestHarness.java  | 10 +++---
 ...LSMRTreeWithAntiMatterTuplesTestContext.java |  9 ++---
 106 files changed, 420 insertions(+), 376 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
index 1bec41e..327c66e 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
@@ -22,6 +22,7 @@ import 
org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.EmptyComponent;
 
@@ -41,7 +42,7 @@ public class TestLsmBtreeIoOpCallbackFactory implements 
ILSMIOOperationCallbackF
     }
 
     @Override
-    public synchronized ILSMIOOperationCallback createIoOpCallback() {
+    public synchronized ILSMIOOperationCallback createIoOpCallback(ILSMIndex 
index) {
         completedFlushes = 0;
         completedMerges = 0;
         rollbackFlushes = 0;
@@ -49,7 +50,7 @@ public class TestLsmBtreeIoOpCallbackFactory implements 
ILSMIOOperationCallbackF
         // Whenever this is called, it resets the counter
         // However, the counters for the failed operations are never reset 
since we expect them
         // To be always 0
-        return new TestLsmBtreeIoOpCallback();
+        return new TestLsmBtreeIoOpCallback(index);
     }
 
     public int getTotalFlushes() {
@@ -89,6 +90,10 @@ public class TestLsmBtreeIoOpCallbackFactory implements 
ILSMIOOperationCallbackF
     }
 
     public class TestLsmBtreeIoOpCallback extends LSMBTreeIOOperationCallback {
+        public TestLsmBtreeIoOpCallback(ILSMIndex index) {
+            super(index);
+        }
+
         @Override
         public void afterFinalize(LSMOperationType opType, ILSMDiskComponent 
newComponent) {
             super.afterFinalize(opType, newComponent);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
index c53af3e..c4cd791 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
@@ -101,7 +101,7 @@ public class DatasetLifecycleManager implements 
IDatasetLifecycleManager, ILifeC
         if (datasetResource == null) {
             datasetResource = getDatasetLifecycle(did);
         }
-        datasetResource.register(resource, index);
+        datasetResource.register(resource, (ILSMIndex) index);
     }
 
     private int getDIDfromResourcePath(String resourcePath) throws 
HyracksDataException {
@@ -141,8 +141,8 @@ public class DatasetLifecycleManager implements 
IDatasetLifecycleManager, ILifeC
                         resourcePath, iInfo.getReferenceCount(), 
opTracker.getNumActiveOperations());
                 LOGGER.severe(logMsg);
             }
-            throw HyracksDataException
-                    .create(ErrorCode.CANNOT_DROP_IN_USE_INDEX, 
StoragePathUtil.getIndexNameFromPath(resourcePath));
+            throw 
HyracksDataException.create(ErrorCode.CANNOT_DROP_IN_USE_INDEX,
+                    StoragePathUtil.getIndexNameFromPath(resourcePath));
         }
 
         // TODO: use fine-grained counters, one for each index instead of a 
single counter per dataset.
@@ -204,8 +204,8 @@ public class DatasetLifecycleManager implements 
IDatasetLifecycleManager, ILifeC
         for (DatasetResource dsr : datasetsResources) {
             PrimaryIndexOperationTracker opTracker = dsr.getOpTracker();
             if (opTracker != null && opTracker.getNumActiveOperations() == 0
-                    && dsr.getDatasetInfo().getReferenceCount() == 0 && 
dsr.getDatasetInfo().isOpen() && !dsr
-                    .isMetadataDataset()) {
+                    && dsr.getDatasetInfo().getReferenceCount() == 0 && 
dsr.getDatasetInfo().isOpen()
+                    && !dsr.isMetadataDataset()) {
                 closeDataset(dsr.getDatasetInfo());
                 LOGGER.info(() -> "Evicted Dataset" + dsr.getDatasetID());
                 return true;
@@ -235,9 +235,8 @@ public class DatasetLifecycleManager implements 
IDatasetLifecycleManager, ILifeC
             if (dsr == null) {
                 DatasetInfo dsInfo = new DatasetInfo(did);
                 PrimaryIndexOperationTracker opTracker = new 
PrimaryIndexOperationTracker(did, logManager, dsInfo);
-                DatasetVirtualBufferCaches vbcs =
-                        new DatasetVirtualBufferCaches(did, storageProperties, 
memoryManager.getNumPages(did),
-                                numPartitions);
+                DatasetVirtualBufferCaches vbcs = new 
DatasetVirtualBufferCaches(did, storageProperties,
+                        memoryManager.getNumPages(did), numPartitions);
                 dsr = new DatasetResource(dsInfo, opTracker, vbcs);
                 datasets.put(did, dsr);
             }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
index b59fe6a..79ae1da 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
@@ -24,7 +24,6 @@ import 
org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.LocalResource;
 
 /**
@@ -88,14 +87,14 @@ public class DatasetResource implements 
Comparable<DatasetResource> {
         return (iInfo == null) ? null : iInfo.getIndex();
     }
 
-    public void register(LocalResource resource, IIndex index) throws 
HyracksDataException {
+    public void register(LocalResource resource, ILSMIndex index) throws 
HyracksDataException {
         long resourceID = resource.getId();
         if (!datasetInfo.isRegistered()) {
             synchronized (datasetInfo) {
                 if (!datasetInfo.isRegistered()) {
-                    datasetInfo.setExternal(!index.hasMemoryComponents());
+                    
datasetInfo.setExternal(index.getNumberOfAllMemoryComponents() == 0);
                     datasetInfo.setRegistered(true);
-                    datasetInfo.setDurable(((ILSMIndex) index).isDurable());
+                    datasetInfo.setDurable(index.isDurable());
                 }
             }
         }
@@ -105,8 +104,8 @@ public class DatasetResource implements 
Comparable<DatasetResource> {
         if (index == null) {
             throw new HyracksDataException("Attempt to register a null index");
         }
-        datasetInfo.getIndexes().put(resourceID, new IndexInfo((ILSMIndex) 
index, datasetInfo.getDatasetID(),
-                resourceID, ((DatasetLocalResource) 
resource.getResource()).getPartition()));
+        datasetInfo.getIndexes().put(resourceID, new IndexInfo(index, 
datasetInfo.getDatasetID(), resourceID,
+                ((DatasetLocalResource) 
resource.getResource()).getPartition()));
     }
 
     public DatasetInfo getDatasetInfo() {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
index 3138986..5fcbac9 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
@@ -31,6 +31,8 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.DiskComponentMetadata;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMDiskComponentId;
@@ -38,25 +40,25 @@ import 
org.apache.hyracks.storage.am.lsm.common.util.ComponentUtils;
 
 // A single LSMIOOperationCallback per LSM index used to perform actions 
around Flush and Merge operations
 public abstract class AbstractLSMIOOperationCallback implements 
ILSMIOOperationCallback {
-    private static final Logger logger = 
Logger.getLogger(AbstractLSMIOOperationCallback.class.getName());
-
+    private static final Logger LOGGER = 
Logger.getLogger(AbstractLSMIOOperationCallback.class.getName());
     public static final MutableArrayValueReference LSN_KEY = new 
MutableArrayValueReference("LSN".getBytes());
     public static final long INVALID = -1L;
 
-    // First LSN per mutable component
-    protected long[] firstLSNs;
+    protected final ILSMIndex lsmIndex;
+    // First LSN per mutable component. TODO: move from hyracks to asterixdb
+    protected final long[] firstLSNs;
     // A boolean array to keep track of flush operations
-    protected boolean[] flushRequested;
-    // I think this was meant to be mutableLastLSNs
-    // protected long[] immutableLastLSNs;
-    protected long[] mutableLastLSNs;
+    protected final boolean[] flushRequested;
+    // TODO: move from hyracks to asterixdb
+    protected final long[] mutableLastLSNs;
     // Index of the currently flushing or next to be flushed component
     protected int readIndex;
     // Index of the currently being written to component
     protected int writeIndex;
 
-    @Override
-    public void setNumOfMutableComponents(int count) {
+    public AbstractLSMIOOperationCallback(ILSMIndex lsmIndex) {
+        this.lsmIndex = lsmIndex;
+        int count = lsmIndex.getNumberOfAllMemoryComponents();
         mutableLastLSNs = new long[count];
         firstLSNs = new long[count];
         flushRequested = new boolean[count];
@@ -65,7 +67,7 @@ public abstract class AbstractLSMIOOperationCallback 
implements ILSMIOOperationC
     }
 
     @Override
-    public void beforeOperation(LSMOperationType opType) {
+    public void beforeOperation(LSMOperationType opType) throws 
HyracksDataException {
         if (opType == LSMOperationType.FLUSH) {
             /*
              * This method was called on the scheduleFlush operation.
@@ -118,7 +120,7 @@ public abstract class AbstractLSMIOOperationCallback 
implements ILSMIOOperationC
             //and return the LSN for the flushed component
             long id = getComponentLSN(null);
             if (id == 0) {
-                logger.log(Level.WARNING, "Flushing a memory component without 
setting the LSN");
+                LOGGER.log(Level.WARNING, "Flushing a memory component without 
setting the LSN");
                 id = ILSMDiskComponentId.NOT_FOUND;
             }
             return new LSMDiskComponentId(id, id);
@@ -216,6 +218,16 @@ public abstract class AbstractLSMIOOperationCallback 
implements ILSMIOOperationC
         return maxLSN;
     }
 
+    @Override
+    public void recycled(ILSMMemoryComponent component) throws 
HyracksDataException {
+        // No op
+    }
+
+    @Override
+    public void allocated(ILSMMemoryComponent component) throws 
HyracksDataException {
+        // No op
+    }
+
     /**
      * @param component
      * @param componentFilePath

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
index 147bc10..c7fbb65 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
@@ -24,11 +24,12 @@ import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeFileManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeIOOperationCallback extends 
AbstractLSMIOOperationCallback {
 
-    public LSMBTreeIOOperationCallback() {
-        super();
+    public LSMBTreeIOOperationCallback(ILSMIndex index) {
+        super(index);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
index 322b5ef..e3abb6b 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
@@ -21,6 +21,7 @@ package org.apache.asterix.common.ioopcallbacks;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeIOOperationCallbackFactory implements 
ILSMIOOperationCallbackFactory {
 
@@ -32,7 +33,7 @@ public class LSMBTreeIOOperationCallbackFactory implements 
ILSMIOOperationCallba
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback() {
-        return new LSMBTreeIOOperationCallback();
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
+        return new LSMBTreeIOOperationCallback(index);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
index 5b6de6c..67d623a 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
@@ -23,9 +23,14 @@ import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import 
org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeWithBuddyFileManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeWithBuddyIOOperationCallback extends 
AbstractLSMIOOperationCallback {
 
+    public LSMBTreeWithBuddyIOOperationCallback(ILSMIndex lsmIndex) {
+        super(lsmIndex);
+    }
+
     @Override
     public long getComponentFileLSNOffset(ILSMDiskComponent diskComponent, 
String diskComponentFilePath)
             throws HyracksDataException {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
index 1055fa6..93f505c 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
@@ -20,6 +20,7 @@ package org.apache.asterix.common.ioopcallbacks;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeWithBuddyIOOperationCallbackFactory implements 
ILSMIOOperationCallbackFactory {
 
@@ -32,7 +33,7 @@ public class LSMBTreeWithBuddyIOOperationCallbackFactory 
implements ILSMIOOperat
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback() {
-        return new LSMBTreeWithBuddyIOOperationCallback();
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
+        return new LSMBTreeWithBuddyIOOperationCallback(index);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
index 3c91a6a..2d27b78 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
@@ -22,13 +22,14 @@ package org.apache.asterix.common.ioopcallbacks;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import 
org.apache.hyracks.storage.am.lsm.invertedindex.impls.LSMInvertedIndexDiskComponent;
 import 
org.apache.hyracks.storage.am.lsm.invertedindex.impls.LSMInvertedIndexFileManager;
 
 public class LSMInvertedIndexIOOperationCallback extends 
AbstractLSMIOOperationCallback {
 
-    public LSMInvertedIndexIOOperationCallback() {
-        super();
+    public LSMInvertedIndexIOOperationCallback(ILSMIndex index) {
+        super(index);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
index 0fa0167..47a67b2 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
@@ -21,6 +21,7 @@ package org.apache.asterix.common.ioopcallbacks;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMInvertedIndexIOOperationCallbackFactory implements 
ILSMIOOperationCallbackFactory {
 
@@ -33,7 +34,7 @@ public class LSMInvertedIndexIOOperationCallbackFactory 
implements ILSMIOOperati
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback() {
-        return new LSMInvertedIndexIOOperationCallback();
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
+        return new LSMInvertedIndexIOOperationCallback(index);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
index 063fe38..9ba99f9 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
@@ -22,13 +22,14 @@ package org.apache.asterix.common.ioopcallbacks;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.rtree.impls.LSMRTreeFileManager;
 import org.apache.hyracks.storage.am.rtree.impls.RTree;
 
 public class LSMRTreeIOOperationCallback extends 
AbstractLSMIOOperationCallback {
 
-    public LSMRTreeIOOperationCallback() {
-        super();
+    public LSMRTreeIOOperationCallback(ILSMIndex index) {
+        super(index);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
index 83db16a..14cf648 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
@@ -21,6 +21,7 @@ package org.apache.asterix.common.ioopcallbacks;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMRTreeIOOperationCallbackFactory implements 
ILSMIOOperationCallbackFactory {
 
@@ -32,7 +33,7 @@ public class LSMRTreeIOOperationCallbackFactory implements 
ILSMIOOperationCallba
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback() {
-        return new LSMRTreeIOOperationCallback();
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
+        return new LSMRTreeIOOperationCallback(index);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
index bc206e2..8d4cd51 100644
--- 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
+++ 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
@@ -21,6 +21,7 @@ package org.apache.asterix.test.ioopcallbacks;
 
 import org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.junit.Assert;
 import org.mockito.Mockito;
@@ -31,8 +32,9 @@ public class LSMBTreeIOOperationCallbackTest extends TestCase 
{
 
     public void testNormalSequence() {
         try {
-            LSMBTreeIOOperationCallback callback = new 
LSMBTreeIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMBTreeIOOperationCallback callback = new 
LSMBTreeIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);
@@ -54,8 +56,9 @@ public class LSMBTreeIOOperationCallbackTest extends TestCase 
{
 
     public void testOverWrittenLSN() {
         try {
-            LSMBTreeIOOperationCallback callback = new 
LSMBTreeIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMBTreeIOOperationCallback callback = new 
LSMBTreeIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
index fe84d4a..ec1aba2 100644
--- 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
+++ 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
@@ -21,6 +21,7 @@ package org.apache.asterix.test.ioopcallbacks;
 
 import 
org.apache.asterix.common.ioopcallbacks.LSMBTreeWithBuddyIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.junit.Assert;
 import org.mockito.Mockito;
@@ -31,8 +32,9 @@ public class LSMBTreeWithBuddyIOOperationCallbackTest extends 
TestCase {
 
     public void testNormalSequence() {
         try {
-            LSMBTreeWithBuddyIOOperationCallback callback = new 
LSMBTreeWithBuddyIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMBTreeWithBuddyIOOperationCallback callback = new 
LSMBTreeWithBuddyIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);
@@ -54,8 +56,9 @@ public class LSMBTreeWithBuddyIOOperationCallbackTest extends 
TestCase {
 
     public void testOverWrittenLSN() {
         try {
-            LSMBTreeWithBuddyIOOperationCallback callback = new 
LSMBTreeWithBuddyIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMBTreeWithBuddyIOOperationCallback callback = new 
LSMBTreeWithBuddyIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
index 1f99db3..1711bc2 100644
--- 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
+++ 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
@@ -21,6 +21,7 @@ package org.apache.asterix.test.ioopcallbacks;
 
 import 
org.apache.asterix.common.ioopcallbacks.LSMInvertedIndexIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.junit.Assert;
 import org.mockito.Mockito;
@@ -31,8 +32,9 @@ public class LSMInvertedIndexIOOperationCallbackTest extends 
TestCase {
 
     public void testNormalSequence() {
         try {
-            LSMInvertedIndexIOOperationCallback callback = new 
LSMInvertedIndexIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMInvertedIndexIOOperationCallback callback = new 
LSMInvertedIndexIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);
@@ -54,8 +56,9 @@ public class LSMInvertedIndexIOOperationCallbackTest extends 
TestCase {
 
     public void testOverWrittenLSN() {
         try {
-            LSMInvertedIndexIOOperationCallback callback = new 
LSMInvertedIndexIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMInvertedIndexIOOperationCallback callback = new 
LSMInvertedIndexIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
index 38f7ee9..bb33f3d 100644
--- 
a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
+++ 
b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
@@ -21,6 +21,7 @@ package org.apache.asterix.test.ioopcallbacks;
 
 import org.apache.asterix.common.ioopcallbacks.LSMRTreeIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.junit.Assert;
 import org.mockito.Mockito;
@@ -31,8 +32,9 @@ public class LSMRTreeIOOperationCallbackTest extends TestCase 
{
 
     public void testNormalSequence() {
         try {
-            LSMRTreeIOOperationCallback callback = new 
LSMRTreeIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMRTreeIOOperationCallback callback = new 
LSMRTreeIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);
@@ -54,8 +56,9 @@ public class LSMRTreeIOOperationCallbackTest extends TestCase 
{
 
     public void testOverWrittenLSN() {
         try {
-            LSMRTreeIOOperationCallback callback = new 
LSMRTreeIOOperationCallback();
-            callback.setNumOfMutableComponents(2);
+            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+            
Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+            LSMRTreeIOOperationCallback callback = new 
LSMRTreeIOOperationCallback(mockIndex);
 
             //request to flush first component
             callback.updateLastLSN(1);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
index f03a358..1221458 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
@@ -339,11 +339,6 @@ public abstract class AbstractTreeIndex implements 
ITreeIndex {
     }
 
     @Override
-    public boolean hasMemoryComponents() {
-        return true;
-    }
-
-    @Override
     public String toString() {
         return "{\"class\":\"" + getClass().getSimpleName() + "\",\"file\":\"" 
+ file.getRelativePath() + "\"}";
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
index f1e9cf1..6083637 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
@@ -61,6 +61,6 @@ public class ExternalBTreeLocalResource extends 
LSMBTreeLocalResource {
                 cmpFactories, bloomFilterKeyFields, 
bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, 
serviceCtx),
                 opTrackerProvider.getOperationTracker(serviceCtx), 
ioSchedulerProvider.getIoScheduler(serviceCtx),
-                ioOpCallbackFactory.createIoOpCallback(), durable, 
metadataPageManagerFactory);
+                ioOpCallbackFactory, durable, metadataPageManagerFactory);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
index 317a479..04b63f9 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
@@ -64,6 +64,6 @@ public class ExternalBTreeWithBuddyLocalResource extends 
LSMBTreeLocalResource {
                 typeTraits, cmpFactories, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, 
serviceCtx),
                 opTrackerProvider.getOperationTracker(serviceCtx), 
ioSchedulerProvider.getIoScheduler(serviceCtx),
-                ioOpCallbackFactory.createIoOpCallback(), 
bloomFilterKeyFields, durable, metadataPageManagerFactory);
+                ioOpCallbackFactory, bloomFilterKeyFields, durable, 
metadataPageManagerFactory);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
index dad56eb..dfa88da 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
@@ -76,7 +76,7 @@ public class LSMBTreeLocalResource extends LsmResource {
                 cmpFactories, bloomFilterKeyFields, 
bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, 
serviceCtx),
                 opTrackerProvider.getOperationTracker(serviceCtx), 
ioSchedulerProvider.getIoScheduler(serviceCtx),
-                ioOpCallbackFactory.createIoOpCallback(), isPrimary, 
filterTypeTraits, filterCmpFactories, btreeFields,
-                filterFields, durable, metadataPageManagerFactory, 
updateAware, serviceCtx.getTracer());
+                ioOpCallbackFactory, isPrimary, filterTypeTraits, 
filterCmpFactories, btreeFields, filterFields,
+                durable, metadataPageManagerFactory, updateAware, 
serviceCtx.getTracer());
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
index 24f513a..1ca4a6f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
@@ -42,6 +42,7 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFileManager;
@@ -92,11 +93,11 @@ public class ExternalBTree extends LSMBTree implements 
ITwoPCIndex {
             IBufferCache bufferCache, ILSMIndexFileManager fileManager, 
ILSMDiskComponentFactory componentFactory,
             ILSMDiskComponentFactory bulkLoadComponentFactory, 
ILSMDiskComponentFactory transactionComponentFactory,
             double bloomFilterFalsePositiveRate, IBinaryComparatorFactory[] 
cmpFactories, ILSMMergePolicy mergePolicy,
-            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler, ILSMIOOperationCallback ioOpCallback,
-            boolean durable) {
+            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean 
durable) {
         super(ioManager, insertLeafFrameFactory, deleteLeafFrameFactory, 
bufferCache, fileManager, componentFactory,
                 bulkLoadComponentFactory, bloomFilterFalsePositiveRate, 
cmpFactories, mergePolicy, opTracker,
-                ioScheduler, ioOpCallback, false, durable);
+                ioScheduler, ioOpCallbackFactory, false, durable);
         this.transactionComponentFactory = transactionComponentFactory;
         this.secondDiskComponents = new LinkedList<>();
         this.interiorFrameFactory = interiorFrameFactory;
@@ -565,9 +566,4 @@ public class ExternalBTree extends LSMBTree implements 
ITwoPCIndex {
     public void recoverTransaction() throws HyracksDataException {
         fileManager.recoverTransaction();
     }
-
-    @Override
-    public boolean hasMemoryComponents() {
-        return false;
-    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
index 55090ad..57f956b 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
@@ -45,6 +45,7 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFileManager;
@@ -86,10 +87,10 @@ public class ExternalBTreeWithBuddy extends 
AbstractLSMIndex implements ITreeInd
             IBufferCache diskBufferCache, ILSMIndexFileManager fileManager, 
ILSMDiskComponentFactory componentFactory,
             ILSMDiskComponentFactory bulkLoadComponentFactory, double 
bloomFilterFalsePositiveRate,
             ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, 
ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallback ioOpCallback, IBinaryComparatorFactory[] 
btreeCmpFactories,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, 
IBinaryComparatorFactory[] btreeCmpFactories,
             IBinaryComparatorFactory[] buddyBtreeCmpFactories, int[] 
buddyBTreeFields, boolean durable) {
         super(ioManager, diskBufferCache, fileManager, 
bloomFilterFalsePositiveRate, mergePolicy, opTracker,
-                ioScheduler, ioOpCallback, componentFactory, 
bulkLoadComponentFactory, durable);
+                ioScheduler, ioOpCallbackFactory, componentFactory, 
bulkLoadComponentFactory, durable);
         this.btreeCmpFactories = btreeCmpFactories;
         this.buddyBtreeCmpFactories = buddyBtreeCmpFactories;
         this.buddyBTreeFields = buddyBTreeFields;
@@ -622,11 +623,6 @@ public class ExternalBTreeWithBuddy extends 
AbstractLSMIndex implements ITreeInd
     }
 
     @Override
-    public boolean hasMemoryComponents() {
-        return false;
-    }
-
-    @Override
     public boolean isPrimaryIndex() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index f6942b0..640e095 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -48,6 +48,7 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFileManager;
@@ -93,18 +94,18 @@ public class LSMBTree extends AbstractLSMIndex implements 
ITreeIndex {
             ILSMComponentFilterFrameFactory filterFrameFactory, 
LSMComponentFilterManager filterManager,
             double bloomFilterFalsePositiveRate, int fieldCount, 
IBinaryComparatorFactory[] cmpFactories,
             ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, 
ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallback ioOpCallback, boolean needKeyDupCheck, 
int[] btreeFields, int[] filterFields,
-            boolean durable, boolean updateAware, ITracer tracer) throws 
HyracksDataException {
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean 
needKeyDupCheck, int[] btreeFields,
+            int[] filterFields, boolean durable, boolean updateAware, ITracer 
tracer) throws HyracksDataException {
         super(ioManager, virtualBufferCaches, diskBufferCache, fileManager, 
bloomFilterFalsePositiveRate, mergePolicy,
-                opTracker, ioScheduler, ioOpCallback, componentFactory, 
bulkLoadComponentFactory, filterFrameFactory,
-                filterManager, filterFields, durable, filterHelper, 
btreeFields, tracer);
+                opTracker, ioScheduler, ioOpCallbackFactory, componentFactory, 
bulkLoadComponentFactory,
+                filterFrameFactory, filterManager, filterFields, durable, 
filterHelper, btreeFields, tracer);
         this.insertLeafFrameFactory = insertLeafFrameFactory;
         this.deleteLeafFrameFactory = deleteLeafFrameFactory;
         this.cmpFactories = cmpFactories;
         this.updateAware = updateAware;
         int i = 0;
         for (IVirtualBufferCache virtualBufferCache : virtualBufferCaches) {
-            LSMBTreeMemoryComponent mutableComponent = new 
LSMBTreeMemoryComponent(
+            LSMBTreeMemoryComponent mutableComponent = new 
LSMBTreeMemoryComponent(this,
                     new BTree(virtualBufferCache, new 
VirtualFreePageManager(virtualBufferCache), interiorFrameFactory,
                             insertLeafFrameFactory, cmpFactories, fieldCount,
                             
ioManager.resolveAbsolutePath(fileManager.getBaseDir() + "_virtual_" + i)),
@@ -122,10 +123,10 @@ public class LSMBTree extends AbstractLSMIndex implements 
ITreeIndex {
             ITreeIndexFrameFactory deleteLeafFrameFactory, IBufferCache 
bufferCache, ILSMIndexFileManager fileManager,
             ILSMDiskComponentFactory componentFactory, 
ILSMDiskComponentFactory bulkLoadComponentFactory,
             double bloomFilterFalsePositiveRate, IBinaryComparatorFactory[] 
cmpFactories, ILSMMergePolicy mergePolicy,
-            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler, ILSMIOOperationCallback ioOpCallback,
-            boolean needKeyDupCheck, boolean durable) {
+            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean 
needKeyDupCheck, boolean durable) {
         super(ioManager, bufferCache, fileManager, 
bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler,
-                ioOpCallback, componentFactory, bulkLoadComponentFactory, 
durable);
+                ioOpCallbackFactory, componentFactory, 
bulkLoadComponentFactory, durable);
         this.insertLeafFrameFactory = insertLeafFrameFactory;
         this.deleteLeafFrameFactory = deleteLeafFrameFactory;
         this.cmpFactories = cmpFactories;
@@ -363,8 +364,7 @@ public class LSMBTree extends AbstractLSMIndex implements 
ITreeIndex {
     public LSMBTreeOpContext createOpContext(IModificationOperationCallback 
modificationCallback,
             ISearchOperationCallback searchCallback) {
         int numBloomFilterKeyFields = hasBloomFilter
-                ? ((LSMBTreeWithBloomFilterDiskComponentFactory) 
componentFactory).getBloomFilterKeyFields().length
-                : 0;
+                ? ((LSMBTreeWithBloomFilterDiskComponentFactory) 
componentFactory).getBloomFilterKeyFields().length : 0;
         return new LSMBTreeOpContext(memoryComponents, insertLeafFrameFactory, 
deleteLeafFrameFactory,
                 modificationCallback, searchCallback, numBloomFilterKeyFields, 
getTreeFields(), getFilterFields(),
                 getLsmHarness(), getFilterCmpFactories());

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMemoryComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMemoryComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMemoryComponent.java
index b334d80..c7d555d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMemoryComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMemoryComponent.java
@@ -28,8 +28,9 @@ public class LSMBTreeMemoryComponent extends 
AbstractLSMMemoryComponent {
 
     private final BTree btree;
 
-    public LSMBTreeMemoryComponent(BTree btree, IVirtualBufferCache vbc, 
boolean isActive, ILSMComponentFilter filter) {
-        super(vbc, isActive, filter);
+    public LSMBTreeMemoryComponent(LSMBTree lsmIndex, BTree btree, 
IVirtualBufferCache vbc, boolean isActive,
+            ILSMComponentFilter filter) {
+        super(lsmIndex, vbc, isActive, filter);
         this.btree = btree;
     }
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
index 828b58e..a1a1e45 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
@@ -20,9 +20,10 @@ package org.apache.hyracks.storage.am.lsm.btree.impls;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
 import 
org.apache.hyracks.storage.am.lsm.common.api.AbstractLSMWithBuddyMemoryComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 
 /*
  * This class is also not needed at the moment but is implemented anyway
@@ -32,9 +33,9 @@ public class LSMBTreeWithBuddyMemoryComponent extends 
AbstractLSMWithBuddyMemory
     private final BTree btree;
     private final BTree buddyBtree;
 
-    public LSMBTreeWithBuddyMemoryComponent(BTree btree, BTree buddyBtree, 
IVirtualBufferCache vbc, boolean isActive,
-            ILSMComponentFilter filter) {
-        super(vbc, isActive, filter);
+    public LSMBTreeWithBuddyMemoryComponent(AbstractLSMIndex lsmIndex, BTree 
btree, BTree buddyBtree,
+            IVirtualBufferCache vbc, boolean isActive, ILSMComponentFilter 
filter) {
+        super(lsmIndex, vbc, isActive, filter);
         this.btree = btree;
         this.buddyBtree = buddyBtree;
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
index 2c4e6b1..a0b1905 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
@@ -45,7 +45,7 @@ import 
org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeWithBuddyFileManage
 import 
org.apache.hyracks.storage.am.lsm.btree.tuples.LSMBTreeCopyTupleWriterFactory;
 import 
org.apache.hyracks.storage.am.lsm.btree.tuples.LSMBTreeTupleWriterFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFileManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
@@ -68,7 +68,7 @@ public class LSMBTreeUtil {
             FileReference file, IBufferCache diskBufferCache, ITypeTraits[] 
typeTraits,
             IBinaryComparatorFactory[] cmpFactories, int[] 
bloomFilterKeyFields, double bloomFilterFalsePositiveRate,
             ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, 
ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallback ioOpCallback, boolean needKeyDupCheck, 
ITypeTraits[] filterTypeTraits,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean 
needKeyDupCheck, ITypeTraits[] filterTypeTraits,
             IBinaryComparatorFactory[] filterCmpFactories, int[] btreeFields, 
int[] filterFields, boolean durable,
             IMetadataPageManagerFactory freePageManagerFactory, boolean 
updateAware, ITracer tracer)
             throws HyracksDataException {
@@ -123,15 +123,16 @@ public class LSMBTreeUtil {
         return new LSMBTree(ioManager, virtualBufferCaches, 
interiorFrameFactory, insertLeafFrameFactory,
                 deleteLeafFrameFactory, diskBufferCache, fileNameManager, 
componentFactory, bulkLoadComponentFactory,
                 filterHelper, filterFrameFactory, filterManager, 
bloomFilterFalsePositiveRate, typeTraits.length,
-                cmpFactories, mergePolicy, opTracker, ioScheduler, 
ioOpCallback, needKeyDupCheck, btreeFields,
+                cmpFactories, mergePolicy, opTracker, ioScheduler, 
ioOpCallbackFactory, needKeyDupCheck, btreeFields,
                 filterFields, durable, updateAware, tracer);
     }
 
     public static ExternalBTree createExternalBTree(IIOManager ioManager, 
FileReference file,
             IBufferCache diskBufferCache, ITypeTraits[] typeTraits, 
IBinaryComparatorFactory[] cmpFactories,
             int[] bloomFilterKeyFields, double bloomFilterFalsePositiveRate, 
ILSMMergePolicy mergePolicy,
-            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler, ILSMIOOperationCallback ioOpCallback,
-            boolean durable, IMetadataPageManagerFactory 
freePageManagerFactory) {
+            ILSMOperationTracker opTracker, ILSMIOOperationScheduler 
ioScheduler,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean 
durable,
+            IMetadataPageManagerFactory freePageManagerFactory) {
         LSMBTreeTupleWriterFactory insertTupleWriterFactory =
                 new LSMBTreeTupleWriterFactory(typeTraits, 
cmpFactories.length, false, false);
         LSMBTreeTupleWriterFactory deleteTupleWriterFactory =
@@ -175,14 +176,14 @@ public class LSMBTreeUtil {
         return new ExternalBTree(ioManager, interiorFrameFactory, 
insertLeafFrameFactory, deleteLeafFrameFactory,
                 diskBufferCache, fileNameManager, componentFactory, 
bulkLoadComponentFactory,
                 transactionComponentFactory, bloomFilterFalsePositiveRate, 
cmpFactories, mergePolicy, opTracker,
-                ioScheduler, ioOpCallback, durable);
+                ioScheduler, ioOpCallbackFactory, durable);
     }
 
     public static ExternalBTreeWithBuddy 
createExternalBTreeWithBuddy(IIOManager ioManager, FileReference file,
             IBufferCache diskBufferCache, ITypeTraits[] typeTraits, 
IBinaryComparatorFactory[] cmpFactories,
             double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, 
ILSMOperationTracker opTracker,
-            ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallback 
ioOpCallback, int[] buddyBTreeFields,
-            boolean durable, IMetadataPageManagerFactory 
freePageManagerFactory) {
+            ILSMIOOperationScheduler ioScheduler, 
ILSMIOOperationCallbackFactory ioOpCallbackFactory,
+            int[] buddyBTreeFields, boolean durable, 
IMetadataPageManagerFactory freePageManagerFactory) {
         ITypeTraits[] buddyBtreeTypeTraits = new 
ITypeTraits[buddyBTreeFields.length];
         IBinaryComparatorFactory[] buddyBtreeCmpFactories = new 
IBinaryComparatorFactory[buddyBTreeFields.length];
         for (int i = 0; i < buddyBtreeTypeTraits.length; i++) {
@@ -231,6 +232,6 @@ public class LSMBTreeUtil {
         return new ExternalBTreeWithBuddy(ioManager, interiorFrameFactory, 
insertLeafFrameFactory,
                 buddyBtreeLeafFrameFactory, diskBufferCache, fileNameManager, 
componentFactory,
                 bulkLoadComponentFactory, bloomFilterFalsePositiveRate, 
mergePolicy, opTracker, ioScheduler,
-                ioOpCallback, cmpFactories, buddyBtreeCmpFactories, 
buddyBTreeFields, durable);
+                ioOpCallbackFactory, cmpFactories, buddyBtreeCmpFactories, 
buddyBTreeFields, durable);
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/AbstractLSMWithBuddyMemoryComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/AbstractLSMWithBuddyMemoryComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/AbstractLSMWithBuddyMemoryComponent.java
index b445142..551303f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/AbstractLSMWithBuddyMemoryComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/AbstractLSMWithBuddyMemoryComponent.java
@@ -20,12 +20,14 @@ package org.apache.hyracks.storage.am.lsm.common.api;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.impls.AbstractTreeIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMMemoryComponent;
 
 public abstract class AbstractLSMWithBuddyMemoryComponent extends 
AbstractLSMMemoryComponent {
 
-    public AbstractLSMWithBuddyMemoryComponent(IVirtualBufferCache vbc, 
boolean isActive, ILSMComponentFilter filter) {
-        super(vbc, isActive, filter);
+    public AbstractLSMWithBuddyMemoryComponent(AbstractLSMIndex lsmIndex, 
IVirtualBufferCache vbc, boolean isActive,
+            ILSMComponentFilter filter) {
+        super(lsmIndex, vbc, isActive, filter);
     }
 
     public abstract AbstractTreeIndex getBuddyIndex();

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
index 7cfd268..0323026 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
@@ -27,6 +27,7 @@ public interface ILSMIOOperationCallback {
     /**
      * This method is called on an IO operation before the operation starts.
      * (i.e. IO operations could be flush or merge operations.)
+     * For flush, this is called immediately before switching the current 
memory component pointer
      */
     void beforeOperation(LSMOperationType opType) throws HyracksDataException;
 
@@ -54,5 +55,18 @@ public interface ILSMIOOperationCallback {
      */
     void afterFinalize(LSMOperationType opType, ILSMDiskComponent 
newComponent) throws HyracksDataException;
 
-    void setNumOfMutableComponents(int count);
+    /**
+     * This method is called when a memory component is recycled
+     *
+     * @param component
+     */
+    void recycled(ILSMMemoryComponent component) throws HyracksDataException;
+
+    /**
+     * This method is called when a memory component is allocated
+     *
+     * @param component
+     */
+    void allocated(ILSMMemoryComponent component) throws HyracksDataException;
+
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
index ef76415..b291f7c 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
@@ -22,5 +22,5 @@ import java.io.Serializable;
 
 @FunctionalInterface
 public interface ILSMIOOperationCallbackFactory extends Serializable {
-    ILSMIOOperationCallback createIoOpCallback();
+    ILSMIOOperationCallback createIoOpCallback(ILSMIndex index);
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
index e4a9436..0f48621 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
@@ -140,4 +140,9 @@ public interface ILSMIndex extends IIndex {
      * @throws HyracksDataException
      */
     ILSMDiskComponent createBulkLoadTarget() throws HyracksDataException;
+
+    /**
+     * @return The number of all memory components (active and inactive)
+     */
+    int getNumberOfAllMemoryComponents();
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
index d69a78c..ac124ba 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
@@ -26,11 +26,13 @@ public abstract class AbstractLSMComponent implements 
ILSMComponent {
     // Finals
     protected final LongPointable pointable = 
LongPointable.FACTORY.createPointable();
     protected final ILSMComponentFilter filter;
+    protected final AbstractLSMIndex lsmIndex;
     // Mutables
     protected ComponentState state;
     protected int readerCount;
 
-    public AbstractLSMComponent(ILSMComponentFilter filter) {
+    public AbstractLSMComponent(AbstractLSMIndex lsmIndex, ILSMComponentFilter 
filter) {
+        this.lsmIndex = lsmIndex;
         this.filter = filter;
         readerCount = 0;
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
index 0b59e91..a0d1c23 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
@@ -30,12 +30,10 @@ import org.apache.hyracks.storage.common.MultiComparator;
 public abstract class AbstractLSMDiskComponent extends AbstractLSMComponent 
implements ILSMDiskComponent {
 
     private final DiskComponentMetadata metadata;
-    private final AbstractLSMIndex lsmIndex;
 
     public AbstractLSMDiskComponent(AbstractLSMIndex lsmIndex, 
IMetadataPageManager mdPageManager,
             ILSMComponentFilter filter) {
-        super(filter);
-        this.lsmIndex = lsmIndex;
+        super(lsmIndex, filter);
         state = ComponentState.READABLE_UNWRITABLE;
         metadata = new DiskComponentMetadata(mdPageManager);
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
index 50c7720..dd3a5de 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
@@ -48,6 +48,7 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
+import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
@@ -100,7 +101,7 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
     public AbstractLSMIndex(IIOManager ioManager, List<IVirtualBufferCache> 
virtualBufferCaches,
             IBufferCache diskBufferCache, ILSMIndexFileManager fileManager, 
double bloomFilterFalsePositiveRate,
             ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, 
ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallback ioOpCallback, ILSMDiskComponentFactory 
componentFactory,
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, 
ILSMDiskComponentFactory componentFactory,
             ILSMDiskComponentFactory bulkLoadComponentFactory, 
ILSMComponentFilterFrameFactory filterFrameFactory,
             LSMComponentFilterManager filterManager, int[] filterFields, 
boolean durable,
             IComponentFilterHelper filterHelper, int[] treeFields, ITracer 
tracer) {
@@ -110,10 +111,9 @@ public abstract class AbstractLSMIndex implements 
ILSMIndex {
         this.fileManager = fileManager;
         this.bloomFilterFalsePositiveRate = bloomFilterFalsePositiveRate;
         this.ioScheduler = ioScheduler;
-        this.ioOpCallback = ioOpCallback;
+        this.ioOpCallback = ioOpCallbackFactory.createIoOpCallback(this);
         this.componentFactory = componentFactory;
         this.bulkLoadComponentFactory = bulkLoadComponentFactory;
-        
this.ioOpCallback.setNumOfMutableComponents(virtualBufferCaches.size());
         this.filterHelper = filterHelper;
         this.filterFrameFactory = filterFrameFactory;
         this.filterManager = filterManager;
@@ -136,7 +136,7 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
     // The constructor used by external indexes
     public AbstractLSMIndex(IIOManager ioManager, IBufferCache 
diskBufferCache, ILSMIndexFileManager fileManager,
             double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, 
ILSMOperationTracker opTracker,
-            ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallback 
ioOpCallback,
+            ILSMIOOperationScheduler ioScheduler, 
ILSMIOOperationCallbackFactory ioOpCallbackFactory,
             ILSMDiskComponentFactory componentFactory, 
ILSMDiskComponentFactory bulkLoadComponentFactory,
             boolean durable) {
         this.ioManager = ioManager;
@@ -144,7 +144,7 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
         this.fileManager = fileManager;
         this.bloomFilterFalsePositiveRate = bloomFilterFalsePositiveRate;
         this.ioScheduler = ioScheduler;
-        this.ioOpCallback = ioOpCallback;
+        this.ioOpCallback = ioOpCallbackFactory.createIoOpCallback(this);
         this.componentFactory = componentFactory;
         this.bulkLoadComponentFactory = bulkLoadComponentFactory;
         this.durable = durable;
@@ -153,7 +153,7 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
         diskComponents = new LinkedList<>();
         this.inactiveDiskComponents = new LinkedList<>();
         // Memory related objects are nulled
-        this.virtualBufferCaches = null;
+        virtualBufferCaches = null;
         memoryComponents = null;
         currentMutableComponentId = null;
         flushRequests = null;
@@ -425,6 +425,7 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
         }
         for (ILSMMemoryComponent c : memoryComponents) {
             c.allocate();
+            ioOpCallback.allocated(c);
         }
         memoryComponentsAllocated = true;
     }
@@ -507,8 +508,8 @@ public abstract class AbstractLSMIndex implements ILSMIndex 
{
     }
 
     @Override
-    public boolean hasMemoryComponents() {
-        return true;
+    public final int getNumberOfAllMemoryComponents() {
+        return virtualBufferCaches == null ? 0 : virtualBufferCaches.size();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e32cb676/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
index 57db635..b7c3350 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
@@ -35,8 +35,9 @@ public abstract class AbstractLSMMemoryComponent extends 
AbstractLSMComponent im
     private boolean requestedToBeActive;
     private final MemoryComponentMetadata metadata;
 
-    public AbstractLSMMemoryComponent(IVirtualBufferCache vbc, boolean 
isActive, ILSMComponentFilter filter) {
-        super(filter);
+    public AbstractLSMMemoryComponent(AbstractLSMIndex lsmIndex, 
IVirtualBufferCache vbc, boolean isActive,
+            ILSMComponentFilter filter) {
+        super(lsmIndex, filter);
         this.vbc = vbc;
         writerCount = 0;
         if (isActive) {
@@ -53,6 +54,7 @@ public abstract class AbstractLSMMemoryComponent extends 
AbstractLSMComponent im
         if (state == ComponentState.INACTIVE && requestedToBeActive) {
             state = ComponentState.READABLE_WRITABLE;
             requestedToBeActive = false;
+            lsmIndex.getIOOperationCallback().recycled(this);
         }
         switch (opType) {
             case FORCE_MODIFICATION:

Reply via email to