abdullah alamoudi has submitted this change and it was merged. Change subject: [NO ISSUE] Add performance traces for frame writes ......................................................................
[NO ISSUE] Add performance traces for frame writes - user model changes: no - storage format changes: no - interface changes: no details: - Add traces for writes to end of local pipeline. Change-Id: Ib32f4122fdddff1d0dce282a99829e0e0ad820e9 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2047 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Till Westmann <ti...@apache.org> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> --- M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java M hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties 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/util/FrameUtils.java 4 files changed, 73 insertions(+), 19 deletions(-) Approvals: Till Westmann: Looks good to me, approved Jenkins: Verified; No violations found; ; Verified diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java index 4bb2869..ef3f13b 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java @@ -128,6 +128,7 @@ public static final int JOB_HAS_BEEN_CLEARED_FROM_HISTORY = 92; public static final int JOB_HAS_NOT_BEEN_CREATED_YET = 93; public static final int CANNOT_READ_CLOSED_FILE = 94; + public static final int TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME = 95; // Compilation error codes. public static final int RULECOLLECTION_NOT_INSTANCE_OF_LIST = 10000; diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties index ede2f86..40df3d8 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties @@ -111,5 +111,6 @@ 92 = Job %1$s has been cleared from job history 93 = Job %1$s has not been created yet 94 = Cannot read closed file (%1$s) +95 = Tuple of size %1$s cannot fit into an empty frame 10000 = The given rule collection %1$s is not an instance of the List class. 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 efdd963..dfb03ab 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 @@ -28,6 +28,7 @@ import org.apache.hyracks.api.comm.IFrameWriter; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.util.IntSerDeUtils; +import org.apache.hyracks.util.trace.Tracer; /* * Frame @@ -115,4 +116,19 @@ } writer.flush(); } + + public void flush(IFrameWriter writer, Tracer tracer, String name, String cat, String args) + throws HyracksDataException { + long tid = -1L; + if (tracer != null && tracer.isEnabled()) { + tid = tracer.durationB(name, cat, args); + } + if (tupleCount > 0) { + write(writer, true); + } + writer.flush(); + if (tracer != null && tracer.isEnabled()) { + tracer.durationE(tid, args); + } + } } diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java index 063afe7..8411ff7 100644 --- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java +++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/util/FrameUtils.java @@ -24,9 +24,14 @@ import org.apache.hyracks.api.comm.IFrameTupleAccessor; import org.apache.hyracks.api.comm.IFrameTupleAppender; import org.apache.hyracks.api.comm.IFrameWriter; +import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.util.trace.Tracer; public class FrameUtils { + + private FrameUtils() { + } public static void copyWholeFrame(ByteBuffer srcFrame, ByteBuffer destFrame) { srcFrame.clear(); @@ -67,7 +72,7 @@ flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.appendSkipEmptyField(fieldSlots, bytes, offset, length)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, length); } } return flushedBytes; @@ -93,7 +98,7 @@ flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.append(bytes, offset, length)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, length); } } return flushedBytes; @@ -109,14 +114,14 @@ * @throws HyracksDataException */ public static int appendToWriter(IFrameWriter writer, IFrameTupleAppender frameTupleAppender, - IFrameTupleAccessor tupleAccessor, int tStartOffset, int tEndOffset) - throws HyracksDataException { + IFrameTupleAccessor tupleAccessor, int tStartOffset, int tEndOffset) throws HyracksDataException { int flushedBytes = 0; if (!frameTupleAppender.append(tupleAccessor, tStartOffset, tEndOffset)) { flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.append(tupleAccessor, tStartOffset, tEndOffset)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, + tEndOffset - tStartOffset); } } return flushedBytes; @@ -137,7 +142,25 @@ flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.append(tupleAccessor, tIndex)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, + tupleAccessor.getTupleLength(tIndex)); + } + } + return flushedBytes; + } + + public static int appendToWriter(IFrameWriter writer, IFrameTupleAppender frameTupleAppender, + IFrameTupleAccessor tupleAccessor, int tIndex, Tracer tracer, String name, String cat, String args) + throws HyracksDataException { + int flushedBytes = 0; + if (!frameTupleAppender.append(tupleAccessor, tIndex)) { + flushedBytes = frameTupleAppender.getBuffer().capacity(); + long tid = tracer.durationB(name, cat, args); + frameTupleAppender.write(writer, true); + tracer.durationE(tid, args); + if (!frameTupleAppender.append(tupleAccessor, tIndex)) { + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, + tupleAccessor.getTupleLength(tIndex)); } } return flushedBytes; @@ -153,8 +176,8 @@ * @return the number of bytes that have been flushed, 0 if not get flushed. * @throws HyracksDataException */ - public static int appendToWriter(IFrameWriter writer, IFrameTupleAppender tupleAppender, - int[] fieldEndOffsets, byte[] byteArray, int start, int size) throws HyracksDataException { + public static int appendToWriter(IFrameWriter writer, IFrameTupleAppender tupleAppender, int[] fieldEndOffsets, + byte[] byteArray, int start, int size) throws HyracksDataException { int flushedBytes = 0; if (!tupleAppender.append(fieldEndOffsets, byteArray, start, size)) { @@ -162,7 +185,7 @@ tupleAppender.write(writer, true); if (!tupleAppender.append(fieldEndOffsets, byteArray, start, size)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, size); } } return flushedBytes; @@ -186,7 +209,8 @@ flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.appendConcat(accessor0, tIndex0, accessor1, tIndex1)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, + accessor0.getTupleLength(tIndex0) + accessor1.getTupleLength(tIndex1)); } } return flushedBytes; @@ -205,14 +229,19 @@ * @throws HyracksDataException */ public static int appendConcatToWriter(IFrameWriter writer, IFrameTupleAppender frameTupleAppender, - IFrameTupleAccessor accessor0, int tIndex0, int[] fieldSlots1, byte[] bytes1, int offset1, - int dataLen1) throws HyracksDataException { + IFrameTupleAccessor accessor0, int tIndex0, int[] fieldSlots1, byte[] bytes1, int offset1, int dataLen1) + throws HyracksDataException { int flushedBytes = 0; if (!frameTupleAppender.appendConcat(accessor0, tIndex0, fieldSlots1, bytes1, offset1, dataLen1)) { flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.appendConcat(accessor0, tIndex0, fieldSlots1, bytes1, offset1, dataLen1)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + int startOffset0 = accessor0.getTupleStartOffset(tIndex0); + int endOffset0 = accessor0.getTupleEndOffset(tIndex0); + int length0 = endOffset0 - startOffset0; + int slotsLen1 = fieldSlots1.length * Integer.BYTES; + int length1 = slotsLen1 + dataLen1; + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, length0 + length1); } } return flushedBytes; @@ -234,7 +263,13 @@ flushedBytes = frameTupleAppender.getBuffer().capacity(); frameTupleAppender.write(writer, true); if (!frameTupleAppender.appendProjection(accessor, tIndex, fields)) { - throw new HyracksDataException("The output cannot be fit into a frame."); + int fTargetSlotsLength = fields.length * Integer.BYTES; + int length = fTargetSlotsLength; + for (int i = 0; i < fields.length; ++i) { + length += (accessor.getFieldEndOffset(tIndex, fields[i]) + - accessor.getFieldStartOffset(tIndex, fields[i])); + } + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, length); } } return flushedBytes; @@ -249,14 +284,14 @@ * @return the number of bytes that have been flushed, 0 if not get flushed. * @throws HyracksDataException */ - public static int appendFieldToWriter(IFrameWriter writer, IFrameFieldAppender appender, byte[] array, - int start, int length) throws HyracksDataException { + public static int appendFieldToWriter(IFrameWriter writer, IFrameFieldAppender appender, byte[] array, int start, + int length) throws HyracksDataException { int flushedBytes = 0; if (!appender.appendField(array, start, length)) { flushedBytes = appender.getBuffer().capacity(); appender.write(writer, true); if (!appender.appendField(array, start, length)) { - throw new HyracksDataException("Could not write frame: the size of the tuple is too long"); + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, length); } } return flushedBytes; @@ -278,10 +313,11 @@ flushedBytes = appender.getBuffer().capacity(); appender.write(writer, true); if (!appender.appendField(accessor, tid, fid)) { - throw new HyracksDataException("Could not write frame: the size of the tuple is too long"); + int fStartOffset = accessor.getFieldStartOffset(tid, fid); + int fLen = accessor.getFieldEndOffset(tid, fid) - fStartOffset; + throw HyracksDataException.create(ErrorCode.TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME, fLen); } } return flushedBytes; } - } -- To view, visit https://asterix-gerrit.ics.uci.edu/2047 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ib32f4122fdddff1d0dce282a99829e0e0ad820e9 Gerrit-PatchSet: 7 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Michael Blow <mb...@apache.org> Gerrit-Reviewer: Murtadha Hubail <mhub...@apache.org> Gerrit-Reviewer: Till Westmann <ti...@apache.org> Gerrit-Reviewer: Xikui Wang <xkk...@gmail.com> Gerrit-Reviewer: abdullah alamoudi <bamou...@gmail.com>