localjob 0.0.2 → 0.1.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 +4 -4
- data/README.md +4 -5
- data/ext/mkrf_conf.rb +3 -16
- data/lib/localjob.rb +2 -7
- data/lib/localjob/channel.rb +4 -6
- data/lib/localjob/linux_adapter.rb +2 -0
- data/lib/localjob/sysv_adapter.rb +45 -0
- data/lib/localjob/version.rb +1 -1
- data/localjob.gemspec +1 -0
- data/test/worker_test.rb +23 -18
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f5d7728e5e75545f1d311af3eb4e255bcbe30df
|
4
|
+
data.tar.gz: 1f5fcded093681ad2a958b53b7d3736bde363143
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd25abafa772e5054f214a13a0143580efb81ab942a2d8406aa2ca4872881b82553dfa36bc7da50a407ce3ff77d863b581781fd5f802cdf053b6b3b6872e2439
|
7
|
+
data.tar.gz: 8ffec91938da80ad655ea0b95e8238b9a7eb2eeff8e44eb56bc11fdd257202677733dc4ef5ba431fa61878b2260a03dbc1ce4e4f4b905229edc3437caab9b1c0
|
data/README.md
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
Localjob is a simple, self-contained background queue built on top of [POSIX
|
4
4
|
message queues][pmq]. Workers and the app pushing to the queue must reside on
|
5
|
-
the same machine. It's the sqlite of background queues
|
6
|
-
|
5
|
+
the same machine. It's the sqlite of background queues. Here's a post about [how
|
6
|
+
it works][blog].
|
7
7
|
|
8
8
|
Localjob is for early-development situations where you don't need a
|
9
9
|
full-featured background queue, but just want to get started with something
|
@@ -17,13 +17,12 @@ parameters for your application**, please consult [posix-mqueue][pmq-gem]'s
|
|
17
17
|
documentation.
|
18
18
|
|
19
19
|
Localjob works on Ruby >= 2.0.0. On Linux, it will use the POSIX message queue.
|
20
|
-
On OS X
|
21
|
-
message queue, to aid you in testing and running Localjob in development.
|
20
|
+
On OS X it will use SysV message queues.
|
22
21
|
|
23
22
|
Add it to your Gemfile:
|
24
23
|
|
25
24
|
```ruby
|
26
|
-
gem 'localjob'
|
25
|
+
gem 'localjob', "0.1.0"
|
27
26
|
```
|
28
27
|
|
29
28
|
## Usage
|
data/ext/mkrf_conf.rb
CHANGED
@@ -1,17 +1,4 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rubygems/command.rb'
|
3
|
-
require 'rubygems/dependency_installer.rb'
|
4
|
-
begin
|
5
|
-
Gem::Command.build_args = ARGV
|
6
|
-
rescue NoMethodError
|
7
|
-
end
|
1
|
+
require 'rubygems/dependency_installer'
|
8
2
|
|
9
|
-
|
10
|
-
|
11
|
-
begin
|
12
|
-
if RUBY_PLATFORM =~ /linux/
|
13
|
-
inst.install "posix-mqueue", "0.0.7"
|
14
|
-
end
|
15
|
-
rescue
|
16
|
-
exit(1)
|
17
|
-
end
|
3
|
+
gem = Gem::DependencyInstaller.new
|
4
|
+
gem.install "posix-mqueue", "0.0.7" if RUBY_PLATFORM =~ /linux/
|
data/lib/localjob.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
begin
|
2
|
-
require 'posix/mqueue'
|
3
|
-
rescue LoadError
|
4
|
-
end
|
5
|
-
|
6
1
|
require 'yaml'
|
7
2
|
require 'logger'
|
8
3
|
require 'forwardable'
|
@@ -35,8 +30,8 @@ class Localjob
|
|
35
30
|
require 'localjob/linux_adapter'
|
36
31
|
@queue = LinuxAdapter.new(@name)
|
37
32
|
else
|
38
|
-
require 'localjob/
|
39
|
-
@queue =
|
33
|
+
require 'localjob/sysv_adapter'
|
34
|
+
@queue = SysvAdapter.new(@name)
|
40
35
|
end
|
41
36
|
end
|
42
37
|
|
data/lib/localjob/channel.rb
CHANGED
@@ -11,12 +11,10 @@ class Localjob
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def shift
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
retry
|
19
|
-
end
|
14
|
+
(queue,), = IO.select(@queues)
|
15
|
+
queue.shift
|
16
|
+
rescue POSIX::Mqueue::QueueEmpty
|
17
|
+
retry
|
20
18
|
end
|
21
19
|
|
22
20
|
private
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'SysVIPC'
|
2
|
+
|
3
|
+
class Localjob
|
4
|
+
class Channel
|
5
|
+
def shift
|
6
|
+
raise "SysV adapter does not support multiple queues" if @queues.size > 1
|
7
|
+
@queues.first.shift
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class SysvAdapter
|
12
|
+
include SysVIPC
|
13
|
+
attr_reader :mqueue
|
14
|
+
|
15
|
+
def initialize(name)
|
16
|
+
@filename = "/tmp/#{name}"
|
17
|
+
File.open(@filename, "w") { }
|
18
|
+
key = ftok(@filename, 0)
|
19
|
+
|
20
|
+
@mq = MessageQueue.new(key, IPC_CREAT | 0600)
|
21
|
+
end
|
22
|
+
|
23
|
+
def receive
|
24
|
+
@mq.receive(0, 8024)
|
25
|
+
end
|
26
|
+
|
27
|
+
def send(message)
|
28
|
+
@mq.send(1, message)
|
29
|
+
end
|
30
|
+
|
31
|
+
def size
|
32
|
+
@mq.ipc_stat.msg_qnum
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy
|
36
|
+
File.delete(@filename)
|
37
|
+
@mq.rm
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def fix_queue_name(name)
|
42
|
+
name.start_with?('/') ? name : "/#{name}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/localjob/version.rb
CHANGED
data/localjob.gemspec
CHANGED
data/test/worker_test.rb
CHANGED
@@ -42,23 +42,6 @@ class WorkerTest < LocaljobTestCase
|
|
42
42
|
assert_equal 0, @localjob.size
|
43
43
|
end
|
44
44
|
|
45
|
-
def test_workers_listen_on_multiple_queues
|
46
|
-
@localjob << WalrusJob.new("move")
|
47
|
-
|
48
|
-
other = queue("other-queue")
|
49
|
-
other << WalrusJob.new("dance")
|
50
|
-
|
51
|
-
@worker.channel << 'other-queue'
|
52
|
-
|
53
|
-
a = Thread.start { @worker.work }
|
54
|
-
|
55
|
-
sleep 0.01
|
56
|
-
a.kill
|
57
|
-
|
58
|
-
assert_equal 0, @localjob.size
|
59
|
-
assert_equal 0, other.size
|
60
|
-
end
|
61
|
-
|
62
45
|
def test_worker_doesnt_die_on_bad_serialization
|
63
46
|
@localjob.queue.send "--- !ruby/object:Whatever {}\n"
|
64
47
|
|
@@ -67,8 +50,10 @@ class WorkerTest < LocaljobTestCase
|
|
67
50
|
sleep 0.01
|
68
51
|
a.kill
|
69
52
|
end
|
70
|
-
|
53
|
+
|
71
54
|
on_platform 'linux' do
|
55
|
+
# This won't work on OS X because the SysV IPC gem apparently doesnt give us
|
56
|
+
# interrupt syscalls to give us signals.
|
72
57
|
def test_sigquit_terminates_the_worker
|
73
58
|
@localjob << WalrusJob.new("move")
|
74
59
|
|
@@ -76,10 +61,30 @@ class WorkerTest < LocaljobTestCase
|
|
76
61
|
|
77
62
|
pid = fork { @worker.work }
|
78
63
|
|
64
|
+
# Hack to account for race condition, 0.01s should be plenty
|
65
|
+
sleep 0.1
|
66
|
+
|
79
67
|
Process.kill("QUIT", pid)
|
80
68
|
Process.wait
|
81
69
|
|
82
70
|
assert_equal 0, @localjob.size
|
83
71
|
end
|
72
|
+
|
73
|
+
def test_workers_listen_on_multiple_queues
|
74
|
+
@localjob << WalrusJob.new("move")
|
75
|
+
|
76
|
+
other = queue("other-queue")
|
77
|
+
other << WalrusJob.new("dance")
|
78
|
+
|
79
|
+
@worker.channel << 'other-queue'
|
80
|
+
|
81
|
+
a = Thread.start { @worker.work }
|
82
|
+
|
83
|
+
sleep 0.01
|
84
|
+
a.kill
|
85
|
+
|
86
|
+
assert_equal 0, @localjob.size
|
87
|
+
assert_equal 0, other.size
|
88
|
+
end
|
84
89
|
end
|
85
90
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: localjob
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Eskildsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.18.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: SysVIPC
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,6 +102,7 @@ files:
|
|
88
102
|
- lib/localjob/cli.rb
|
89
103
|
- lib/localjob/linux_adapter.rb
|
90
104
|
- lib/localjob/mock_adapter.rb
|
105
|
+
- lib/localjob/sysv_adapter.rb
|
91
106
|
- lib/localjob/version.rb
|
92
107
|
- lib/localjob/worker.rb
|
93
108
|
- localjob.gemspec
|
@@ -127,3 +142,4 @@ test_files:
|
|
127
142
|
- test/mock_adapter.rb
|
128
143
|
- test/test_helper.rb
|
129
144
|
- test/worker_test.rb
|
145
|
+
has_rdoc:
|