Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error: curl_multi_add_handle: 8 #196

Open
a-cakir opened this issue Jun 7, 2022 · 19 comments
Open

Error: curl_multi_add_handle: 8 #196

a-cakir opened this issue Jun 7, 2022 · 19 comments

Comments

@a-cakir
Copy link

a-cakir commented Jun 7, 2022

I ran into the Error: curl_multi_add_handle: 8 error, though sporadically. The interesting part is that the error did not stop the code execution, which I dont know enough about the details of the Downloads.jl module to know if that makes sense or not.

The julia version that I am using is 1.7.3

The error I got is below (Repeated countless of times)

┌ Error: curl_multi_add_handle: 8

@ericphanson

@a-cakir a-cakir changed the title Error: curl_multi_socket_action: 8 Error: curl_multi_add_handle: 8 Jun 7, 2022
@ericphanson
Copy link
Contributor

The interesting part is that the error did not stop the code execution

That's because this error is done as a logging statement instead of throwing an exception. I don't know why, maybe intervention isn't needed or something?

According to https://curl.se/libcurl/c/curl_multi_add_handle.html curl_multi_add_handle return a CURLM code, and according to https://curl.se/libcurl/c/libcurl-errors.html this is

CURLM_RECURSIVE_API_CALL (8)

An API function was called from inside a callback.

Was this in an asyncmap or other parallelism BTW @a-cakir?

@a-cakir
Copy link
Author

a-cakir commented Jun 7, 2022

Yes, it was in asyncmap. No other parallelism was used.

@ericphanson
Copy link
Contributor

ericphanson commented Jun 7, 2022

I don't know if this is the same issue, but just now (good timing!) I ctrl-c'd while downloading something and got

^CUnhandled Task ERROR: InterruptException:
Stacktrace:
 [1] curl_multi_socket_action
   @ ~/.asdf/installs/julia/1.7.3/share/julia/stdlib/v1.7/Downloads/src/Curl/Curl.jl:48 [inlined]
 [2] curl_multi_socket_action
   @ ~/.asdf/installs/julia/1.7.3/share/julia/stdlib/v1.7/Downloads/src/Curl/Curl.jl:56 [inlined]
 [3] macro expansion
   @ ~/.asdf/installs/julia/1.7.3/share/julia/stdlib/v1.7/Downloads/src/Curl/utils.jl:28 [inlined]
 [4] (::Downloads.Curl.var"#41#47"{UInt8, Int32, FileWatching.FDWatcher, Downloads.Curl.Multi})()
   @ Downloads.Curl ~/.asdf/installs/julia/1.7.3/share/julia/stdlib/v1.7/Downloads/src/Curl/Multi.jl:176
 [5] lock(f::Downloads.Curl.var"#41#47"{UInt8, Int32, FileWatching.FDWatcher, Downloads.Curl.Multi}, l::ReentrantLock)
   @ Base ./lock.jl:190
 [6] macro expansion
   @ ~/.asdf/installs/julia/1.7.3/share/julia/stdlib/v1.7/Downloads/src/Curl/Multi.jl:174 [inlined]
 [7] (::Downloads.Curl.var"#40#46"{Int32, FileWatching.FDWatcher, Downloads.Curl.Multi})()
   @ Downloads.Curl ./task.jl:429
┌ Error: curl_multi_socket_action: 8
└ @ Downloads.Curl /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/Downloads/src/Curl/utils.jl:29
^C

Then when I tried to download again, I got more

┌ Error: curl_multi_add_handle: 8
└ @ Downloads.Curl /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/Downloads/src/Curl/utils.jl:29

Then I cleared the Downloader, with

julia> using AWS

julia> AWS.AWS_DOWNLOADER[] = nothing

and it seemed to fix it.

Did you also ctrl-c something before getting the error messages @a-cakir?

@a-cakir
Copy link
Author

a-cakir commented Jun 7, 2022

I did also ctrl-c but I cannot fully recall if I started seeing this error only after the ctrl-c unfortunately.

@a-cakir
Copy link
Author

a-cakir commented Jun 8, 2022

