diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/Info.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/Info.java
index fa0f14c..fab6321 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/Info.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/Info.java
@@ -20,7 +20,13 @@
 
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
 public abstract class Info {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
     private final AtomicInteger referenceCount = new AtomicInteger();
     private volatile boolean isOpen;
 
@@ -33,7 +39,11 @@
     }
 
     public void untouch() {
-        referenceCount.decrementAndGet();
+        int currentRefCount = referenceCount.get();
+        if (currentRefCount <= 0) {
+            LOGGER.warn("trying to decrement ref count {} that is already <=0", currentRefCount);
+        }
+        referenceCount.updateAndGet(i -> i > 0 ? i - 1 : i);
     }
 
     public int getReferenceCount() {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
index 829c9cc..5965e32 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
@@ -49,7 +49,6 @@
 import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
-import org.apache.hyracks.storage.am.common.util.ResourceReleaseUtils;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
@@ -106,6 +105,7 @@
 
             for (int i = 0; i < indexHelpers.length; i++) {
                 IIndexDataflowHelper indexHelper = indexHelpers[i];
+                indexHelpersOpen[i] = true;
                 indexHelper.open();
                 indexes[i] = indexHelper.getIndexInstance();
                 if (((ILSMIndex) indexes[i]).isAtomic() && isPrimary()) {
@@ -213,10 +213,7 @@
 
     @Override
     public void close() throws HyracksDataException {
-        Throwable failure = null;
-        for (IIndexDataflowHelper indexHelper : indexHelpers) {
-            failure = ResourceReleaseUtils.close(indexHelper, failure);
-        }
+        Throwable failure = closeIndexHelpers(null);
         if (writerOpen) {
             try {
                 writer.close();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java
index 367f670..733b06d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java
@@ -45,6 +45,7 @@
 
     protected final BulkLoadUsage usage;
     protected final IIndexDataflowHelper[] primaryIndexHelpers;
+    protected final boolean[] primaryIndexHelpersOpen;
     protected final IDatasetLifecycleManager datasetManager;
     protected final int datasetId;
     protected final int partition;
@@ -61,6 +62,7 @@
 
         if (priamryIndexDataflowHelperFactory != null) {
             primaryIndexHelpers = new IIndexDataflowHelper[partitions.length];
+            primaryIndexHelpersOpen = new boolean[partitions.length];
             primaryIndexes = new ILSMIndex[partitions.length];
             for (int i = 0; i < partitions.length; i++) {
                 primaryIndexHelpers[i] = priamryIndexDataflowHelperFactory
@@ -68,6 +70,7 @@
             }
         } else {
             primaryIndexHelpers = null;
+            primaryIndexHelpersOpen = null;
         }
         this.usage = usage;
         this.datasetId = datasetId;
@@ -86,6 +89,7 @@
             bulkLoaders[indexId] = targetIndex.createBulkLoader(fillFactor, verifyInput, numElementsHint,
                     checkIfEmptyIndex, parameters);
         } else {
+            primaryIndexHelpersOpen[indexId] = true;
             primaryIndexHelpers[indexId].open();
             primaryIndexes[indexId] = (ILSMIndex) primaryIndexHelpers[indexId].getIndexInstance();
             List<ILSMDiskComponent> primaryComponents = primaryIndexes[indexId].getDiskComponents();
@@ -109,7 +113,7 @@
             super.close();
         } finally {
             if (primaryIndexHelpers != null) {
-                closeIndexes(primaryIndexes, primaryIndexHelpers);
+                closeIndexes(primaryIndexes, primaryIndexHelpers, primaryIndexHelpersOpen);
             }
         }
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryInsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryInsertOperatorNodePushable.java
index 7891312..7fb3369 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryInsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryInsertOperatorNodePushable.java
@@ -57,6 +57,7 @@
 import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
+import org.apache.hyracks.storage.am.common.util.ResourceReleaseUtils;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameTupleProcessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
@@ -82,6 +83,7 @@
 
 public class LSMPrimaryInsertOperatorNodePushable extends LSMIndexInsertUpdateDeleteOperatorNodePushable {
 
+    private final boolean[] keyIndexHelpersOpen;
     private final IIndexDataflowHelper[] keyIndexHelpers;
     private MultiComparator keySearchCmp;
     private RangePredicate searchPred;
@@ -116,6 +118,7 @@
         this.lsmAccessorForUniqunessChecks = new LSMTreeIndexAccessor[partitions.length];
         this.lsmAccessorForKeyIndexes = new LSMTreeIndexAccessor[partitions.length];
         this.keyIndexHelpers = new IIndexDataflowHelper[partitions.length];
+        this.keyIndexHelpersOpen = new boolean[partitions.length];
         this.processors = new IFrameTupleProcessor[partitions.length];
         if (keyIndexHelperFactory != null) {
             for (int i = 0; i < partitions.length; i++) {
@@ -220,6 +223,7 @@
             writerOpen = true;
             for (int i = 0; i < partitions.length; i++) {
                 IIndexDataflowHelper indexHelper = indexHelpers[i];
+                indexHelpersOpen[i] = true;
                 indexHelper.open();
                 indexes[i] = indexHelper.getIndexInstance();
                 IIndex index = indexes[i];
@@ -229,6 +233,7 @@
                 IIndexDataflowHelper keyIndexHelper = keyIndexHelpers[i];
                 IIndex indexForUniquessCheck;
                 if (keyIndexHelper != null) {
+                    keyIndexHelpersOpen[i] = true;
                     keyIndexHelper.open();
                     indexForUniquessCheck = keyIndexHelper.getIndexInstance();
                 } else {
@@ -326,8 +331,8 @@
     public void close() throws HyracksDataException {
         Throwable failure = CleanupUtils.destroy(null, cursors);
         failure = CleanupUtils.close(writer, failure);
-        failure = CleanupUtils.close(indexHelpers, failure);
-        failure = CleanupUtils.close(keyIndexHelpers, failure);
+        failure = closeIndexHelpers(failure);
+        failure = closeKeyIndexHelpers(failure);
         if (failure == null && !failed) {
             commitAtomicInsert();
         } else {
@@ -387,4 +392,13 @@
             }
         }
     }
+
+    private Throwable closeKeyIndexHelpers(Throwable failure) {
+        for (int i = 0; i < keyIndexHelpers.length; i++) {
+            if (keyIndexHelpersOpen[i]) {
+                failure = ResourceReleaseUtils.close(keyIndexHelpers[i], failure);
+            }
+        }
+        return failure;
+    }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
index 71f699d..34371e1 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
@@ -302,6 +302,7 @@
                     (INcApplicationContext) ctx.getJobletContext().getServiceContext().getApplicationContext();
             for (int i = 0; i < indexHelpers.length; i++) {
                 IIndexDataflowHelper indexHelper = indexHelpers[i];
+                indexHelpersOpen[i] = true;
                 indexHelper.open();
                 indexes[i] = indexHelper.getIndexInstance();
                 if (((ILSMIndex) indexes[i]).isAtomic()) {
@@ -530,7 +531,7 @@
         Throwable failure = CleanupUtils.close(frameOpCallbacks, null);
         failure = CleanupUtils.destroy(failure, cursors);
         failure = CleanupUtils.close(writer, failure);
-        failure = CleanupUtils.close(indexHelpers, failure);
+        failure = closeIndexHelpers(failure);
         if (failure == null && !failed) {
             commitAtomicUpsert();
         } else {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
index 64dce1e..21c3b27 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
@@ -86,6 +86,7 @@
     @Override
     public void open() throws HyracksDataException {
         super.open();
+        //TODO(ali): ensure open()/close()
         primaryIndexHelper.open();
         primaryIndex = (ILSMIndex) primaryIndexHelper.getIndexInstance();
         secondaryIndexHelper.open();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorNodePushable.java
index 785a330..932da99 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorNodePushable.java
@@ -44,10 +44,11 @@
     @Override
     public void initialize() throws HyracksDataException {
         FrameTupleAppender appender = new FrameTupleAppender(new VSizeFrame(ctx));
-        if (fieldSlots != null && tupleData != null && tupleSize > 0)
+        if (fieldSlots != null && tupleData != null && tupleSize > 0) {
             appender.append(fieldSlots, tupleData, 0, tupleSize);
-        writer.open();
+        }
         try {
+            writer.open();
             appender.write(writer, false);
         } catch (Throwable th) {
             writer.fail();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
index f401e45..0206f20 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
@@ -49,6 +49,7 @@
     protected final long numElementsHint;
     protected final boolean checkIfEmptyIndex;
     protected final IIndexDataflowHelper[] indexHelpers;
+    protected final boolean[] indexHelpersOpen;
     protected final RecordDescriptor recDesc;
     protected final PermutingFrameTupleReference tuple = new PermutingFrameTupleReference();
     protected final ITupleFilterFactory tupleFilterFactory;
@@ -71,6 +72,7 @@
         this.storagePartitionId2Index = new Int2IntOpenHashMap();
         this.indexes = new IIndex[partitions.length];
         this.indexHelpers = new IIndexDataflowHelper[partitions.length];
+        this.indexHelpersOpen = new boolean[partitions.length];
         this.bulkLoaders = new IIndexBulkLoader[partitions.length];
         for (int i = 0; i < partitions.length; i++) {
             storagePartitionId2Index.put(partitions[i], i);
@@ -89,6 +91,7 @@
     public void open() throws HyracksDataException {
         accessor = new FrameTupleAccessor(recDesc);
         for (int i = 0; i < indexHelpers.length; i++) {
+            indexHelpersOpen[i] = true;
             indexHelpers[i].open();
             indexes[i] = indexHelpers[i].getIndexInstance();
             initializeBulkLoader(indexes[i], i);
@@ -133,7 +136,7 @@
             throw HyracksDataException.create(th);
         } finally {
             try {
-                closeIndexes(indexes, indexHelpers);
+                closeIndexes(indexes, indexHelpers, indexHelpersOpen);
             } finally {
                 writer.close();
             }
@@ -164,11 +167,11 @@
         }
     }
 
-    protected static void closeIndexes(IIndex[] indexes, IIndexDataflowHelper[] indexHelpers)
-            throws HyracksDataException {
+    protected static void closeIndexes(IIndex[] indexes, IIndexDataflowHelper[] indexHelpers,
+            boolean[] indexHelpersOpen) throws HyracksDataException {
         Throwable failure = null;
         for (int i = 0; i < indexes.length; i++) {
-            if (indexes[i] != null) {
+            if (indexes[i] != null || indexHelpersOpen[i]) {
                 failure = ResourceReleaseUtils.close(indexHelpers[i], failure);
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
index 10425f4..30c5a56 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
@@ -62,6 +62,7 @@
     protected final IIndex[] indexes;
     protected final IIndexAccessor[] indexAccessors;
     protected final IIndexDataflowHelper[] indexHelpers;
+    protected final boolean[] indexHelpersOpen;
     protected final IModificationOperationCallback[] modCallbacks;
     protected final IModificationOperationCallbackFactory modOpCallbackFactory;
     protected final ITupleFilterFactory tupleFilterFactory;
@@ -83,6 +84,7 @@
         this.modCallbacks = new IModificationOperationCallback[partitions.length];
         this.storagePartitionId2Index = new Int2IntOpenHashMap();
         this.indexHelpers = new IIndexDataflowHelper[partitions.length];
+        this.indexHelpersOpen = new boolean[partitions.length];
         for (int i = 0; i < partitions.length; i++) {
             storagePartitionId2Index.put(partitions[i], i);
             indexHelpers[i] = indexHelperFactory.create(ctx.getJobletContext().getServiceContext(), partitions[i]);
@@ -103,6 +105,7 @@
         try {
             for (int i = 0; i < indexHelpers.length; i++) {
                 IIndexDataflowHelper indexHelper = indexHelpers[i];
+                indexHelpersOpen[i] = true;
                 indexHelper.open();
                 indexes[i] = indexHelper.getIndexInstance();
                 LocalResource resource = indexHelper.getResource();
@@ -193,10 +196,10 @@
             if (writerOpen) {
                 writer.close();
             }
+        } catch (Throwable th) {
+            failure = th;
         } finally {
-            for (IIndexDataflowHelper indexHelper : indexHelpers) {
-                failure = ResourceReleaseUtils.close(indexHelper, failure);
-            }
+            failure = closeIndexHelpers(failure);
         }
         if (failure != null) {
             throw HyracksDataException.create(failure);
@@ -215,4 +218,15 @@
     public void flush() throws HyracksDataException {
         writer.flush();
     }
+
+    protected Throwable closeIndexHelpers(Throwable failure) {
+        //TODO(ali): should this be made similar to IndexSearchOperatorNodePushable.close()?
+        //TODO(ali): IIndexDataflowHelper.close() should be made idempotent and flags should be removed
+        for (int i = 0; i < indexHelpers.length; i++) {
+            if (indexHelpersOpen[i]) {
+                failure = ResourceReleaseUtils.close(indexHelpers[i], failure);
+            }
+        }
+        return failure;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
index 406dbc6..63ff2ed 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
@@ -80,6 +80,7 @@
 
     protected ISearchPredicate searchPred;
     protected final IIndexDataflowHelper[] indexHelpers;
+    protected final boolean[] indexHelpersOpen;
     protected IIndex[] indexes;
     protected IIndexAccessor[] indexAccessors;
     protected IIndexCursor[] cursors;
@@ -137,6 +138,7 @@
             storagePartitionId2Index.put(partitions[i], i);
         }
         this.indexHelpers = new IIndexDataflowHelper[partitions.length];
+        this.indexHelpersOpen = new boolean[partitions.length];
         this.indexes = new IIndex[partitions.length];
         this.indexAccessors = new IIndexAccessor[partitions.length];
         this.cursors = new IIndexCursor[partitions.length];
@@ -199,6 +201,7 @@
         IIndexAccessParameters[] iaps = new IndexAccessParameters[partitions.length];
 
         for (int i = 0; i < partitions.length; i++) {
+            indexHelpersOpen[i] = true;
             indexHelpers[i].open();
             indexes[i] = indexHelpers[i].getIndexInstance();
             searchCallbacks[i] = searchCallbackFactory
@@ -359,12 +362,16 @@
 
     private Throwable releaseResources(Throwable failure) {
         for (int i = 0; i < indexes.length; i++) {
-            // if index == null, then the index open was not successful
             try {
                 if (indexes[i] != null) {
                     failure = ResourceReleaseUtils.close(cursors[i], failure);
                     failure = CleanupUtils.destroy(failure, cursors[i], indexAccessors[i]);
                     failure = ResourceReleaseUtils.close(indexHelpers[i], failure);
+                } else if (indexHelpersOpen[i]) {
+                    // can mean the index was open, but getting the index instance failed (index == null)
+                    // or opening the index itself failed at some step during the open
+                    failure = ResourceReleaseUtils.close(indexHelpers[i], failure);
+                    //TODO(ali): IIndexDataflowHelper.close() should be made idempotent and flags should be removed
                 }
             } catch (Throwable th) {// NOSONAR ensure closing other indexes
                 // subsequently, the failure will be thrown
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 11368bf..a319c53 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
@@ -31,9 +31,12 @@
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.storage.common.buffercache.ICachedPage;
 import org.apache.hyracks.storage.common.file.BufferedFileHandle;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractTreeIndex implements ITreeIndex {
 
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final int MINIMAL_TREE_PAGE_COUNT = 2;
     public static final int MINIMAL_TREE_PAGE_COUNT_WITH_FILTER = 3;
     protected int rootPage = 1;
@@ -121,7 +124,8 @@
     @Override
     public synchronized void deactivate() throws HyracksDataException {
         if (!isActive) {
-            throw HyracksDataException.create(ErrorCode.CANNOT_DEACTIVATE_INACTIVE_INDEX);
+            LOGGER.warn("not deactivating already inactive index {}", this);
+            return;
         }
         freePageManager.close(HaltOnFailureCallback.INSTANCE);
         bufferCache.closeFile(fileId);
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 33fd38d..d9a3371 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
@@ -218,7 +218,8 @@
     @Override
     public synchronized void deactivate(boolean flush) throws HyracksDataException {
         if (!isActive) {
-            throw HyracksDataException.create(ErrorCode.CANNOT_DEACTIVATE_INACTIVE_INDEX);
+            LOGGER.warn("not deactivating already inactive index {}, flush requested:{}", this, flush);
+            return;
         }
         // The following member is used to prevent scheduling of new merges as memory components
         // get flushed. This now works only if the caller of deactivate waited for all IO
