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

László Bodor updated HIVE-28822:
--------------------------------
    Description: 
Concurrent `INSERT INTO` statements that create the same new dynamic partition 
on an external non-ACID Hive table backed by S3 can fail with `MoveTask return 
code 40000`. The root cause is a check-then-rename race in `Hive.mvFile`'s 
`_copy_N` naming loop: two writers pick the same destination path between an 
`exists()` probe and the subsequent `rename()` call, and the loser gets a 
`FileAlreadyExistsException` from `S3AFileSystem.initiateRename`.

This is separate from HIVE-29744, which addresses the *silent* data-loss twin 
of this race (concurrent writers overwriting each other with no error). This 
ticket is specifically about the *fail-loud* variant that survives even after 
HIVE-29744.


Local repro against table on S3 gave:
{code}
2026-07-27T07:11:51,807 ERROR [load-dynamic-partitionsToAdd-0] metadata.Hive: 
Exception when loading partition with parameters  
partPath=s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_4
03_8045012243677926207-34/-ext-10000/b=2,  table=p_test,  partSpec={b=2},  
loadFileType=KEEP_EXISTING,  listBucketingLevel=0,  isAcid=false,  
resetStatistics=false
org.apache.hadoop.hive.ql.metadata.HiveException: 
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_804501224367
7926207-34/-ext-10000/b=2/000001_0 to destination 
s3a://dw-team-bucket/tmp/p_test/b=2
        at 
org.apache.hadoop.hive.ql.metadata.Hive.handlePoolException(Hive.java:5458)
        at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5121)
        at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5618)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.loadPartitionInternal(Hive.java:2912)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.lambda$loadDynamicPartitions$7(Hive.java:3394)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move 
source 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
 to d
estination s3a://dw-team-bucket/tmp/p_test/b=2
        at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5486)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5441)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5107)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5093)
        ... 4 more
Caused by: org.apache.hadoop.fs.FileAlreadyExistsException: Failed to rename 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
 to s3a://dw-team-bucket/tmp/p_test/b=2/000001_0_copy_5; destination file exists
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.initiateRename(S3AFileSystem.java:2508)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.innerRename(S3AFileSystem.java:2573)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.lambda$rename$6(S3AFileSystem.java:2434)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.invokeTrackingDuration(IOStatisticsBinding.java:547)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.lambda$trackDurationOfOperation$5(IOStatisticsBinding.java:528)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDuration(IOStatisticsBinding.java:449)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2917)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.rename(S3AFileSystem.java:2432)
        at org.apache.hadoop.hive.ql.metadata.Hive.mvFile(Hive.java:5235)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5100)
        ... 5 more
{code}

  was:
Concurrent `INSERT INTO` statements that create the same new dynamic
partition on an external non-ACID Hive table backed by S3 can fail with
`MoveTask return code 40000`. The root cause is a check-then-rename race in
`Hive.mvFile`'s `_copy_N` naming loop: two writers pick the same
destination path between an `exists()` probe and the subsequent
`rename()` call, and the loser gets a `FileAlreadyExistsException` from
`S3AFileSystem.initiateRename`.

This is separate from HIVE-29744, which addresses the *silent* data-loss
twin of this race (concurrent writers overwriting each other with no
error). This ticket is specifically about the *fail-loud* variant that
survives even after HIVE-29744.


Local repro against table on S3 gave:
{code}
2026-07-27T07:11:51,807 ERROR [load-dynamic-partitionsToAdd-0] metadata.Hive: 
Exception when loading partition with parameters  
partPath=s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_4
03_8045012243677926207-34/-ext-10000/b=2,  table=p_test,  partSpec={b=2},  
loadFileType=KEEP_EXISTING,  listBucketingLevel=0,  isAcid=false,  
resetStatistics=false
org.apache.hadoop.hive.ql.metadata.HiveException: 
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_804501224367
7926207-34/-ext-10000/b=2/000001_0 to destination 
s3a://dw-team-bucket/tmp/p_test/b=2
        at 
org.apache.hadoop.hive.ql.metadata.Hive.handlePoolException(Hive.java:5458)
        at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5121)
        at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5618)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.loadPartitionInternal(Hive.java:2912)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.lambda$loadDynamicPartitions$7(Hive.java:3394)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move 
source 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
 to d
estination s3a://dw-team-bucket/tmp/p_test/b=2
        at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5486)
        at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5441)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5107)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5093)
        ... 4 more
