Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion src/ptrworker.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ Malt.isrunning(wrkr::PTRWorker) = Malt.isrunning(wrkr.w)
Malt.stop(wrkr::PTRWorker) = Malt.stop(wrkr.w)


# Starting a worker can fail for reasons that have nothing to do with the tests, e.g., when
# a heavily loaded system delays it past Malt's deadline for reporting its port. Such a
# failure would abort the whole run, so try again before giving up.
const WORKER_SPAWN_ATTEMPTS = 3

function spawn_worker(; kwargs...)
for attempt in 1:WORKER_SPAWN_ATTEMPTS
try
return PTRWorker(; kwargs...)
catch err
(err isa InterruptException || attempt == WORKER_SPAWN_ATTEMPTS) && rethrow()
end
end
end


function test_exe(color::Bool=false)
test_exeflags = Base.julia_cmd()
push!(test_exeflags.exec, "--project=$(Base.active_project())")
Expand Down Expand Up @@ -98,7 +114,7 @@ function addworker(;
push!(worker_env, "JULIA_NUM_THREADS" => "1")
# Malt already sets OPENBLAS_NUM_THREADS to 1
push!(worker_env, "OPENBLAS_NUM_THREADS" => "1")
wrkr = PTRWorker(; exename, exeflags, env = worker_env)
wrkr = spawn_worker(; exename, exeflags, env = worker_env)
# make ParallelTestRunner available to `init_worker_code`; users commonly
# need it to reference `AbstractTestRecord`, `execute`, etc. when defining
# custom record types.
Expand Down
19 changes: 19 additions & 0 deletions test/workers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,25 @@ end
@test contains(str, "SUCCESS")
end

@testset "worker that fails to start" begin
# a launcher whose first worker fails before reporting its port, like one that misses
# Malt's deadline on a loaded system (printing something else fails it right away)
marker = tempname()
launcher = """
marker = popfirst!(ARGS)
isfile(marker) || (touch(marker); println("not a port"); exit(1))
run(`\$(Base.julia_cmd()[1]) \$ARGS`)
"""
exename = `$(Base.julia_cmd()[1]) --startup-file=no -e $launcher -- $marker`
testsuite = Dict("test" => :(@test true))

io = IOBuffer()
runtests(ParallelTestRunner, String[]; testsuite, exename, stdout=io, stderr=io)
str = String(take!(io))
@test isfile(marker)
@test contains(str, "SUCCESS")
end

@testset "custom worker with `init_worker_code`" begin
init_worker_code = quote
should_be_defined() = true
Expand Down
Loading