[ 
https://issues.apache.org/jira/browse/HDDS-12228?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Devesh Kumar Singh resolved HDDS-12228.
---------------------------------------
    Resolution: Fixed

> Fix Duplicate Key Violation Condition in FileSizeCountTask
> ----------------------------------------------------------
>
>                 Key: HDDS-12228
>                 URL: https://issues.apache.org/jira/browse/HDDS-12228
>             Project: Apache Ozone
>          Issue Type: Bug
>          Components: Ozone Recon
>            Reporter: Arafat Khan
>            Assignee: Arafat Khan
>            Priority: Critical
>              Labels: pull-request-available
>             Fix For: 2.0.0
>
>
> In the *{{FileSizeCountTask}}* class, the update logic in 
> {{*writeCountsToDB()*}} is never reached because *{{isDbTruncated}}* is 
> always passed as {{{}true{}}}. This means that records are always inserted 
> without checking for existing records, leading to SQL exceptions due to 
> duplicate primary key constraints.
> Example of SQL Exception:
> {code:java}
> 2025-02-06 12:57:03 Caused by: org.jooq.exception.DataAccessException: SQL 
> [insert into "FILE_COUNT_BY_SIZE" ("volume", "bucket", "file_size", "count") 
> values (cast(? as varchar(32672)), cast(? as varchar(32672)), cast(? as 
> bigint), cast(? as bigint))]; The statement was aborted because it would have 
> caused a duplicate key value in a unique or primary key constraint or unique 
> index identified by 'pk_volume_bucket_file_size' defined on 
> 'FILE_COUNT_BY_SIZE'.
> {code}
> Root Cause: The update logic is inside the following condition:
> {code:java}
> if (!isDbTruncated) {
>     // Get the current count from the database and update
>     Record3<String, String, Long> recordToFind =
>         dslContext.newRecord(
>             FILE_COUNT_BY_SIZE.VOLUME,
>             FILE_COUNT_BY_SIZE.BUCKET,
>             FILE_COUNT_BY_SIZE.FILE_SIZE)
>             .value1(key.volume)
>             .value2(key.bucket)
>             .value3(key.fileSizeUpperBound);
>     FileCountBySize fileCountRecord =
>         fileCountBySizeDao.findById(recordToFind);
>     if (fileCountRecord == null && newRecord.getCount() > 0L) {
>         insertToDb.add(newRecord);
>     } else if (fileCountRecord != null) {
>         newRecord.setCount(fileCountRecord.getCount() + 
> fileSizeCountMap.get(key));
>         updateInDb.add(newRecord);
>     }
> } {code}
> However, since isDbTruncated is always true, this logic is never executed, 
> and the update is skipped. Instead, all records are inserted directly, 
> leading to duplicate key violations.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to