Skip to content

EventLog事件callback在多线程时次序不一致的问题 #714

@CodingCattwo

Description

@CodingCattwo

在获取历史区块中event时

  • 当status=1的finish callback和status=0的最后一条log callback在sdk线程池的同一个线程时,status为1的finish callback会在最后一条Log callback之后推送,获取正常
  • 当status=1的finish callback和status=0的最后一条log callback在sdk线程池的不同的线程时,偶尔出现status为1的finish callback会在最后一条Log callback之前推送,推送异常。

代码如下:

即status=1的callback比status=0的callback先到达,导致未获取到完整的eventlog list,但是由于status==1导致我的CompletableFuture提前结束了。

private CompletableFuture<List<LogResult>> future;
private List<LogResult> finalList;
 @Override
    public void onPushEventLog(int status, List<LogResult> logs) {
        logger.info(
            "SyncEventLogCallback onPushEventLog params: {}, status: {}, logs: {}",
            getFilter().getParams(), status, logs);
        // status == 0 push not finish,
        if (status == 0) {
            // add in resultList
            if (logs != null) {
                finalList.addAll(logs);
            }
        } else if (status == 1){
            if (logs != null) {
                finalList.addAll(logs);
            }
             // avoid last log callback(status=0) coming after success callback(status=1)
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                logger.error("sleep 100ms interrupted:{}", JsonUtils.objToString(e.getStackTrace()));
//            }
            logger.info(
                "SyncEventLogCallback push finished status: {}, finalList size:{}",
                status, finalList.size());
            future.complete(finalList);
        } else {
            // not 0, not 1, error
            logger.error("SyncEventLogCallback onPushEventLog error!");
            future.complete(finalList);
        }
    }

日志如下:
image

可以看到同一线程时,存储log的finalList size为1,但是不同线程时,finalList size为0就结束了。导致这两次过滤的入参相同,但是获取的事件列表不一致

临时解决方法:在status=1时,加上Thread.sleep(100);,让CompletableFuture稍晚结束,即可获取最后一条的log callback

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions