@@ -24,11 +24,10 @@ use uuid::Uuid;
24
24
use crate :: error:: Result ;
25
25
use crate :: io:: OutputFile ;
26
26
use crate :: spec:: {
27
- DataFile , DataFileFormat , FormatVersion , MAIN_BRANCH , ManifestContentType , ManifestEntry ,
28
- ManifestFile , ManifestListWriter , ManifestWriterBuilder , Operation ,
29
- PROPERTY_WRITE_PARTITION_SUMMARY_LIMIT , PROPERTY_WRITE_PARTITION_SUMMARY_LIMIT_DEFAULT ,
30
- Snapshot , SnapshotReference , SnapshotRetention , SnapshotSummaryCollector , Struct , StructType ,
31
- Summary , update_snapshot_summaries,
27
+ DataFile , DataFileFormat , FormatVersion , MAIN_BRANCH , ManifestEntry , ManifestFile ,
28
+ ManifestListWriter , ManifestWriterBuilder , Operation , PROPERTY_WRITE_PARTITION_SUMMARY_LIMIT ,
29
+ PROPERTY_WRITE_PARTITION_SUMMARY_LIMIT_DEFAULT , Snapshot , SnapshotReference , SnapshotRetention ,
30
+ SnapshotSummaryCollector , Struct , StructType , Summary , update_snapshot_summaries,
32
31
} ;
33
32
use crate :: transaction:: Transaction ;
34
33
use crate :: { Error , ErrorKind , TableRequirement , TableUpdate } ;
@@ -247,17 +246,30 @@ impl<'a> SnapshotProduceAction<'a> {
247
246
let mut existing_manifests = snapshot_produce_operation. existing_manifest ( self ) . await ?;
248
247
249
248
if !self . added_data_files . is_empty ( ) {
250
- let added_data_files = std:: mem:: take ( & mut self . added_data_files ) ;
251
- let added_manifest = self . write_added_manifest ( added_data_files) . await ?;
249
+ let added_manifest = self . write_added_manifest ( ) . await ?;
252
250
existing_manifests. push ( added_manifest) ;
253
251
}
254
252
255
253
if !self . added_delete_files . is_empty ( ) {
256
- let added_delete_files = std:: mem:: take ( & mut self . added_delete_files ) ;
257
- let added_manifest = self . write_added_manifest ( added_delete_files) . await ?;
258
- existing_manifests. push ( added_manifest) ;
254
+ for manifest in existing_manifests. clone ( ) {
255
+ let manifest_entry = manifest
256
+ . load_manifest ( self . tx . current_table . file_io ( ) )
257
+ . await ?;
258
+ for entry in manifest_entry. entries ( ) {
259
+ // HACK: this will be quite slow.
260
+ let idx = if let Some ( idx) = self
261
+ . added_delete_files
262
+ . iter ( )
263
+ . position ( |d| d. file_path == entry. data_file . file_path )
264
+ {
265
+ idx
266
+ } else {
267
+ continue ;
268
+ } ;
269
+ existing_manifests. swap_remove ( idx) ;
270
+ }
271
+ }
259
272
}
260
-
261
273
let manifest_files = manifest_process. process_manifests ( existing_manifests) ;
262
274
Ok ( manifest_files)
263
275
}
0 commit comments