safe_regexp 0.2.1 → 0.2.2

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
  SHA256:
3
- metadata.gz: 7989a74f69ebade41d93d489dc195534a979ac9a85e985c6d6461a8db53d65f0
4
- data.tar.gz: 333a79c41170a8282832b908bbc71e86198b430f752746267b665deffaf998a0
3
+ metadata.gz: a08c39c5fefd324f445219dd0a9c1480fc6e7fb9a8d87d2a8c94cb8fe9ffe842
4
+ data.tar.gz: 5a0fcafc1b454f4cbb870d3ca5ec6052614688c6f1431cd9e413e2542e07a691
5
5
  SHA512:
6
- metadata.gz: 703a1ff819189b105b8a26c6ff78cb9670d0e898538759c05d807570b9a6eaf59cd78827185b8bc3dcd55e039aa2bb82cee63c26cfd1d7468f50cc14b9ec7948
7
- data.tar.gz: 7a91b3448c11a695ba54dd0beaf6011ee00e9809bd147f9dd96721e764c413efbab926fba3ea2ad450ae72c4a1fc07096bd76a0af627fece1df8044d01482717
6
+ metadata.gz: dfce8cc283436b706e02be017a6b5cc515255ff058b853c10cfbd9c568ae8e5e73f7e8f368a3fbf6bb97164cb6ec6caee1845973dc5e0e13f1147664fc972b65
7
+ data.tar.gz: 05ae09e0f259262cc3f5b93b6c180ecea9031efc8f17e1234b04d0720bc057707d959b0a978d2d0c0cb2021e4e3d68f0ba53a8623170ebded1c752a91ecc6331
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module SafeRegexp
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.2"
4
4
  end
data/lib/safe_regexp.rb CHANGED
@@ -9,22 +9,36 @@ module SafeRegexp
9
9
  class << self
10
10
  def execute(regex, method, string, timeout: 1, keepalive: 10)
11
11
  retried = false
12
+
12
13
  begin
13
- read, write, pid = executor
14
- Marshal.dump([regex, method, string, keepalive], write)
15
- rescue Errno::EPIPE # keepalive already killed the process
16
- raise if retried
14
+ loading_result = false
15
+
16
+ begin
17
+ read, write, pid = executor
18
+ Marshal.dump([regex, method, string, keepalive], write)
19
+ rescue Errno::EPIPE
20
+ # keepalive already killed the process, but we don't check before sending
21
+ # since that would be a race condition and cause overhead for the 99.9% case
22
+ raise if retried
23
+ retried = true
24
+ discard_executor # avoiding kill overhead since it's already dead
25
+ retry # new executor will be created by `executor` call
26
+ end
27
+
28
+ unless IO.select([read], nil, nil, timeout)
29
+ kill_executor pid
30
+ raise RegexpTimeout
31
+ end
32
+
33
+ loading_result = true
34
+ result = Marshal.load(read)
35
+ rescue EOFError # process was dead from keepalive when we sent to it or got killed from outside
36
+ raise if retried || !loading_result
17
37
  retried = true
18
38
  discard_executor # avoiding kill overhead since it's already dead
19
- retry # new executor will be created by `executor` call
20
- end
21
-
22
- unless IO.select([read], nil, nil, timeout)
23
- kill_executor pid
24
- raise RegexpTimeout
39
+ retry
25
40
  end
26
41
 
27
- result = Marshal.load(read)
28
42
  result.is_a?(RESCUED_EXCEPTION) ? raise(result) : result
29
43
  end
30
44
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_regexp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-01 00:00:00.000000000 Z
11
+ date: 2019-04-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: michael@grosser.it