Fix flaky FUSE integration tests
- concurrent_operations_test: Add retry loop for transient I/O errors on file close during ConcurrentDirectoryOperations - git_operations_test: Wait for pushed objects to become visible through FUSE mount before cloning in Phase 3
This commit is contained in:
@@ -249,11 +249,18 @@ func testConcurrentDirectoryOperations(t *testing.T, framework *FuseTestFramewor
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create file in subdirectory
|
// Create file in subdirectory with retry for transient FUSE errors
|
||||||
testFile := filepath.Join(subDir, "test.txt")
|
testFile := filepath.Join(subDir, "test.txt")
|
||||||
content := []byte(fmt.Sprintf("Worker %d, Subdir %d", workerID, i))
|
content := []byte(fmt.Sprintf("Worker %d, Subdir %d", workerID, i))
|
||||||
if err := os.WriteFile(testFile, content, 0644); err != nil {
|
var writeErr error
|
||||||
addError(fmt.Errorf("worker %d file %d: %v", workerID, i, err))
|
for attempt := 0; attempt < 3; attempt++ {
|
||||||
|
if writeErr = os.WriteFile(testFile, content, 0644); writeErr == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
}
|
||||||
|
if writeErr != nil {
|
||||||
|
addError(fmt.Errorf("worker %d file %d: %v", workerID, i, writeErr))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,13 @@ func testGitCloneAndPull(t *testing.T, mountPoint, localDir string) {
|
|||||||
branch := gitOutput(t, localClone, "rev-parse", "--abbrev-ref", "HEAD")
|
branch := gitOutput(t, localClone, "rev-parse", "--abbrev-ref", "HEAD")
|
||||||
gitRun(t, localClone, "push", "origin", branch)
|
gitRun(t, localClone, "push", "origin", branch)
|
||||||
|
|
||||||
|
// Wait for pushed objects to become visible through the FUSE mount.
|
||||||
|
// After git push, pack objects may not be immediately consistent on
|
||||||
|
// the FUSE layer, causing clone to fail with "nonexistent object".
|
||||||
|
waitForBareRepoEventually(t, bareRepo, 10*time.Second)
|
||||||
|
refreshDirEntry(t, bareRepo)
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
// ---- Phase 3: Clone from mount bare repo into on-mount working dir ----
|
// ---- Phase 3: Clone from mount bare repo into on-mount working dir ----
|
||||||
t.Log("Phase 3: clone from mount bare repo to on-mount working dir")
|
t.Log("Phase 3: clone from mount bare repo to on-mount working dir")
|
||||||
gitRun(t, "", "clone", bareRepo, mountClone)
|
gitRun(t, "", "clone", bareRepo, mountClone)
|
||||||
|
|||||||
Reference in New Issue
Block a user