[
https://issues.apache.org/jira/browse/HDDS-16730?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated HDDS-16730:
----------------------------------
Labels: pull-request-available (was: )
> [hsync] FinalizeBlock does not persist the last chunk merge
> -----------------------------------------------------------
>
> Key: HDDS-16730
> URL: https://issues.apache.org/jira/browse/HDDS-16730
> Project: Apache Ozone
> Issue Type: Sub-task
> Reporter: Chu Cheng Li
> Assignee: Chu Cheng Li
> Priority: Major
> Labels: pull-request-available
>
> h3. Problem
> HDDS-11014 adds a merge step to {{BlockManagerImpl#finalizeBlock}}. For a
> block with an incremental chunk list, this step moves the last chunk from the
> {{last_chunk_info}} table to the {{block_data}} table.
> The code commits the batch before it adds the merge operations to the batch:
> {code:java}
> db.getStore().getFinalizeBlocksTable().putWithBatch(batch, blockKey, localID);
> db.getStore().getBatchHandler().commitBatchOperation(batch);
> mergeLastChunkForBlockFinalization(blockId, db, kvContainer, batch, localID);
> {code}
> No code commits the batch again. {{RDBBatchOperation#close}} discards the
> merge operations. Thus, the {{last_chunk_info}} row stays, and the
> {{block_data}} row does not get the last chunk.
> The datanode logs these warnings for each finalized block that has an
> incremental chunk list:
> {noformat}
> WARN db.RDBBatchOperation: discarding changes Batch-2: block_data
> batchSize=94 B, discarded: 0 (0 B), #put=1, #del=0
> WARN db.RDBBatchOperation: discarding changes Batch-2: last_chunk_info
> batchSize=1 B, discarded: 0 (0 B), #put=0, #del=1
> {noformat}
> All releases since 2.0.0 have this problem.
> h3. Effect
> * Only a client with {{ozone.client.incremental.chunk.list=true}} writes an
> incremental chunk list. The default is {{false}}.
> * Reads return the full block. {{getBlock}} merges the {{last_chunk_info}}
> row at read time.
> * Some code reads the {{block_data}} rows directly. This code does not see
> the last chunk. Thus, the container scanner does not verify the checksum of
> the last chunk, and the container merkle tree does not include it.
> * Container reconciliation can make the block unreadable on a datanode. When
> reconciliation repairs a chunk of the block, it writes the full chunk list to
> {{block_data}}. It does not delete the {{last_chunk_info}} row. Thus, the
> next read adds the last chunk a second time and fails with
> {{IllegalStateException: chunk offset does not match}}.
> h3. Fix
> Add the merge operations to the batch before the commit. Thus, RocksDB gets
> the finalize marker and the merge in one write.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]