@@ -101,7 +101,7 @@ public class HMSTransaction implements Transaction {
101
101
private final Executor fileSystemExecutor ;
102
102
private HmsCommitter hmsCommitter ;
103
103
private List <THivePartitionUpdate > hivePartitionUpdates = Lists .newArrayList ();
104
- private String declaredIntentionsToWrite ;
104
+ private Optional < String > stagingDirectory ;
105
105
private boolean isMockedPartitionUpdate = false ;
106
106
107
107
private static class UncompletedMpuPendingUpload {
@@ -184,10 +184,14 @@ public void rollback() {
184
184
}
185
185
186
186
public void beginInsertTable (HiveInsertCommandContext ctx ) {
187
- declaredIntentionsToWrite = ctx .getWritePath ();
188
187
queryId = ctx .getQueryId ();
189
188
isOverwrite = ctx .isOverwrite ();
190
189
fileType = ctx .getFileType ();
190
+ if (fileType == TFileType .FILE_S3 ) {
191
+ stagingDirectory = Optional .empty ();
192
+ } else {
193
+ stagingDirectory = Optional .of (ctx .getWritePath ());
194
+ }
191
195
}
192
196
193
197
public void finishInsertTable (SimpleTableInfo tableInfo ) {
@@ -207,10 +211,12 @@ public void finishInsertTable(SimpleTableInfo tableInfo) {
207
211
}
208
212
});
209
213
} else {
210
- fs .makeDir (declaredIntentionsToWrite );
211
- setLocation (new THiveLocationParams () {{
212
- setWritePath (declaredIntentionsToWrite );
213
- }
214
+ stagingDirectory .ifPresent ((v ) -> {
215
+ fs .makeDir (v );
216
+ setLocation (new THiveLocationParams () {{
217
+ setWritePath (v );
218
+ }
219
+ });
214
220
});
215
221
}
216
222
}
@@ -643,15 +649,23 @@ private void recursiveDeleteItems(Path directory, boolean deleteEmptyDir, boolea
643
649
if (!deleteResult .getNotDeletedEligibleItems ().isEmpty ()) {
644
650
LOG .warn ("Failed to delete directory {}. Some eligible items can't be deleted: {}." ,
645
651
directory .toString (), deleteResult .getNotDeletedEligibleItems ());
652
+ throw new RuntimeException (
653
+ "Failed to delete directory for files: " + deleteResult .getNotDeletedEligibleItems ());
646
654
} else if (deleteEmptyDir && !deleteResult .dirNotExists ()) {
647
655
LOG .warn ("Failed to delete directory {} due to dir isn't empty" , directory .toString ());
656
+ throw new RuntimeException ("Failed to delete directory for empty dir: " + directory .toString ());
648
657
}
649
658
}
650
659
651
660
private DeleteRecursivelyResult recursiveDeleteFiles (Path directory , boolean deleteEmptyDir , boolean reverse ) {
652
661
try {
653
- if (!fs .directoryExists (directory .toString ()).ok ()) {
662
+ Status status = fs .directoryExists (directory .toString ());
663
+ if (status .getErrCode ().equals (Status .ErrCode .NOT_FOUND )) {
654
664
return new DeleteRecursivelyResult (true , ImmutableList .of ());
665
+ } else if (!status .ok ()) {
666
+ ImmutableList .Builder <String > notDeletedEligibleItems = ImmutableList .builder ();
667
+ notDeletedEligibleItems .add (directory .toString () + "/*" );
668
+ return new DeleteRecursivelyResult (false , notDeletedEligibleItems .build ());
655
669
}
656
670
} catch (Exception e ) {
657
671
ImmutableList .Builder <String > notDeletedEligibleItems = ImmutableList .builder ();
@@ -1447,7 +1461,7 @@ private void doUpdateStatisticsTasks() {
1447
1461
}
1448
1462
1449
1463
private void pruneAndDeleteStagingDirectories () {
1450
- recursiveDeleteItems (new Path (declaredIntentionsToWrite ), true , false );
1464
+ stagingDirectory . ifPresent (( v ) -> recursiveDeleteItems (new Path (v ), true , false ) );
1451
1465
}
1452
1466
1453
1467
private void abortMultiUploads () {
0 commit comments