cat icon indicating copy to clipboard operation
cat copied to clipboard

Cat.logError(new Exception("null child message"))触发死循环

Open HelloLong opened this issue 1 year ago • 1 comments

Describe the bug cat 客户端发生死循环触发应用down机应

java.lang.Exception: null child message
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:63)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:30)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:563)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:574)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.truncateAndFlush(DefaultMessageManager.java:609)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.addTransactionChild(DefaultMessageManager.java:411)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.add(DefaultMessageManager.java:402)
	at com.dianping.cat.message.internal.DefaultMessageManager.add(DefaultMessageManager.java:83)
	at com.dianping.cat.message.internal.DefaultEvent.complete(DefaultEvent.java:42)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logEvent(DefaultMessageProducer.java:112)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:85)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:95)
	at com.dianping.cat.Cat.logError(Cat.java:289)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:63)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:30)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:563)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:574)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.truncateAndFlush(DefaultMessageManager.java:609)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.addTransactionChild(DefaultMessageManager.java:411)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.add(DefaultMessageManager.java:402)
	at com.dianping.cat.message.internal.DefaultMessageManager.add(DefaultMessageManager.java:83)
	at com.dianping.cat.message.internal.DefaultEvent.complete(DefaultEvent.java:42)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logEvent(DefaultMessageProducer.java:112)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:85)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:95)
	at com.dianping.cat.Cat.logError(Cat.java:289)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:63)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:30)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:563)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:574)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.truncateAndFlush(DefaultMessageManager.java:609)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.addTransactionChild(DefaultMessageManager.java:411)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.add(DefaultMessageManager.java:402)
	at com.dianping.cat.message.internal.DefaultMessageManager.add(DefaultMessageManager.java:83)
	at com.dianping.cat.message.internal.DefaultEvent.complete(DefaultEvent.java:42)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logEvent(DefaultMessageProducer.java:112)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:85)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:95)
	at com.dianping.cat.Cat.logError(Cat.java:289)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:63)
	at com.dianping.cat.message.internal.DefaultTransaction.addChild(DefaultTransaction.java:30)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:563)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.migrateMessage(DefaultMessageManager.java:574)
	at com.dianping.cat.message.internal.DefaultMessageManager$TransactionHelper.truncateAndFlush(DefaultMessageManager.java:609)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.addTransactionChild(DefaultMessageManager.java:411)
	at com.dianping.cat.message.internal.DefaultMessageManager$Context.add(DefaultMessageManager.java:402)
	at com.dianping.cat.message.internal.DefaultMessageManager.add(DefaultMessageManager.java:83)
	at com.dianping.cat.message.internal.DefaultEvent.complete(DefaultEvent.java:42)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logEvent(DefaultMessageProducer.java:112)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:85)
	at com.dianping.cat.message.internal.DefaultMessageProducer.logError(DefaultMessageProducer.java:95)
	at com.dianping.cat.Cat.logError(Cat.java:289)

To Reproduce 部分使用java版本 cat客户端 应用,偶发性发生down机。

Desktop (please complete the following information):

  • Version <groupId>com.dianping.cat</groupId><artifactId>cat-client</artifactId>3.0.0

HelloLong avatar May 22 '23 12:05 HelloLong

方案一

public class DefaultTransaction extends AbstractMessage implements Transaction {
	@Override
	public DefaultTransaction addChild(Message message) {
		if (m_children == null) {
			m_children = new ArrayList<Message>();
		}

		if (message != null) {
			m_children.add(message);
		} else {
                        // 可以通过暂时注释掉这个message 避免死循环
			// Cat.logError(new Exception("null child message"));
		}
		return this;
	}
}

方案二

public class DefaultTransaction extends AbstractMessage implements Transaction {
	@Override
	public DefaultTransaction addChild(Message message) {
		if (m_children == null) {
			m_children = new ArrayList<Message>();
		}

		if(message == null) {
			message = new DefaultEvent("exception", "null child message");
		}
		m_children.add(message);
		
		return this;
	}
}

暂时的方案可以通过不在累加 null child message 节点实现,但是无法排查出第一次空节点产生的原因。

HelloLong avatar May 22 '23 12:05 HelloLong