private IMessageTree MergeTree(BlockingThreadSafeQueue <IMessageTree> trees) { int max = MAX_ATOMIC_MESSAGES - 1; DefaultTransaction tran = new DefaultTransaction("_CatMergeTree", "_CatMergeTree", null); tran.Status = CatConstants.SUCCESS; tran.SetCompleted(true); IMessageTree first; trees.TryPeek(out first, false); // Usually this should not happen, because it is in the same thread with ShouldMerge() if (first == null) { return(null); } // Set merge tree start time to the first massage's timestamp tran.Timestamp = first.Message.Timestamp; long lastTimestamp = 0; long lastDuration = 0; int estimatedByteSize = 0; while (max >= 0) { IMessageTree tree; trees.TryDequeue(out tree, false); if (tree != null) { tran.AddChild(tree.Message); estimatedByteSize += tree.EstimatedByteSize; if (first != tree) { _messageIdFactory.Reuse(tree.MessageId); } lastTimestamp = tree.Message.Timestamp; if (tree.Message is DefaultTransaction) { lastDuration = ((DefaultTransaction)tree.Message).DurationInMillis; } else { lastDuration = 0; } } if (tree == null || max == 0) { // Set merge tree end time to the last massage's end time tran.DurationInMillis = (lastTimestamp - tran.Timestamp + lastDuration); break; } max--; } ((DefaultMessageTree)first).Message = tran; estimatedByteSize += tran.EstimateByteSize(); first.EstimatedByteSize = estimatedByteSize; return(first); }
protected internal IMessage DecodeLine(ChannelBuffer buf, ITransaction parent, Stack <ITransaction> stack, IMessageTree tree) { BufferHelper helper = _mBufferHelper; byte identifier = buf.ReadByte(); String timestamp = helper.Read(buf, TAB); String type = helper.Read(buf, TAB); String name = helper.Read(buf, TAB); if (identifier == 'E') { IMessage evt = new DefaultEvent(type, name); String status = helper.Read(buf, TAB); String data = helper.ReadRaw(buf, TAB); helper.Read(buf, LF); // get rid of line feed evt.Timestamp = _mDateHelper.Parse(timestamp); evt.Status = status; evt.AddData(data); if (parent != null) { parent.AddChild(evt); tree.EstimatedByteSize += evt.EstimateByteSize(); return(parent); } return(evt); } if (identifier == 'M') { DefaultMetric metric = new DefaultMetric(type, name); String status = helper.Read(buf, TAB); String data = helper.ReadRaw(buf, TAB); helper.Read(buf, LF); // get rid of line feed metric.Timestamp = _mDateHelper.Parse(timestamp); metric.Status = status; metric.AddData(data); if (parent != null) { parent.AddChild(metric); tree.EstimatedByteSize += metric.EstimateByteSize(); return(parent); } return(metric); } if (identifier == 'H') { IMessage heartbeat = new DefaultHeartbeat(type, name); String status0 = helper.Read(buf, TAB); String data1 = helper.ReadRaw(buf, TAB); helper.Read(buf, LF); // get rid of line feed heartbeat.Timestamp = _mDateHelper.Parse(timestamp); heartbeat.Status = status0; heartbeat.AddData(data1); if (parent != null) { parent.AddChild(heartbeat); tree.EstimatedByteSize += heartbeat.EstimateByteSize(); return(parent); } return(heartbeat); } if (identifier == 't') { IMessage transaction = new DefaultTransaction(type, name, null); helper.Read(buf, LF); // get rid of line feed transaction.Timestamp = _mDateHelper.Parse(timestamp); if (parent != null) { parent.AddChild(transaction); tree.EstimatedByteSize += transaction.EstimateByteSize(); } stack.Push(parent); return(transaction); } if (identifier == 'A') { ITransaction transaction2 = new DefaultTransaction(type, name, null); String status3 = helper.Read(buf, TAB); String duration = helper.Read(buf, TAB); String data4 = helper.ReadRaw(buf, TAB); helper.Read(buf, LF); // get rid of line feed transaction2.Timestamp = _mDateHelper.Parse(timestamp); transaction2.Status = status3; transaction2.AddData(data4); long d = Int64.Parse(duration.Substring(0, duration.Length - 2), NumberStyles.Integer); transaction2.DurationInMicros = d; if (parent != null) { parent.AddChild(transaction2); tree.EstimatedByteSize += transaction2.EstimateByteSize(); return(parent); } return(transaction2); } if (identifier == 'T') { String status5 = helper.Read(buf, TAB); String duration6 = helper.Read(buf, TAB); String data7 = helper.ReadRaw(buf, TAB); helper.Read(buf, LF); // get rid of line feed parent.Status = status5; parent.AddData(data7); long d8 = Int64.Parse( duration6.Substring(0, duration6.Length - 2), NumberStyles.Integer); parent.DurationInMicros = d8; return(stack.Pop()); } Logger.Error("Unknown identifier(" + identifier + ") of message: " + buf); // unknown message, ignore it return(parent); }