sensu-spawn 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c59ce912fa389d190c82e3b8503bcd40f075826
4
- data.tar.gz: 268adebe9265c982e1511840163175d4c88d615e
3
+ metadata.gz: 933b1edd838b280c1c606e6a5fbdd4932e6e6582
4
+ data.tar.gz: 7944ef71e84a4e1fabcef50e8b4a590b10824612
5
5
  SHA512:
6
- metadata.gz: 766cf5892f5a83704a43f12b91b91a9c650de1c5bb1c8f4106983d50b54d6cd637ca4f5ce8beddc5c1e072e07bcb68cbbc6654eb47600338073c58df30754365
7
- data.tar.gz: 53893f509cec1de5ab94047f3259aaebd1aa2bdddb8f7c902898795d79917d8d34ada61b90812d60357dad5931a969b52e99e68dc2dbcb86c36e9a5c549e1521
6
+ metadata.gz: ec39a9080eee2e4f2f1e0e18df4481672b18964b589eb00137889b82c24a1670e87a43e2bec644fd64fbadbcc34777f00e2c9067f8b3c100b5f5af0da43f8bdf
7
+ data.tar.gz: 8d79c64a92832767ef052479dee5ba1847d71a7c28f9e2232a5e8e6f9b8cf2eab05b6e3ffb41e590729c8b99ae5fb1a93a8961bb67fdbcf67acaecf36fabc6e5
data/.travis.yml CHANGED
@@ -1,16 +1,12 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 1.8.7
5
- - 1.9.2
6
- - 1.9.3
7
4
  - 2.0.0
8
5
  - 2.1.0
6
+ - 2.2.0
9
7
  - 2.2.3
10
- - jruby-1.7.18
8
+ - 2.3.0
9
+ - jruby-9.0.5.0
11
10
  notifications:
12
11
  irc:
13
12
  - "irc.freenode.net#sensu"
14
- addons:
15
- code_climate:
16
- repo_token: 6e0d725a7d86b1565bc5a8cfa218cf9fb59811b8d4b030e62b6a4745da9f0f96
data/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## 2.2.0 - 2016-05-26
2
+
3
+ ### Fixes
4
+
5
+ Alternating between partial child process STDIN writes and STDOUT/ERR
6
+ reads, fixing the large STDIN write deadlock.
7
+
8
+ ## 2.1.0 - 2016-05-26
9
+
10
+ ### Fixes
11
+
12
+ Replaced ChildProcess poll_for_exit() with stdlib Timeout to fix large
13
+ child output deadlock.
14
+
15
+ ## 2.0.0 - 2016-05-16
16
+
17
+ ### Features
18
+
19
+ Configurable concurrent child process limit.
20
+
1
21
  ## 1.8.0 - 2016-03-16
2
22
 
3
23
  ### Fixes
data/lib/sensu/spawn.rb CHANGED
@@ -58,8 +58,19 @@ module Sensu
58
58
  # the current platform. ChildProcess supports POSIX Spawn for
59
59
  # several platforms (OSs & architectures), however, Sensu only
60
60
  # enables the use of POSIX Spawn on a select few.
61
+ #
62
+ # @return [TrueClass, FalseClass]
61
63
  def posix_spawn?
62
- @posix_spawn ||= POSIX_SPAWN_PLATFORMS.include?(ChildProcess.os)
64
+ return @posix_spawn unless @posix_spawn.nil?
65
+ @posix_spawn = POSIX_SPAWN_PLATFORMS.include?(ChildProcess.os)
66
+ end
67
+
68
+ # Determine if the current platform is Windows.
69
+ #
70
+ # @return [TrueClass, FalseClass]
71
+ def on_windows?
72
+ return @on_windows unless @on_windows.nil?
73
+ @on_windows = ChildProcess.windows?
63
74
  end
64
75
 
65
76
  # Build a child process attached to a pipe, in order to capture
@@ -71,8 +82,8 @@ module Sensu
71
82
  # @return [Array] child object, pipe reader, pipe writer.
72
83
  def build_child_process(command)
73
84
  reader, writer = IO.pipe
74
- shell = case RUBY_PLATFORM
75
- when /(ms|cyg|bcc)win|mingw|win32/
85
+ shell = case
86
+ when on_windows?
76
87
  ["cmd", "/c"]
77
88
  else
78
89
  ["sh", "-c"]
@@ -85,17 +96,31 @@ module Sensu
85
96
  [child, reader, writer]
86
97
  end
87
98
 
88
- # Read a stream/file until end of file (EOF).
99
+ # Write data to a stream/file and read a stream/file
100
+ # until end of file (EOF).
89
101
  #
90
- # @param [Object] reader to read contents of until EOF.
91
- # @return [String] the stream/file contents.
92
- def read_until_eof(reader)
102
+ # @param writer [Object] to write data to (optional).
103
+ # @param reader [Object] to read contents of until EOF.
104
+ # @param data [String] to be written to writer.
105
+ # @return [String] the reader stream/file contents.
106
+ def write_and_read(writer, reader, data)
107
+ buffer = (data || "").dup
93
108
  output = ""
