I think you need to wait for the deferred returned by the Writer.of_pipe
:
open! Core
open! Async
let () =
let open Command.Let_syntax in
Command.async
~summary:"Failure"
[%map_open
let () = return () in
fun () ->
let open Deferred.Let_syntax in
let stdout = Writer.stdout |> force in
let sp = Writer.pipe stdout in
let w = Pipe.create_writer (fun reader ->
Pipe.transfer_id reader sp)
in
let i = Info.of_string "" in
let%bind stdout, `Closed_and_flushed_downstream deferred = Writer.of_pipe i w in
Writer.write_line stdout "Hest";
let%bind () = Writer.close stdout in
deferred
]
|> Command.run
I’m not 100% if this is the bug you’re experiencing, since I get about a 3% failure rate with your original code, but waiting for that deferred seems to make the bug disappear.