Skip to content

Commit 7c4bf32

Browse files
authored
Merge pull request #530 from reef-technologies/fix-incremental-mode
Fix continuation for started large files with no fully finished parts
2 parents c6b4698 + acfe785 commit 7c4bf32

File tree

4 files changed

+11
-9
lines changed

4 files changed

+11
-9
lines changed

b2sdk/_internal/transfer/emerge/executor.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ def _find_matching_unfinished_file(
393393
continue
394394

395395
finished_parts = {}
396+
conflict_detected = False
396397

397398
for part in self.services.large_file.list_parts(file_.file_id):
398399
emerge_part = emerge_parts_dict.get(part.part_number)
@@ -405,33 +406,33 @@ def _find_matching_unfinished_file(
405406
file_.file_id,
406407
part.part_number,
407408
)
408-
finished_parts = None
409+
conflict_detected = True
409410
break
410411

411412
# Compare part sizes
412413
if emerge_part.get_length() != part.content_length:
413414
logger.debug(
414415
'Rejecting %s: part %s size mismatch', file_.file_id, part.part_number
415416
)
416-
continue # part size doesn't match - so we reupload
417+
conflict_detected = True
418+
break # part size doesn't match - so we reupload
417419

418420
# Compare part hashes
419421
if emerge_part.is_hashable() and emerge_part.get_sha1() != part.content_sha1:
420422
logger.debug(
421423
'Rejecting %s: part %s sha1 mismatch', file_.file_id, part.part_number
422424
)
423-
continue # part.sha1 doesn't match - so we reupload
425+
conflict_detected = True
426+
break # part.sha1 doesn't match - so we reupload
424427

425428
finished_parts[part.part_number] = part
426429

427-
if finished_parts is None:
430+
if conflict_detected:
428431
continue
429432

430433
finished_parts_len = len(finished_parts)
431434

432-
if finished_parts and (
433-
best_match_file is None or finished_parts_len > best_match_parts_len
434-
):
435+
if best_match_file is None or finished_parts_len > best_match_parts_len:
435436
best_match_file = file_
436437
best_match_parts = finished_parts
437438
best_match_parts_len = finished_parts_len
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix continuation for started large files with no fully finished parts.

test/unit/bucket/test_bucket.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2006,7 +2006,7 @@ def test_upload_large_resume_no_parts(self):
20062006
large_file_id = self._start_large_file('file1')
20072007
progress_listener = StubProgressListener()
20082008
file_info = self.bucket.upload_bytes(data, 'file1', progress_listener=progress_listener)
2009-
self.assertNotEqual(large_file_id, file_info.id_) # it's not a match if there are no parts
2009+
self.assertEqual(large_file_id, file_info.id_)
20102010
self._check_file_contents('file1', data)
20112011
self.assertTrue(progress_listener.is_valid())
20122012

test/unit/v0/test_bucket.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@ def test_upload_large_resume_no_parts(self):
906906
large_file_id = self._start_large_file('file1')
907907
progress_listener = StubProgressListener()
908908
file_info = self.bucket.upload_bytes(data, 'file1', progress_listener=progress_listener)
909-
self.assertNotEqual(large_file_id, file_info.id_) # it's not a match if there are no parts
909+
self.assertEqual(large_file_id, file_info.id_)
910910
self._check_file_contents('file1', data)
911911
self.assertTrue(progress_listener.is_valid())
912912

0 commit comments

Comments
 (0)