[ 
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.

{code}
<11>1 2025-03-05T11:36:16.852Z hiveserver2-0 hiveserver2 1 
77d253bd-12ed-422f-98a1-242b4d393532 [mdc@38374 class="metadata.Hive" 
level="ERROR" thread="load-dynamic-partitionsToAdd-0"] Exception when loading 
partition with parameters  
partPath=s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/.hive-staging_hive_2025-03-05_11-36-12_903_341992364183254247-79381/-ext-10000/year=2022/month=Mar/day=6,
  table=stocks_highpartition,  partSpec={year=2022, month=Mar, day=6},  
loadFileType=KEEP_EXISTING,  listBucketingLevel=0,  isAcid=false,  
resetStatistics=true\rorg.apache.hadoop.hive.ql.metadata.HiveException: 
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/.hive-staging_hive_2025-03-05_11-36-12_903_341992364183254247-79381/-ext-10000/year=2022/month=Mar/day=6/000001_0
 to destination 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/year=2022/month=Mar/day=6\r
      at 
org.apache.hadoop.hive.ql.metadata.Hive.handlePoolException(Hive.java:5267)\r   
     at org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:4913)\r  at 
org.apache.hadoop.hive.ql.metadata.Hive.copyFiles(Hive.java:5427)\r  at 
org.apache.hadoop.hive.ql.metadata.Hive.loadPartitionInternal(Hive.java:2815)\r 
     at 
org.apache.hadoop.hive.ql.metadata.Hive.lambda$loadDynamicPartitions$7(Hive.java:3409)\r
     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\r at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\r
  at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\r
  at java.base/java.lang.Thread.run(Thread.java:829)\rCaused by: 
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move source 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/.hive-staging_hive_2025-03-05_11-36-12_903_341992364183254247-79381/-ext-10000/year=2022/month=Mar/day=6/000001_0
 to destination 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/year=2022/month=Mar/day=6\r
   at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5295)\r   at 
org.apache.hadoop.hive.ql.metadata.Hive.getHiveException(Hive.java:5250)\r   at 
org.apache.hadoop.hive.ql.metadata.Hive.access$200(Hive.java:262)\r  at 
org.apache.hadoop.hive.ql.metadata.Hive$2.call(Hive.java:4899)\r     at 
org.apache.hadoop.hive.ql.metadata.Hive$2.call(Hive.java:4885)\r     ... 4 
more\rCaused by: org.apache.hadoop.fs.FileAlreadyExistsException: Failed to 
rename 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/.hive-staging_hive_2025-03-05_11-36-12_903_341992364183254247-79381/-ext-10000/year=2022/month=Mar/day=6/000001_0
 to 
s3a://dev-nfqe-base/cc-cdw-nfqe-vt405x/warehouse/tablespace/external/hive/highpartition_small_impala.db/stocks_highpartition/year=2022/month=Mar/day=6/000001_0_copy_2;
 destination file exists\r    at 
org.apache.hadoop.fs.s3a.S3AFileSystem.initiateRename(S3AFileSystem.java:2379)\r
     at 
org.apache.hadoop.fs.s3a.S3AFileSystem.innerRename(S3AFileSystem.java:2444)\r   
     at 
org.apache.hadoop.fs.s3a.S3AFileSystem.lambda$rename$6(S3AFileSystem.java:2305)\r
    at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.invokeTrackingDuration(IOStatisticsBinding.java:543)\r
      at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.lambda$trackDurationOfOperation$5(IOStatisticsBinding.java:524)\r
   at 
org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDuration(IOStatisticsBinding.java:445)\r
       at 
org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2776)\r
       at 
org.apache.hadoop.fs.s3a.S3AFileSystem.rename(S3AFileSystem.java:2303)\r     at 
org.apache.hadoop.hive.ql.metadata.Hive.mvFile(Hive.java:5028)\r     at 
org.apache.hadoop.hive.ql.metadata.Hive.access$100(Hive.java:262)\r  at 
org.apache.hadoop.hive.ql.metadata.Hive$2.call(Hive.java:4892)\r     ... 5 
more\r
{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