[NO ISSUE][TX] Fix hang with COPY statement

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
For atomic srtatements, GlobalVirtualBufferCache was waiting on a
different memory component to be flushed than the scheduled one.

Change-Id: I7b1750bc60381a45f1b799f5050b79550b22b552
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17718
Reviewed-by: Peeyush Gupta <peeyush.gupta@couchbase.com>
Reviewed-by: Murtadha Al Hubail <mhubail@apache.org>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Peeyush Gupta <peeyush.gupta@couchbase.com>
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
index 0bb9bd5..2012fe8 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
@@ -498,12 +498,13 @@
                     // note that this is different from flushing a filtered memory component
                     PrimaryIndexOperationTracker opTracker =
                             (PrimaryIndexOperationTracker) primaryIndex.getOperationTracker();
+                    ILSMMemoryComponent memoryComponent = null;
                     synchronized (opTracker) {
                         boolean flushable = !primaryIndex.isCurrentMutableComponentEmpty();
                         if (flushable && !opTracker.isFlushLogCreated()) {
                             // if the flush log has already been created, then we can simply wait for
                             // that flush to complete
-                            ILSMMemoryComponent memoryComponent = primaryIndex.getCurrentMemoryComponent();
+                            memoryComponent = primaryIndex.getCurrentMemoryComponent();
                             if (memoryComponent.getState() == ComponentState.READABLE_WRITABLE) {
                                 // before we schedule the flush, mark the memory component as unwritable to prevent
                                 // future writers
@@ -522,7 +523,9 @@
                         if ((flushable || opTracker.isFlushLogCreated()) && !isMetadataIndex(primaryIndex)) {
                             // global vbc cannot wait on metadata indexes because metadata indexes support full
                             // ACID transactions. Waiting on metadata indexes can introduce deadlocks.
-                            flushingComponents.add(primaryIndex.getCurrentMemoryComponent());
+                            if (memoryComponent != null) {
+                                flushingComponents.add(memoryComponent);
+                            }
                             return primaryIndex;
                         }
                     }