You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "Arafat Khan (Jira)" <ji...@apache.org> on 2025/02/06 09:07:00 UTC
[jira] [Created] (HDDS-12228) Fix Duplicate Key Violation Condition in FileSizeCountTask
Arafat Khan created HDDS-12228:
----------------------------------
Summary: Fix Duplicate Key Violation Condition in FileSizeCountTask
Key: HDDS-12228
URL: https://issues.apache.org/jira/browse/HDDS-12228
Project: Apache Ozone
Issue Type: Improvement
Components: Ozone Recon
Reporter: Arafat Khan
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: issues-unsubscribe@ozone.apache.org
For additional commands, e-mail: issues-help@ozone.apache.org