Skip to content

Commit 39d059e

Browse files
committed
fix: stabilize transfer expiry and link checks
1 parent 27f11bb commit 39d059e

3 files changed

Lines changed: 28 additions & 16 deletions

File tree

internal/transfer/service_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ func TestExpirySchedulerDeletesIdleShareAndCompletedJobWithoutAccessOrRestart(t
595595
db, storage, box, owner, server, _ := newTransferServiceData(t)
596596
client := db.TailClient.Create().SetUserID(owner.ID).SetName("expiry-client").SetServerTokenCipher([]byte("cipher")).SetTokenHint("hint").SaveX(t.Context())
597597
service := newLoopbackTransferService(t, db, storage, box, owner.ID, client.ID, server.ID)
598-
expiresAt := time.Now().Add(250 * time.Millisecond)
598+
expiresAt := time.Now().Add(5 * time.Second)
599599

600600
idleShare, err := service.CreateShare(t.Context(), owner.ID, CreateShareInput{ServerID: server.ID, ExpiresAt: expiresAt})
601601
if err != nil {
@@ -627,7 +627,7 @@ func TestExpirySchedulerDeletesIdleShareAndCompletedJobWithoutAccessOrRestart(t
627627
}
628628
waitForTransferJobStatus(t, db, job.ID, transferjob.StatusCompleted)
629629

630-
deadline := time.Now().Add(3 * time.Second)
630+
deadline := expiresAt.Add(3 * time.Second)
631631
for time.Now().Before(deadline) {
632632
shareExists := db.TransferShare.Query().Where(transfershare.IDEQ(idleShare.ID)).ExistX(t.Context())
633633
jobExists := db.TransferJob.Query().Where(transferjob.IDEQ(job.ID)).ExistX(t.Context())
@@ -2610,7 +2610,14 @@ func waitForTransferJobStatus(t *testing.T, db *ent.Client, jobID string, want t
26102610
t.Helper()
26112611
deadline := time.Now().Add(5 * time.Second)
26122612
for {
2613-
status := db.TransferJob.GetX(t.Context(), jobID).Status
2613+
row, err := db.TransferJob.Get(t.Context(), jobID)
2614+
if ent.IsNotFound(err) {
2615+
t.Fatalf("job %s was deleted before reaching status %s", jobID, want)
2616+
}
2617+
if err != nil {
2618+
t.Fatalf("load job %s while waiting for status %s: %v", jobID, want, err)
2619+
}
2620+
status := row.Status
26142621
if status == want {
26152622
return
26162623
}

internal/transfer/storage.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -991,19 +991,24 @@ func (s *Storage) CleanupTemps(ctx context.Context, ownerID, shareID string) (re
991991
if linkErr != nil {
992992
return removed, linkErr
993993
}
994-
if available && links == 2 {
995-
outcome, recoverErr := s.recoverTempAlias(shareRoot, entry.Name())
996-
if outcome.aliasRemoved {
997-
removed++
998-
directoryDirty = true
999-
}
1000-
if recoverErr != nil {
1001-
return removed, recoverErr
994+
if available {
995+
if links == 2 {
996+
outcome, recoverErr := s.recoverTempAlias(shareRoot, entry.Name())
997+
if outcome.aliasRemoved {
998+
removed++
999+
directoryDirty = true
1000+
}
1001+
if recoverErr != nil {
1002+
return removed, recoverErr
1003+
}
1004+
if !outcome.finalValidated {
1005+
return removed, ErrFileChanged
1006+
}
1007+
continue
10021008
}
1003-
if !outcome.finalValidated {
1004-
return removed, ErrFileChanged
1009+
if links != 1 {
1010+
return removed, ErrMultipleLinks
10051011
}
1006-
continue
10071012
}
10081013
if err := validateStoredFileInfo(info); err != nil {
10091014
return removed, err

internal/transfer/storage_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func TestNewStorageRequiresSafeRootAndCreatesPrivateDirectories(t *testing.T) {
5151
if err != nil {
5252
t.Fatalf("Stat(%q): %v", path, err)
5353
}
54-
if got := info.Mode().Perm(); got != 0o700 {
54+
if got := info.Mode().Perm(); runtime.GOOS != "windows" && got != 0o700 {
5555
t.Errorf("mode for %q = %o, want 700", path, got)
5656
}
5757
}
@@ -825,7 +825,7 @@ func TestStorePublishesAtomicallyAndRemoveReleasesCommittedQuota(t *testing.T) {
825825
if err != nil {
826826
t.Fatalf("Stat stored file: %v", err)
827827
}
828-
if got := info.Mode().Perm(); got != 0o600 {
828+
if got := info.Mode().Perm(); runtime.GOOS != "windows" && got != 0o600 {
829829
t.Errorf("stored mode = %o, want 600", got)
830830
}
831831
if got := requireUsage(t, storage); got != (QuotaUsage{OwnerBytes: 3, OwnerFiles: 1, ShareBytes: 3, ShareFiles: 1}) {

0 commit comments

Comments
 (0)