Merge branch 'gerrit/trinity' into 'master'

Change-Id: I7ad553442540fa98493601de3de933a09ccd85f2
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 6b9d3eb..113a40a 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
@@ -342,8 +342,10 @@
 
                 @Override
                 public void frameCompleted() throws HyracksDataException {
-                    //TODO: mixed-frame vs frame-per-storage-partition
-                    appender.write(writer, true);
+                    if (appender.getTupleCount() > 0) {
+                        //TODO: mixed-frame vs frame-per-storage-partition
+                        appender.write(writer, true);
+                    }
                     callback.frameCompleted();
                 }
 
@@ -483,7 +485,9 @@
      */
     @Override
     public void flushPartialFrame() throws HyracksDataException {
-        appender.write(writer, true);
+        if (appender.getTupleCount() > 0) {
+            appender.write(writer, true);
+        }
     }
 
     protected void appendFilterToPrevTuple() throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
index 3dc6d37..196fb79 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
@@ -165,4 +165,9 @@
         }
         return false;
     }
+
+    @Override
+    public void flush() throws HyracksDataException {
+        // No op since nextFrame flushes by default
+    }
 }