aliyun / aliyun-log-log4j-appender

aliyun-log-log4j-appender
Apache License 2.0
63 stars 32 forks source link

aliyun-log-log4j-appender出现死锁(版本0.1.6) #18

Open jefflike opened 2 years ago

jefflike commented 2 years ago

在我的业务log.info打印日志时(此时未释放meta.lock),IOThread.addPackage触发又一次logerror。 public void addPackage(PackageData data, int bytes) { data.markAddToIOBeginTime(); try { dataQueue.put(new BlockedData(data, bytes)); } catch (InterruptedException e) { LOGGER.error("Failed to put data into dataQueue.", e); } data.markAddToIOEndTime(); }

此时再执行到append操作拿不到meta.lock就出现死锁了 } else { meta.lock.lock(); metaRWLock.readLock().unlock(); } PackageData data = dataMap.get(key); if (meta.logLinesCount > 0 && (meta.logLinesCount + linesCount >= config.logsCountPerPackage || meta.packageBytes + logBytes >= config.logsBytesPerPackage || System .currentTimeMillis() - meta.arriveTimeInMS >= config.packageTimeoutInMS)) { ioThread.addPackage(data, meta.packageBytes); dataMap.remove(key); data = null; meta.clear(); }

现在不确定是我使用上有什么问题导致的还是这个版本就存在这样的bug,请务必帮忙一起看下,非常感谢。

jefflike commented 2 years ago

image 这个是业务流程报错的堆栈信息。在业务代码中打印了一行loginfo,触发IOThread.addPackage中阻塞队列的put抛出异常,打印了error日志,此时打印error再次进到PackageManager.add方法,最后因为loginfo还持有meta.lock的锁未释放,此时logerror就发生死锁了