94
- begin
95
- loop { output << reader.readpartial(8192) }
96
- rescue EOFError
109
+ loop do
110
+ unless buffer.empty?
111
+ writer.write(buffer.slice!(0, 8191))
112
+ writer.close if buffer.empty?
113
+ end
114
+ begin
115
+ readable, _ = IO.select([reader], nil, nil, 0)
116
+ if readable || buffer.empty?
117
+ output << reader.readpartial(8192)
118
+ end
119
+ rescue EOFError
120
+ reader.close
121
+ break
122
+ end
97
123
  end
98
- reader.close
99
124
  output
100
125
  end
101
126
 
@@ -122,17 +147,14 @@ module Sensu
122
147
  child.start
123
148
  end
124
149
  writer.close
125
- if options[:data]
126
- child.io.stdin.write(options[:data])
127
- child.io.stdin.close
128
- end
150
+ output = ""
129
151
  if options[:timeout]
130
- output = Timeout::timeout(options[:timeout], ChildProcess::TimeoutError) do
131
- read_until_eof(reader)
152
+ Timeout::timeout(options[:timeout], ChildProcess::TimeoutError) do
153
+ output = write_and_read(child.io.stdin, reader, options[:data])
154
+ child.wait
132
155
  end
133
- child.wait
134
156
  else
135
- output = read_until_eof(reader)
157
+ output = write_and_read(child.io.stdin, reader, options[:data])
136
158
  child.wait
137
159
  end
138
160
  [output, child.exit_code]
data/sensu-spawn.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "sensu-spawn"
5
- spec.version = "2.1.0"
5
+ spec.version = "2.2.0"
6
6
  spec.authors = ["Sean Porter"]
7
7
  spec.email = ["portertech@gmail.com"]
8
8
  spec.summary = "The Sensu spawn process library"
File without changes
data/spec/spawn_spec.rb CHANGED
@@ -19,7 +19,7 @@ describe "Sensu::Spawn" do
19
19
  end
20
20
 
21
21
  it "can spawn a process with output greater than 64KB" do |output, status|
22
- output_asset = "spec/assets/output_1MB"
22
+ output_asset = "spec/assets/1MB"
23
23
  expected_output = IO.read(output_asset)
24
24
  async_wrapper do
25
25
  Sensu::Spawn.process("cat #{output_asset}") do |output, status|
@@ -31,7 +31,7 @@ describe "Sensu::Spawn" do
31
31
  end
32
32
 
33
33
  it "can spawn a process with output greater than 64KB with a timeout" do |output, status|
34
- output_asset = "spec/assets/output_1MB"
34
+ output_asset = "spec/assets/1MB"
35
35
  expected_output = IO.read(output_asset)
36
36
  async_wrapper do
37
37
  Sensu::Spawn.process("cat #{output_asset}", :timeout => 10) do |output, status|
@@ -81,4 +81,26 @@ describe "Sensu::Spawn" do
81
81
  end
82
82
  end
83
83
  end
84
+
85
+ it "can spawn a process that reads input greater than 64KB from STDIN" do |output, status|
86
+ input_asset = IO.read("spec/assets/1MB")
87
+ async_wrapper do
88
+ Sensu::Spawn.process("cat", :data => input_asset) do |output, status|
89
+ expect(output).to eq(input_asset)
90
+ expect(status).to eq(0)
91
+ async_done
92
+ end
93
+ end
94
+ end
95
+
96
+ it "can spawn a process that reads from STDIN and does not output to STDOUT" do
97
+ input_asset = IO.read("spec/assets/1MB")
98
+ async_wrapper do
99
+ Sensu::Spawn.process("cat > /tmp/sensu-spawn-test", :data => input_asset) do |output, status|
100
+ expect(output).to eq("")
101
+ expect(status).to eq(0)
102
+ async_done
103
+ end
104
+ end
105
+ end
84
106
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-spawn
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Porter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-26 00:00:00.000000000 Z
11
+ date: 2016-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -110,7 +110,7 @@ files:
110
110
  - Rakefile
111
111
  - lib/sensu/spawn.rb
112
112
  - sensu-spawn.gemspec
113
- - spec/assets/output_1MB
113
+ - spec/assets/1MB
114
114
  - spec/helpers.rb
115
115
  - spec/spawn_spec.rb
116
116
  homepage: https://github.com/sensu/sensu-spawn
@@ -138,6 +138,6 @@ signing_key:
138
138
  specification_version: 4
139
139
  summary: The Sensu spawn process library
140
140
  test_files:
141
- - spec/assets/output_1MB
141
+ - spec/assets/1MB
142
142
  - spec/helpers.rb
143
143
  - spec/spawn_spec.rb