Caused by: org.apache.hadoop.fs.FileAlreadyExistsException: Failed to rename 
s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
 to s3a://dw-team-bucket/tmp/p_test/b=2/000001_0_copy_5; destination file exists
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.initiateRename(S3AFileSystem.java:2508)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.innerRename(S3AFileSystem.java:2573)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.lambda$rename$6(S3AFileSystem.java:2434)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.invokeTrackingDuration(IOStatisticsBinding.java:547)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.lambda$trackDurationOfOperation$5(IOStatisticsBinding.java:528)
        at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDuration(IOStatisticsBinding.java:449)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2917)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem.rename(S3AFileSystem.java:2432)
        at org.apache.hadoop.hive.ql.metadata.Hive.mvFile(Hive.java:5235)
        at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5100)
        ... 5 more
{code}


>  Concurrent INSERTs into a new non-ACID dynamic partition fail with 
> FileAlreadyExistsException on S3
> ----------------------------------------------------------------------------------------------------
>
>                 Key: HIVE-28822
>                 URL: https://issues.apache.org/jira/browse/HIVE-28822
>             Project: Hive
>          Issue Type: Bug
>            Reporter: László Bodor
>            Assignee: László Bodor
>            Priority: Major
>              Labels: pull-request-available
>
> Concurrent `INSERT INTO` statements that create the same new dynamic 
> partition on an external non-ACID Hive table backed by S3 can fail with 
> `MoveTask return code 40000`. The root cause is a check-then-rename race in 
> `Hive.mvFile`'s `_copy_N` naming loop: two writers pick the same destination 
> path between an `exists()` probe and the subsequent `rename()` call, and the 
> loser gets a `FileAlreadyExistsException` from `S3AFileSystem.initiateRename`.
> This is separate from HIVE-29744, which addresses the *silent* data-loss twin 
> of this race (concurrent writers overwriting each other with no error). This 
> ticket is specifically about the *fail-loud* variant that survives even after 
> HIVE-29744.
> Local repro against table on S3 gave:
> {code}
> 2026-07-27T07:11:51,807 ERROR [load-dynamic-partitionsToAdd-0] metadata.Hive: 
> Exception when loading partition with parameters  
> partPath=s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_4
> 03_8045012243677926207-34/-ext-10000/b=2,  table=p_test,  partSpec={b=2},  
> loadFileType=KEEP_EXISTING,  listBucketingLevel=0,  isAcid=false,  
> resetStatistics=false
> org.apache.hadoop.hive.ql.metadata.HiveException: 
> org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source 
> s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_804501224367
> 7926207-34/-ext-10000/b=2/000001_0 to destination 
> s3a://dw-team-bucket/tmp/p_test/b=2
>         at 
> org.apache.hadoop.hive.ql.metadata.Hive.handlePoolException(Hive.java:5458)
>         at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5121)
>         at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5618)
>         at 
> org.apache.hadoop.hive.ql.metadata.Hive.loadPartitionInternal(Hive.java:2912)
>         at 
> org.apache.hadoop.hive.ql.metadata.Hive.lambda$loadDynamicPartitions$7(Hive.java:3394)
>         at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
>         at java.base/java.lang.Thread.run(Thread.java:1583)
> Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move 
> source 
> s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
>  to d
> estination s3a://dw-team-bucket/tmp/p_test/b=2
>         at 
> org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5486)
>         at 
> org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5441)
>         at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5107)
>         at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5093)
>         ... 4 more
> Caused by: org.apache.hadoop.fs.FileAlreadyExistsException: Failed to rename 
> s3a://dw-team-bucket/tmp/p_test/.hive-staging_hive_2026-07-27_07-11-26_403_8045012243677926207-34/-ext-10000/b=2/000001_0
>  to s3a://dw-team-bucket/tmp/p_test/b=2/000001_0_copy_5; destination file 
> exists
>         at 
> org.apache.hadoop.fs.s3a.S3AFileSystem.initiateRename(S3AFileSystem.java:2508)
>         at 
> org.apache.hadoop.fs.s3a.S3AFileSystem.innerRename(S3AFileSystem.java:2573)
>         at 
> org.apache.hadoop.fs.s3a.S3AFileSystem.lambda$rename$6(S3AFileSystem.java:2434)
>         at 
> org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.invokeTrackingDuration(IOStatisticsBinding.java:547)
>         at 
> org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.lambda$trackDurationOfOperation$5(IOStatisticsBinding.java:528)
>         at 
> org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDuration(IOStatisticsBinding.java:449)
>         at 
> org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2917)
>         at 
> org.apache.hadoop.fs.s3a.S3AFileSystem.rename(S3AFileSystem.java:2432)
>         at org.apache.hadoop.hive.ql.metadata.Hive.mvFile(Hive.java:5235)
>         at org.apache.hadoop.hive.ql.metadata.Hive$5.call(Hive.java:5100)
>         ... 5 more
> {code}



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

Reply via email to