private void fill() {
        final NodeList unlinkedNodeList = this.nodeList.filter(NodeList.unlinkFilter());
        for (Node node : unlinkedNodeList) {
            final SpanBo spanBo = node.getSpanBo();
            if (node.isLinked() || spanBo.isRoot()) {
                continue;
            }
            // find missing grand parent.
            final LinkList targetLinkList = this.linkList.filter(LinkList.spanFilter(spanBo));
            if (!targetLinkList.isEmpty()) {
                final Link matchedLink = targetLinkList.matchSpan(spanBo);
                if (matchedLink != null) {
                    if (isDebug) {
                        logger.debug("Fill link {} to node {}", matchedLink, node);
                    }
                    final CallTree unknownSpanCallTree = this.metaSpanCallTreeFactory.unknown(spanBo.getStartTime());
                    unknownSpanCallTree.add(node.getSpanCallTree());
                    node.setLinked(true);
                    matchedLink.getLinkedCallTree().update(unknownSpanCallTree);
                    matchedLink.setLinked(true);
                    // clear
                    this.linkList.remove(matchedLink);
                    traceState.progress();
                }
            }
        }
    }
@author netspider
@author emeroad
@author jaehong.kim
web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanAligner.java