Module: Etna::Filesystem::WithPipeConsumer

Included in:
AsperaCliFilesystem
Defined in:
lib/etna/filesystem.rb

Instance Method Summary collapse

Instance Method Details

#mkio(file, opts, size_hint: nil, &block) ⇒ Object

Raises:

  • (IOError)


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/etna/filesystem.rb', line 44

def mkio(file, opts, size_hint: nil, &block)
  rd, wd = IO.pipe

  pid = spawn(*mkcommand(rd, wd, file, opts, size_hint: size_hint))
  q = Queue.new

  closer = Thread.new do
    _, status = Process.wait2 pid
    q << status
  end

  begin
    if opts.include?('w')
      rd.close
      yield wd
      wd.close
    else
      wd.close
      yield rd
      rd.close
    end

    closer.join
  rescue => e
    wd.close
    rd.close
    Process.kill("HUP", pid)
    raise e
  end

  status = q.pop
  raise IOError.new("Failed to run external process, got status code #{status}") unless status.success?
end