/* * Set the statistic info in gpmon packet. */ static void setMotionStatsForGpmon(MotionState *node) { MotionLayerState *mlStates = (MotionLayerState *)node->ps.state->motionlayer_context; ChunkTransportState *transportStates = node->ps.state->interconnect_context; int motionId = ((Motion *) node->ps.plan)->motionID; MotionNodeEntry *mlEntry = getMotionNodeEntry(mlStates, motionId, "setMotionStatsForGpmon"); ChunkTransportStateEntry *transportEntry = NULL; getChunkTransportState(transportStates, motionId, &transportEntry); uint64 avgAckTime = 0; if (transportEntry->stat_count_acks > 0) avgAckTime = transportEntry->stat_total_ack_time / transportEntry->stat_count_acks; Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_BYTES_SENT, mlEntry->stat_total_bytes_sent); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_TOTAL_ACK_TIME, transportEntry->stat_total_ack_time); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_AVG_ACK_TIME, avgAckTime); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_MAX_ACK_TIME, transportEntry->stat_max_ack_time); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_MIN_ACK_TIME, transportEntry->stat_min_ack_time); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_COUNT_RESENT, transportEntry->stat_count_resent); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_MAX_RESENT, transportEntry->stat_max_resent); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_BYTES_RECEIVED, mlEntry->stat_total_bytes_recvd); Gpmon_M_Set(GpmonPktFromMotionState(node), GPMON_MOTION_COUNT_DROPPED, transportEntry->stat_count_dropped); }
void CheckAndSendRecordCache(MotionLayerState *mlStates, ChunkTransportState *transportStates, int16 motNodeID, int16 targetRoute) { MotionNodeEntry *pMNEntry; TupleChunkListData tcList; MemoryContext oldCtxt; ChunkTransportStateEntry *pEntry = NULL; MotionConn *conn; getChunkTransportState(transportStates, motNodeID, &pEntry); /* * for broadcast we only mark sent_record_typmod for connection 0 for * efficiency and convenience */ if (targetRoute == BROADCAST_SEGIDX) conn = &pEntry->conns[0]; else conn = &pEntry->conns[targetRoute]; /* * Analyze tools. Do not send any thing if this slice is in the bit mask */ if (gp_motion_slice_noop != 0 && (gp_motion_slice_noop & (1 << currentSliceId)) != 0) return; /* * Pull up the motion node entry with the node's details. This includes * details that affect sending, such as whether the motion node needs to * include backup segment-dbs. */ pMNEntry = getMotionNodeEntry(mlStates, motNodeID, "SendRecordCache"); if (!ShouldSendRecordCache(conn, &pMNEntry->ser_tup_info)) return; #ifdef AMS_VERBOSE_LOGGING elog(DEBUG5, "Serializing RecordCache for sending."); #endif /* Create and store the serialized form, and some stats about it. */ oldCtxt = MemoryContextSwitchTo(mlStates->motion_layer_mctx); SerializeRecordCacheIntoChunks(&pMNEntry->ser_tup_info, &tcList, conn); MemoryContextSwitchTo(oldCtxt); #ifdef AMS_VERBOSE_LOGGING elog(DEBUG5, "Serialized RecordCache for sending:\n" "\ttarget-route %d \n" "\t%d bytes in serial form\n" "\tbroken into %d chunks", targetRoute, tcList.serialized_data_length, tcList.num_chunks); #endif /* do the send. */ if (!SendTupleChunkToAMS(mlStates, transportStates, motNodeID, targetRoute, tcList.p_first)) { pMNEntry->stopped = true; } else { /* update stats */ statSendTuple(mlStates, pMNEntry, &tcList); } /* cleanup */ clearTCList(&pMNEntry->ser_tup_info.chunkCache, &tcList); UpdateSentRecordCache(conn); }