Pmap and udp socket communication causes segmentation fault

I need to do some data processing in a highly parallel manner and want to track how many of it was done.
For that, I am using pmap and sending some message over UDP to signal that a single sample was processed (to send it to statsd to show it in grafana).

But sending something over UDP in pmap causes segfault:
minimal working code is here:

@everywhere using DrWatson
@everywhere @quickactivate
@everywhere using Sockets

@everywhere function make_client(ip, port, prefix)
    sock = UDPSocket()
    Base.bind(sock, ip, 0)
    Sockets.setopt(sock, enable_broadcast=1)
    (data)->send(sock, ip, port, string("$prefix.$data"))
end

@everywhere incr(c, metric) = count(c, metric, 1)
@everywhere count(c, metric,value) = c(string(metric,":",value,"|c"))

@everywhere client = make_client(IPv4(127, 0, 0, 1), 8125, "some.prefix.for.grafana")

for i in 1:20
    sleep(0.1)
    incr(client, "success")
    @info "sent to statsd, beep"
end


# this is not working for some reason
pmap(1:20) do i
    sleep(0.1)  # there be a function for processing the data
    incr(client, "success_pmap")
    @info "sent to statsd, beep"
end

@info "done everything"

Iā€™m running it as julia -p 10 <name of script>
and while the first, non-distributed loop runs ok, the pmap crashes with this:

From worker 6:    
      From worker 6:    signal (11): Segmentation fault
      From worker 6:    in expression starting at none:0
      From worker 6:    uv__udp_check_before_send at /workspace/srcdir/libuv/src/uv-common.c:364
      From worker 6:    uv_udp_send at /workspace/srcdir/libuv/src/uv-common.c:400
      From worker 6:    jl_udp_send at /buildworker/worker/package_linux64/build/src/jl_uv.c:738
      From worker 6:    _send_async at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Sockets/src/Sockets.jl:414
      From worker 6:    send at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Sockets/src/Sockets.jl:434
      From worker 6:    #3 at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:9 [inlined]
      From worker 6:    count at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:13
      From worker 6:    unknown function (ip: 0x7fc1c43115cd)
      From worker 6:    _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
      From worker 6:    jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
      From worker 6:    incr at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:12
      From worker 6:    _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
      From worker 6:    jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
      From worker 6:    #5 at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:30
      From worker 6:    unknown function (ip: 0x7fc1c4311422)
      From worker 6:    _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
      From worker 6:    jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
      From worker 6:    jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1631 [inlined]
      From worker 6:    jl_f__apply at /buildworker/worker/package_linux64/build/src/builtins.c:627
      From worker 6:    #108 at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:294
      From worker 6:    run_work_thunk at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:79
      From worker 6:    macro expansion at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:294 [inlined]
      From worker 6:    #107 at ./task.jl:333

and the same function for every worker.

Is there any reason why this happens?

1 Like