You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@iotdb.apache.org by "Dongming Zhao (Jira)" <ji...@apache.org> on 2022/04/23 10:42:00 UTC

[jira] [Created] (IOTDB-2990) SeriesReader读取Chunk时错误地加载下一份文件

Dongming Zhao created IOTDB-2990:
------------------------------------

             Summary: SeriesReader读取Chunk时错误地加载下一份文件
                 Key: IOTDB-2990
                 URL: https://issues.apache.org/jira/browse/IOTDB-2990
             Project: Apache IoTDB
          Issue Type: Bug
          Components: Core/Query
            Reporter: Dongming Zhao


Query模块中SeriesReader.hasNextChunk()第339行
{code:java}
while (firstChunkMetadata == null && (!cachedChunkMetadata.isEmpty() || hasNextFile()))
{
  initFirstChunkMetadata();
}
{code}
调用了hasNextFile()接口,这决定了当firstChunkMetadata为null,即上一个Chunk已经被消费掉,且cachedChunkMetadata为空,即上一个已经是最后一个Chunk时,该方法会尝试加载下一份文件而不是返回false。

以一种极端情况为例,SeriesReader获得了n份有序文件,每份文件有且仅有1个Chunk。则当我使用类似下边这样的代码进行访问时,第一次调用hasNextChunk()解开第一份文件,因为仅有一个Chunk所以cachedChunkMetadata为空,随后该Chunk被消费掉,firstChunkMetadata被解开并置为null,在完成了所有Page的读取之后,第二次调用hasNextChunk()即满足以上所述条件,调用了hasNextFile()接口解开了下一份文件,依次类推。最终一下代码实现的效果是,最外层File循环仅跑了一次,而Chunk循环跑了n次,每次都会解开下一份文件,这与预期的运行效果并不一致。
{code:java}
while(seriesReader.hasNextFile()) {
  while(seriesReader.hasNextChunk()) {
    while (seriesReader.hasNextPage()) {
      BatchData currentPage = seriesReader.nextPage()
      // do something
    }
  }
}{code}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)