The same error again and it only started appearing after Ctrl-C. And your suggestion above seems to fix it.

@ericphanson
Copy link
Contributor

Ok, good! I am guessing the issue then is corruption of downloader state on interrupt. Seems like Downloads.jl is missing some handling of this.

@StefanKarpinski
Copy link
Member

@vtjnash, would it be possible to rig up our interrupt handling to blow the download object away? Or is it possible for us to handle interrupts more gracefully some other way?

@vtjnash
Copy link
Member

vtjnash commented Jun 9, 2022

There is no safe or reliable way to recover from this that I know

@StefanKarpinski
Copy link
Member

StefanKarpinski commented Jun 9, 2022

C'mon, yes, there's nothing fully reliable that can be done, but is there something less than 100% reliable that can be done? Most software manages to not completely shit the bed when someone does ctrl-C.

@vtjnash
Copy link
Member

vtjnash commented Jun 9, 2022

you probably need to wrap every cfunction with a try/catch block so that you never accidentally unwind from inside a callback with an error

@StefanKarpinski
Copy link
Member

Ok, so all the cfunctions should instead return with an error code indicating failure? I can try that.

@ericphanson
Copy link
Contributor

FWIW I see this on 1.8 too

@StefanKarpinski
Copy link
Member

StefanKarpinski commented Sep 22, 2022

Ok, I finally got around to trying this and putting try/catch blocks in cfunctions seems to interact badly with libuv's getaddrinfo thread stuff. With this patch:

diff --git a/src/Curl/Easy.jl b/src/Curl/Easy.jl
index 64fd159..59025ab 100644
--- a/src/Curl/Easy.jl
+++ b/src/Curl/Easy.jl
@@ -315,11 +315,15 @@ function header_callback(
     count  :: Csize_t,
     easy_p :: Ptr{Cvoid},
 )::Csize_t
-    easy = unsafe_pointer_to_objref(easy_p)::Easy
-    n = size * count
-    hdr = unsafe_string(data, n)
-    push!(easy.res_hdrs, hdr)
-    return n
+    try
+        easy = unsafe_pointer_to_objref(easy_p)::Easy
+        n = size * count
+        hdr = unsafe_string(data, n)
+        push!(easy.res_hdrs, hdr)
+        return n
+    catch
+        return -1
+    end
 end

 # feed data to read_callback

I get this error while trying to do multiple downloads from different tasks:

@testset "concurrent requests" begin
    mine = Downloader()
    for downloader in (nothing, mine)
        have_lsof = Sys.which("lsof") !== nothing
        count_tcp() = Base.count(x->contains("TCP",x), split(read(`lsof -p $(getpid())`, String), '\n'))
        if have_lsof
            n_tcp = count_tcp()
        end
        delay = 2
        count = 100
        url = "$server/delay/$delay"
        t = @elapsed @sync for id = 1:count
            @async begin
                json = download_json("$url?id=$id", downloader = downloader)
                @test get(json["args"], "id", nothing) == ["$id"]
            end
        end
        @test t < 0.9*count*delay
        if have_lsof
            @test n_tcp == count_tcp()
        end
    end
end

Error:

nested task error: RequestError: getaddrinfo() thread failed to start while requesting https://httpbingo.julialang.org/delay/2?id=53
Stacktrace:
  [1] (::Downloads.var"#9#18"{IOBuffer, Base.DevNull, Nothing, Vector{Pair{String, String}}, Float64, Nothing, Bool, Nothing, Bool, String, Bool, Bool})(easy::Easy)
    @ Downloads ~/dev/Downloads/src/Downloads.jl:388

@StefanKarpinski
Copy link
Member

With #205 I don't get that error anymore, so I can try comprehensively adding try/catch blocks to all the callbacks.

