Module: Etna::Filesystem::WithPipeConsumer

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

Instance Method Summary collapse

Instance Method Details

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

Raises:

  • (IOError)


69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/etna/filesystem.rb', line 69

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

  cmd = mkcommand(rd, wd, file, opts, size_hint: size_hint)
  puts "in mkio: #{cmd}"
  pid = spawn(*cmd)
  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