>From Ian Maxon <[email protected]>:

Ian Maxon has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21373?usp=email )


Change subject: [NO ISSUE][RT] Move stat calculation to FrameTupleAppender
......................................................................

[NO ISSUE][RT] Move stat calculation to FrameTupleAppender

Currently ProfiledFrameWriter re-scans each frame to calculate
summary statistics for operators. However this isn't usually
needed- these could just be accumulated in FrameTupleAppender
and updated by it, which saves time.

Change-Id: If8539f3967b2d02a28f3a627f9e739c3caf7c1a9
---
M 
hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
M 
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ITimedWriter.java
M 
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java
M 
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
M 
hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppender.java
5 files changed, 56 insertions(+), 11 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/73/21373/1

diff --git 
a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
 
b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
index 75609c1..71153fe 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
@@ -277,6 +277,11 @@
             }

             @Override
+            public IOperatorStats getInputStats() {
+                return parentStats;
+            }
+
+            @Override
             public long getTotalTime() {
                 return startOfPipeline instanceof ITimedWriter ? 
((ITimedWriter) startOfPipeline).getTotalTime() : 0;
             }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ITimedWriter.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ITimedWriter.java
index e4f990f..5454466 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ITimedWriter.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ITimedWriter.java
@@ -24,5 +24,8 @@
 public interface ITimedWriter extends IFrameWriter {
     void setInputStats(IOperatorStats stats);

+    IOperatorStats getInputStats();
+
     long getTotalTime();
+
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java
index 447aa1d..9cf3164 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java
@@ -46,6 +46,7 @@
     private int maxSz = -1;

     protected final ICounter totalTime;
+    protected boolean callerCounted = false;

     public ProfiledFrameWriter(IFrameWriter writer) {
         this.writer = writer;
@@ -57,6 +58,12 @@
         this.inputStats = stats;
     }

+    @Override
+    public IOperatorStats getInputStats() {
+        callerCounted = true;
+        return inputStats;
+    }
+
     public static void timeMethod(HyracksRunnable r, ICounter c) throws 
HyracksDataException {
         long nt = 0;
         try {
@@ -106,7 +113,9 @@

     @Override
     public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
-        updateTupleStats(buffer);
+        if (!callerCounted) {
+            updateTupleStats(buffer);
+        }
         timeMethod(writer::nextFrame, buffer);
     }

diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
index 7338cc7..87cbfd4 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/AbstractFrameAppender.java
@@ -26,7 +26,9 @@
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameAppender;
 import org.apache.hyracks.api.comm.IFrameWriter;
+import org.apache.hyracks.api.dataflow.ITimedWriter;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.profiling.IOperatorStats;
 import org.apache.hyracks.util.IntSerDeUtils;
 import org.apache.hyracks.util.trace.ITracer;

@@ -46,7 +48,12 @@
     protected IFrame frame;
     protected byte[] array; // cached the getBuffer().array to speed up byte 
array access a little

-    protected int tupleCount;
+    protected int tupleCount = 0;
+    protected long totalTupleCount = 0;
+    protected long maxTupleSize = -1;
+    protected long minTupleSize = Long.MAX_VALUE;
+    protected long bytesProcessed = 0;
+    protected long frameCount = 0;
     protected int tupleDataEndOffset;
     protected boolean ignoreFailures = false;

@@ -59,6 +66,18 @@
         reset(getBuffer(), clear);
     }

+    protected void updateTupleStats(int length) {
+        ++tupleCount;
+        ++totalTupleCount;
+        bytesProcessed += length;
+        if (length > maxTupleSize) {
+            maxTupleSize = length;
+        }
+        if (length < minTupleSize) {
+            minTupleSize = length;
+        }
+    }
+
     protected boolean hasEnoughSpace(int fieldCount, int tupleLength) {
         return tupleDataEndOffset + FrameHelper.calcRequiredSpace(fieldCount, 
tupleLength)
                 + tupleCount * FrameConstants.SIZE_LEN <= 
FrameHelper.getTupleCountOffset(frame.getFrameSize());
@@ -92,6 +111,15 @@
     public void write(IFrameWriter outWriter, boolean clearFrame) throws 
HyracksDataException {
         failIfInterrupted();
         getBuffer().clear();
+        ++frameCount;
+        if (outWriter instanceof ITimedWriter) {
+            IOperatorStats stats = ((ITimedWriter) outWriter).getInputStats();
+            stats.getTupleCounter().set(totalTupleCount);
+            stats.getTupleBytes().set(bytesProcessed);
+            stats.getMaxTupleSz().set(maxTupleSize);
+            stats.getMinTupleSz().set(minTupleSize);
+            stats.getTotalFrameCount().set(frameCount);
+        }
         if (!ignoreFailures) {
             outWriter.nextFrame(getBuffer());
             if (clearFrame) {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppender.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppender.java
index 58194f4..4277aa6 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppender.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppender.java
@@ -54,7 +54,7 @@
             tupleDataEndOffset += fieldEndOffsets.length * 4 + length;
             IntSerDeUtils.putInt(getBuffer().array(),
                     FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 
* (tupleCount + 1), tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(fieldEndOffsets.length * 4 + length);
             IntSerDeUtils.putInt(getBuffer().array(), 
FrameHelper.getTupleCountOffset(frame.getFrameSize()),
                     tupleCount);
             return true;
@@ -83,7 +83,7 @@
             tupleDataEndOffset += tuple.getFieldCount() * 4 + length;
             IntSerDeUtils.putInt(getBuffer().array(),
                     FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 
* (tupleCount + 1), tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(tuple.getFieldCount() * 4 + length);
             IntSerDeUtils.putInt(getBuffer().array(), 
FrameHelper.getTupleCountOffset(frame.getFrameSize()),
                     tupleCount);
             return true;
@@ -98,7 +98,7 @@
             tupleDataEndOffset += length;
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -120,7 +120,7 @@
             tupleDataEndOffset += effectiveSlots * 4 + length;
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(effectiveSlots * 4 + length);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -137,7 +137,7 @@
             tupleDataEndOffset += length;
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -185,7 +185,7 @@
             tupleDataEndOffset += (length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -221,7 +221,7 @@
             tupleDataEndOffset += (length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -258,7 +258,7 @@
             tupleDataEndOffset += (length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length0 + length1);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }
@@ -293,7 +293,7 @@
             tupleDataEndOffset += length;
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
                     tupleDataEndOffset);
-            ++tupleCount;
+            updateTupleStats(length);
             IntSerDeUtils.putInt(array, 
FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
             return true;
         }

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21373?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: If8539f3967b2d02a28f3a627f9e739c3caf7c1a9
Gerrit-Change-Number: 21373
Gerrit-PatchSet: 1
Gerrit-Owner: Ian Maxon <[email protected]>

Reply via email to