StefanKarpinski added a commit that referenced this issue Oct 1, 2022
This may help #196. The
issue there may be that callback functions raise Julia errors sometimes
(they shouldn't but stuff happens, ya know?). This wraps each one in a
try/catch block and logs an "unkonwn error" message if that happens and
returns from the callback with an appropriate return code to indicate
error. The libcurl docs aren't super clear on these and this is hard to
test so hopefully I got it right, but we'll see. Should be better.
@StefanKarpinski
Copy link
Member

Any feedback here? I don't know if anyone has gotten to try a nightly Julia out but this might be fixed there.

@StefanKarpinski
Copy link
Member

I'm going to close this for now. Please comment if you encounter this on nightly and we can reopen.

@maleadt
Copy link
Member

maleadt commented Sep 25, 2023

I just encountered this again on 1.10-beta2. Doing some PkgEval development, I hit CTRL-C to interrupt an operation I had started. I had to mash CTRL-C a couple of times to actually get my REPL back, as can be seen in the following output:

julia> df = evaluate([bad], [package])
^CUnhandled Task ERROR: InterruptException:==========>    ]  87.9 %
Stacktrace:
 [1] curl_multi_socket_action
   @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/Curl.jl:50 [inlined]
 [2] curl_multi_socket_action
   @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/Curl.jl:58 [inlined]
 [3] macro expansion
   @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/utils.jl:56 [inlined]
 [4] (::Downloads.Curl.var"#55#62"{UInt8, Int32, FileWatching.FDWatcher, Downloads.Curl.Multi})()
   @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/Multi.jl:186
 [5] lock(f::Downloads.Curl.var"#55#62"{UInt8, Int32, FileWatching.FDWatcher, Downloads.Curl.Multi}, l::ReentrantLock)
   @ Base ./lock.jl:229
 [6] (::Downloads.Curl.var"#54#61"{Int32, FileWatching.FDWatcher, Downloads.Curl.Multi})()
   @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/Multi.jl:184
