Skip to content

Commit cec5fd7

Browse files
authored
JFMIG-29 - Fix #Artifacts are intermittently being overridden during transfer resulting in artifacts being moved to trashcan (#1518)
1 parent 624b659 commit cec5fd7

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

artifactory/commands/transferfiles/state/statemanager_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,24 @@ func TestFilesDiffRange(t *testing.T) {
3535
_ = addAndAssertNewDiffPhase(t, stateManager, 3, diffStart)
3636
}
3737

38+
func TestPhase2CompletedPersistedAfterSaveStateAndSnapshots(t *testing.T) {
39+
stateManager, cleanUp := InitStateTest(t)
40+
defer cleanUp()
41+
42+
assert.NoError(t, stateManager.SetRepoState(repo1Key, 0, 0, false, true))
43+
assert.NoError(t, stateManager.SetRepoFullTransferStarted(time.Now()))
44+
diffStart := time.Now()
45+
assert.NoError(t, stateManager.AddNewDiffToState(diffStart))
46+
setAndAssertFilesDiffCompleted(t, stateManager, 1)
47+
assert.NoError(t, stateManager.SaveStateAndSnapshots())
48+
49+
loaded, exists, err := LoadTransferState(repo1Key, false)
50+
assert.NoError(t, err)
51+
assert.True(t, exists)
52+
assert.Len(t, loaded.CurrentRepo.Diffs, 1)
53+
assert.True(t, loaded.CurrentRepo.Diffs[0].Completed, "Phase 2 completed=true must be persisted to disk after SaveStateAndSnapshots")
54+
}
55+
3856
func assertRepoTransferred(t *testing.T, stateManager *TransferStateManager, expected bool) {
3957
transferred, err := stateManager.IsRepoTransferred()
4058
assert.NoError(t, err)

artifactory/commands/transferfiles/transfer.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,19 @@ func (tdc *TransferFilesCommand) startPhase(newPhase *transferPhase, repo string
520520
return err
521521
}
522522
printPhaseChange("Done running '" + (*newPhase).getPhaseName() + "' for repo '" + repo + "'.")
523-
return (*newPhase).phaseDone()
523+
err = (*newPhase).phaseDone()
524+
if err != nil {
525+
return err
526+
}
527+
// Persist state after each phase so Phase 2 completed=true and HandledRange are not lost
528+
// when the next repo's SetRepoState replaces in-memory state before the throttle persists.
529+
if tdc.stateManager.CurrentRepo.Name != "" {
530+
if saveErr := tdc.stateManager.SaveStateAndSnapshots(); saveErr != nil {
531+
log.Error("Couldn't save transfer state", saveErr)
532+
return saveErr
533+
}
534+
}
535+
return nil
524536
}
525537

526538
// Handle interrupted signal.

0 commit comments

Comments
 (0)