^[[A^[[H┌ Error: curl_multi_socket_action: 8
└ @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/utils.jl:57
  ┌ Error: curl_multi_remove_handle: 8
└ @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/utils.jl:57
^C┌ Error: Failed to get JuliaRegistries/General registry from package server
│   exception =
│    InterruptException:
│    Stacktrace:
│      [1] try_yieldto(undo::typeof(Base.ensure_rescheduled))
│        @ Base ./task.jl:931
│      [2] wait()
│        @ Base ./task.jl:995
│      [3] wait(c::Base.GenericCondition{Base.Threads.SpinLock}; first::Bool)
│        @ Base ./condition.jl:130
│      [4] wait
│        @ Base ./condition.jl:125 [inlined]
│      [5] _trywait(t::Timer)
│        @ Base ./asyncevent.jl:138
│      [6] wait
│        @ Base ./asyncevent.jl:155 [inlined]
│      [7] sleep(sec::Float64)
│        @ Base ./asyncevent.jl:240
│      [8] (::Base.var"#96#98"{Base.var"#96#97#99"{Vector{Float64}, Nothing, Pkg.PlatformEngines.var"#21#22"{Bool, Bool, String, String}}})(; kwargs::@Kwargs{})
│        @ Base ./error.jl:304
│      [9] #96
│        @ Base ./error.jl:291 [inlined]
│     [10] download_verify(url::String, hash::Nothing, dest::String; verbose::Bool, force::Bool, quiet_download::Bool)
│        @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:356
│     [11] download_verify
│        @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:318 [inlined]
│     [12] download_verify_unpack(url::String, hash::Nothing, dest::String; tarball_path::Nothing, ignore_existence::Bool, force::Bool, verbose::Bool, quiet_download::Bool, io::Base.TTY)
│        @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:503
│     [13] get_pkgserver_registry(requested_uuid::Base.UUID)
│        @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:50
│     [14] (::PkgEval.var"#6#7"{Configuration})()
│        @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:16
│     [15] lock(f::PkgEval.var"#6#7"{Configuration}, l::ReentrantLock)
│        @ Base ./lock.jl:229
│     [16] get_registry
│        @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:8 [inlined]
│     [17] evaluate(configs::Vector{Configuration}, packages::Vector{Package}; ninstances::Int64, retry::Bool, validate::Bool, blacklist::Vector{String})
│        @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1109
│     [18] evaluate(configs::Vector{Configuration}, packages::Vector{Package})
│        @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1058
│     [19] top-level scope
│        @ REPL[11]:1
│     [20] eval
│        @ Core ./boot.jl:383 [inlined]
│     [21] eval_user_input(ast::Any, backend::REPL.REPLBackend, mod::Module)
│        @ REPL ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
│     [22] repl_backend_loop(backend::REPL.REPLBackend, get_module::Function)
│        @ REPL ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
│     [23] start_repl_backend(backend::REPL.REPLBackend, consumer::Any; get_module::Function)
│        @ REPL ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
│     [24] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool, backend::Any)
│        @ REPL ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
│     [25] run_repl(repl::REPL.AbstractREPL, consumer::Any)
│        @ REPL ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
│     [26] (::Base.var"#1012#1014"{Bool, Bool, Bool})(REPL::Module)
│        @ Base ./client.jl:432
│     [27] #invokelatest#2
│        @ Base ./essentials.jl:887 [inlined]
│     [28] invokelatest
│        @ Base ./essentials.jl:884 [inlined]
│     [29] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
│        @ Base ./client.jl:416
│     [30] exec_options(opts::Base.JLOptions)
│        @ Base ./client.jl:333
│     [31] _start()
│        @ Base ./client.jl:552
└ @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:18

^Cfetch-pack: unexpected disconnect while reading sideband packet
ERROR: InterruptException:
Stacktrace:
  [1] poptask(W::Base.IntrusiveLinkedListSynchronized{Task})
    @ Base ./task.jl:985
  [2] wait()
    @ Base ./task.jl:994
  [3] wait(c::Base.GenericCondition{Base.Threads.SpinLock}; first::Bool)
    @ Base ./condition.jl:130
  [4] wait
    @ Base ./condition.jl:125 [inlined]
  [5] wait(x::Base.Process)
    @ Base ./process.jl:661
  [6] success
    @ Base ./process.jl:523 [inlined]
  [7] run(::Cmd; wait::Bool)
    @ Base ./process.jl:480
  [8] run
    @ PkgEval ./process.jl:477 [inlined]
  [9] get_github_checkout(repo::String, ref::String)
    @ PkgEval ~/Julia/pkg/PkgEval/src/utils.jl:27
 [10] (::PkgEval.var"#6#7"{Configuration})()
    @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:19
 [11] lock(f::PkgEval.var"#6#7"{Configuration}, l::ReentrantLock)
    @ Base ./lock.jl:229
 [12] get_registry
    @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:8 [inlined]
 [13] evaluate(configs::Vector{…}, packages::Vector{…}; ninstances::Int64, retry::Bool, validate::Bool, blacklist::Vector{…})
    @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1109
 [14] evaluate(configs::Vector{Configuration}, packages::Vector{Package})
    @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1058
 [15] top-level scope
    @ REPL[11]:1

caused by: InterruptException:
Stacktrace:
  [1] try_yieldto(undo::typeof(Base.ensure_rescheduled))
    @ Base ./task.jl:931
  [2] wait()
    @ Base ./task.jl:995
  [3] wait(c::Base.GenericCondition{Base.Threads.SpinLock}; first::Bool)
    @ Base ./condition.jl:130
  [4] wait
    @ Base ./condition.jl:125 [inlined]
  [5] _trywait(t::Timer)
    @ Base ./asyncevent.jl:138
  [6] wait
    @ Base ./asyncevent.jl:155 [inlined]
  [7] sleep(sec::Float64)
    @ Base ./asyncevent.jl:240
  [8] (::Base.var"#96#98"{Base.var"#96#97#99"{Vector{…}, Nothing, Pkg.PlatformEngines.var"#21#22"{…}}})(; kwargs::@Kwargs{})
    @ Base ./error.jl:304
  [9] #96
    @ Base ./error.jl:291 [inlined]
 [10] download_verify(url::String, hash::Nothing, dest::String; verbose::Bool, force::Bool, quiet_download::Bool)
    @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:356
 [11] download_verify
    @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:318 [inlined]
 [12]
    @ Pkg.PlatformEngines ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Pkg/src/PlatformEngines.jl:503
 [13] get_pkgserver_registry(requested_uuid::Base.UUID)
    @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:50
 [14] (::PkgEval.var"#6#7"{Configuration})()
    @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:16
 [15] lock(f::PkgEval.var"#6#7"{Configuration}, l::ReentrantLock)
    @ Base ./lock.jl:229
 [16] get_registry
    @ PkgEval ~/Julia/pkg/PkgEval/src/registry.jl:8 [inlined]
 [17] evaluate(configs::Vector{…}, packages::Vector{…}; ninstances::Int64, retry::Bool, validate::Bool, blacklist::Vector{…})
    @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1109
 [18] evaluate(configs::Vector{Configuration}, packages::Vector{Package})
    @ PkgEval ~/Julia/pkg/PkgEval/src/evaluate.jl:1058
 [19] top-level scope
    @ REPL[11]:1
Some type information was truncated. Use `show(err)` to see complete types.

Interestingly, when I wanted to perform the call again afterwards, some of the delayed interrupts (presumably resulting from me mashing CTRL-C) got delivered without me actually pressing CTRL-C:

julia> df = evaluate([good], [package])
┌ Error: curl_multi_add_handle: 8
└ @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/utils.jl:57
^CERROR: InterruptException:
Stacktrace:
  [1] try_yieldto(undo::typeof(Base.ensure_rescheduled))
    @ Base ./task.jl:931
  [2] wait()
    @ Base ./task.jl:995
  [3] wait(c::Base.GenericCondition{ReentrantLock}; first::Bool)
    @ Base ./condition.jl:130
  [4] wait
    @ Base ./condition.jl:125 [inlined]
  [5] take_buffered(c::Channel{Any})
    @ Base ./channels.jl:458
  [6] take!
    @ Base ./channels.jl:452 [inlined]
  [7] sync_end(c::Channel{Any})
    @ Base.Experimental ./experimental.jl:64
  [8] macro expansion
    @ Downloads ./experimental.jl:102 [inlined]
  [9] (::Downloads.var"#9#18"{…})(easy::Downloads.Curl.Easy)
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:375
 [10] with_handle(f::Downloads.var"#9#18"{…}, handle::Downloads.Curl.Easy)
    @ Downloads.Curl ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Curl/Curl.jl:94
 [11] #8
    @ ArgTools ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:338 [inlined]
 [12] arg_write(f::Downloads.var"#8#17"{…}, arg::IOBuffer)
    @ ArgTools ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/ArgTools/src/ArgTools.jl:134
 [13] #7
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:337 [inlined]
 [14] arg_read
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/ArgTools/src/ArgTools.jl:76 [inlined]
 [15] request(url::String; input::Nothing, output::IOBuffer, method::Nothing, headers::Vector{…}, timeout::Float64, progress::Nothing, verbose::Bool, debug::Nothing, throw::Bool, downloader::Nothing)
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:336
 [16] request
    @ ArgTools ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:304 [inlined]
 [17] #3
    @ ArgTools ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:242 [inlined]
 [18] arg_write(f::Downloads.var"#3#4"{Nothing, Vector{…}, Float64, Nothing, Bool, Nothing, Nothing, String}, arg::IOBuffer)
    @ ArgTools ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/ArgTools/src/ArgTools.jl:134
 [19] #download#2
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:241 [inlined]
 [20] download
    @ Downloads ~/Julia/depot/juliaup/julia-1.10.0-beta2+0.x64.linux.gnu/share/julia/stdlib/v1.10/Downloads/src/Downloads.jl:230 [inlined]

i.e. despite the ^C in the output above I never pressed CTRL-C. This happened a couple of times more, after which I could successfully invoke my package's code again.

@maleadt maleadt reopened this Sep 25, 2023
@StefanKarpinski
Copy link
Member

I'm really not sure that we can expect this package to defend against all possible ctrl-c mashing that can be done. Jameson has already told us that it's basically impossible to reliably recover from and we're doing what we can.

@maleadt
Copy link
Member

maleadt commented Oct 7, 2023

Fair enough.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants