tupelo 0.7 → 0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -13
- data/bin/tup +37 -89
- data/example/child-of-child.rb +34 -0
- data/example/deadlock.rb +66 -0
- data/example/lease.rb +103 -0
- data/example/parallel.rb +100 -1
- data/example/remote-map-reduce.rb +2 -1
- data/example/zk/lock.rb +70 -0
- data/lib/tupelo/app.rb +72 -39
- data/lib/tupelo/archiver/persistent-tuplespace.rb +142 -0
- data/lib/tupelo/archiver/persister.rb +94 -0
- data/lib/tupelo/archiver/tuplespace.rb +3 -1
- data/lib/tupelo/archiver/worker.rb +18 -2
- data/lib/tupelo/archiver.rb +17 -7
- data/lib/tupelo/client/atdo.rb +31 -0
- data/lib/tupelo/client/transaction.rb +20 -4
- data/lib/tupelo/client/tuplespace.rb +1 -1
- data/lib/tupelo/client/worker.rb +18 -26
- data/lib/tupelo/tuplets/persistent-archiver/tuplespace.rb +86 -0
- data/lib/tupelo/tuplets/persistent-archiver/worker.rb +114 -0
- data/lib/tupelo/tuplets/persistent-archiver.rb +86 -0
- data/lib/tupelo/version.rb +1 -1
- data/test/lib/mock-client.rb +82 -12
- data/test/lib/mock-queue.rb +2 -2
- data/test/unit/test-mock-client.rb +103 -0
- data/test/unit/test-ops.rb +123 -89
- metadata +15 -3
data/test/unit/test-ops.rb
CHANGED
@@ -56,28 +56,16 @@ class TestOps < Minitest::Test
|
|
56
56
|
client.update; assert_equal [1], reader.resume
|
57
57
|
end
|
58
58
|
|
59
|
-
def test_two_clients
|
60
|
-
t = ["c0"]
|
61
|
-
cl = make_clients(2)
|
62
|
-
|
63
|
-
cl[0].write t
|
64
|
-
|
65
|
-
cl.each do |c|
|
66
|
-
reader = Fiber.new { c.read [nil] }; reader.resume
|
67
|
-
c.update; assert_equal t, reader.resume
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
59
|
def test_read_existing
|
72
60
|
t = ["foo"]
|
73
61
|
cl = make_clients(2)
|
74
62
|
|
75
|
-
|
76
|
-
|
77
|
-
|
63
|
+
w = cl[0].now {write t}
|
64
|
+
assert_equal 1, w.global_tick
|
65
|
+
|
78
66
|
cl.each do |c|
|
79
|
-
|
80
|
-
|
67
|
+
c.will {read [nil]}
|
68
|
+
assert_equal t, c.run
|
81
69
|
end
|
82
70
|
end
|
83
71
|
|
@@ -85,15 +73,16 @@ class TestOps < Minitest::Test
|
|
85
73
|
t = ["bar"]
|
86
74
|
cl = make_clients(2)
|
87
75
|
|
88
|
-
|
76
|
+
cl[1].will {read [nil]}.run_until_blocked
|
77
|
+
|
78
|
+
w = cl[0].now {write t}
|
79
|
+
assert_equal 1, w.global_tick
|
89
80
|
|
90
|
-
|
91
|
-
cl[0].update; assert_equal 1, wr.global_tick
|
92
|
-
cl[1].update; assert_equal t, reader.resume
|
81
|
+
assert_equal t, cl[1].run
|
93
82
|
|
94
83
|
cl.each do |c|
|
95
|
-
|
96
|
-
|
84
|
+
c.will {read [nil]}
|
85
|
+
assert_equal t, c.run
|
97
86
|
end
|
98
87
|
end
|
99
88
|
|
@@ -101,97 +90,99 @@ class TestOps < Minitest::Test
|
|
101
90
|
t = ["foo"]
|
102
91
|
cl = make_clients(2)
|
103
92
|
|
104
|
-
|
105
|
-
|
93
|
+
w = cl[0].now {write t}
|
94
|
+
assert_equal 1, w.global_tick
|
106
95
|
|
107
|
-
|
108
|
-
cl[1].
|
109
|
-
cl[1].update; assert_equal t, taker.resume
|
110
|
-
cl[0].update
|
96
|
+
cl[1].will {take [nil]}
|
97
|
+
assert_equal t, cl[1].run
|
111
98
|
|
112
99
|
cl.each do |c|
|
113
|
-
|
114
|
-
|
100
|
+
c.will {read_all [nil]}
|
101
|
+
assert_empty c.run
|
115
102
|
end
|
116
103
|
end
|
117
104
|
|
118
105
|
def test_take_waiting
|
119
106
|
t = ["bar"]
|
120
|
-
|
107
|
+
taker, writer = make_clients(2)
|
108
|
+
|
109
|
+
taker.will {take [nil]}.run_until_blocked
|
121
110
|
|
122
|
-
|
123
|
-
|
124
|
-
cl[1].update; assert_equal :block, taker.resume
|
111
|
+
w = writer.now {write t}
|
112
|
+
assert_equal 1, w.global_tick
|
125
113
|
|
126
|
-
|
127
|
-
cl[0].update; assert_equal 1, wr.global_tick
|
128
|
-
cl[1].update; taker.resume
|
129
|
-
cl[1].update; assert_equal t, taker.resume
|
130
|
-
cl[0].update
|
114
|
+
assert_equal t, taker.run
|
131
115
|
|
132
|
-
|
133
|
-
|
134
|
-
|
116
|
+
[taker, writer].each do |c|
|
117
|
+
c.will {read_all [nil]}
|
118
|
+
assert_empty c.run
|
135
119
|
end
|
136
120
|
end
|
137
121
|
|
138
122
|
def test_transaction_existing
|
139
|
-
w = [1]; t = [2]
|
140
|
-
|
123
|
+
r = [0]; w = [1]; t = [2]
|
124
|
+
writer, transactor = make_clients(2)
|
141
125
|
|
142
|
-
|
143
|
-
|
126
|
+
w_op = writer.now {write r, t}
|
127
|
+
assert_equal 1, w_op.global_tick
|
144
128
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
129
|
+
transactor.will do
|
130
|
+
transaction do
|
131
|
+
write w
|
132
|
+
[read(r), take(t)]
|
149
133
|
end
|
150
134
|
end
|
151
|
-
trans.resume
|
152
135
|
|
153
|
-
|
154
|
-
cl[1].update; assert_equal t, trans.resume
|
155
|
-
cl[0].update
|
136
|
+
assert_equal [r, t], transactor.run
|
156
137
|
|
157
|
-
|
158
|
-
|
159
|
-
|
138
|
+
[writer, transactor].each do |c|
|
139
|
+
c.will {read_all [nil]}
|
140
|
+
assert_equal [r, w], c.run
|
160
141
|
end
|
161
142
|
end
|
162
143
|
|
163
144
|
def test_transaction_waiting
|
164
|
-
w = [1]; t = [2]
|
165
|
-
|
145
|
+
r = [0]; w = [1]; t = [2]
|
146
|
+
writer, transactor = make_clients(2)
|
166
147
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
148
|
+
transactor.will do
|
149
|
+
transaction do
|
150
|
+
write w
|
151
|
+
[read(r), take(t)]
|
171
152
|
end
|
172
153
|
end
|
173
|
-
|
154
|
+
transactor.run_until_blocked
|
174
155
|
|
175
|
-
|
176
|
-
|
156
|
+
w_op = writer.now {write r, t}
|
157
|
+
assert_equal 1, w_op.global_tick
|
177
158
|
|
178
|
-
|
179
|
-
cl[1].update; assert_equal t, trans.resume
|
180
|
-
cl[0].update
|
159
|
+
assert_equal [r, t], transactor.run
|
181
160
|
|
182
|
-
|
183
|
-
|
184
|
-
|
161
|
+
[writer, transactor].each do |c|
|
162
|
+
c.will {read_all [nil]}
|
163
|
+
assert_equal [r, w], c.run
|
185
164
|
end
|
186
165
|
end
|
187
166
|
|
167
|
+
def test_transaction_empty
|
168
|
+
transactor = make_client(0)
|
169
|
+
|
170
|
+
transactor.will do
|
171
|
+
transaction do
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
assert_equal nil, transactor.run
|
176
|
+
assert_equal 0, transactor.worker.global_tick
|
177
|
+
end
|
178
|
+
|
188
179
|
def test_transaction_cancel
|
189
180
|
w = [1]; t = [2]
|
190
|
-
|
181
|
+
writer, transactor = make_clients(2)
|
191
182
|
|
192
183
|
tr = nil
|
193
|
-
|
194
|
-
tr =
|
184
|
+
transactor.will do
|
185
|
+
tr = transaction
|
195
186
|
tr.write w
|
196
187
|
begin
|
197
188
|
tr.take t
|
@@ -200,23 +191,66 @@ class TestOps < Minitest::Test
|
|
200
191
|
Fiber.yield :abort
|
201
192
|
end
|
202
193
|
end
|
203
|
-
|
204
|
-
|
194
|
+
assert_equal :block, transactor.step
|
205
195
|
tr.cancel
|
206
|
-
|
196
|
+
assert_equal :abort, transactor.step
|
207
197
|
|
208
|
-
|
209
|
-
|
210
|
-
cl[1].update
|
198
|
+
w_op = writer.now {write t}
|
199
|
+
assert_equal 1, w_op.global_tick
|
211
200
|
|
212
|
-
|
213
|
-
|
214
|
-
|
201
|
+
[writer, transactor].each do |c|
|
202
|
+
c.will {read_all [nil]}
|
203
|
+
assert_equal [t], c.run
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_transaction_fail_retry
|
208
|
+
winner, loser = make_clients(2)
|
209
|
+
winner.now {write ["token", 1]}
|
210
|
+
|
211
|
+
run_count = 0
|
212
|
+
result = nil
|
213
|
+
loser.will do
|
214
|
+
result = transaction do
|
215
|
+
run_count += 1
|
216
|
+
a = []
|
217
|
+
write ["test", 1]
|
218
|
+
a << (take ["token", 1])
|
219
|
+
write ["test", 2]
|
220
|
+
a << (take ["token", 2])
|
221
|
+
write ["test", 3]
|
222
|
+
a
|
223
|
+
end
|
224
|
+
end
|
225
|
+
loser.run_until_blocked
|
226
|
+
assert_equal 1, run_count
|
227
|
+
|
228
|
+
winner.will do
|
229
|
+
take ["token", 1]
|
215
230
|
end
|
231
|
+
winner.run
|
232
|
+
loser.run_until_blocked
|
233
|
+
|
234
|
+
assert_equal 2, run_count
|
235
|
+
assert_empty winner.now {read_all [nil, nil]}
|
236
|
+
|
237
|
+
winner.now {write ["token", 2]}
|
238
|
+
assert_raises(MockClient::IsBlocked) {loser.run}
|
239
|
+
|
240
|
+
winner.now {write ["token", 1]}
|
241
|
+
assert_equal [["token", 1], ["token", 2]], loser.run
|
242
|
+
|
243
|
+
result = winner.now {read_all [nil, nil]}
|
244
|
+
assert_equal [["test", 1], ["test", 2], ["test", 3]], result
|
216
245
|
end
|
217
246
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
247
|
+
def test_pulse
|
248
|
+
t = ["c0"]
|
249
|
+
reader, pulser = make_clients(2)
|
250
|
+
|
251
|
+
reader.will {read [nil]}.run_until_blocked
|
252
|
+
pulser.now {pulse t}
|
253
|
+
assert_equal t, reader.run
|
254
|
+
assert_empty reader.now {read_all [nil]}
|
255
|
+
end
|
222
256
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tupelo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel VanderWerf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: atdo
|
@@ -89,9 +89,15 @@ files:
|
|
89
89
|
- lib/tupelo/client/common.rb
|
90
90
|
- lib/tupelo/client/tuplespace.rb
|
91
91
|
- lib/tupelo/client/transaction.rb
|
92
|
+
- lib/tupelo/client/atdo.rb
|
92
93
|
- lib/tupelo/client/reader.rb
|
94
|
+
- lib/tupelo/tuplets/persistent-archiver/worker.rb
|
95
|
+
- lib/tupelo/tuplets/persistent-archiver/tuplespace.rb
|
96
|
+
- lib/tupelo/tuplets/persistent-archiver.rb
|
97
|
+
- lib/tupelo/archiver/persister.rb
|
93
98
|
- lib/tupelo/archiver/worker.rb
|
94
99
|
- lib/tupelo/archiver/tuplespace.rb
|
100
|
+
- lib/tupelo/archiver/persistent-tuplespace.rb
|
95
101
|
- lib/tupelo/util/boolean.rb
|
96
102
|
- lib/tupelo/version.rb
|
97
103
|
- bench/pipeline.rb
|
@@ -106,6 +112,7 @@ files:
|
|
106
112
|
- example/small.rb
|
107
113
|
- example/bounded-retry.rb
|
108
114
|
- example/map-reduce-v2.rb
|
115
|
+
- example/zk/lock.rb
|
109
116
|
- example/concurrent-transactions.rb
|
110
117
|
- example/cancel.rb
|
111
118
|
- example/tiny-server.rb
|
@@ -120,6 +127,7 @@ files:
|
|
120
127
|
- example/transaction-logic.rb
|
121
128
|
- example/remote-map-reduce.rb
|
122
129
|
- example/map-reduce.rb
|
130
|
+
- example/lease.rb
|
123
131
|
- example/balance-xfer.rb
|
124
132
|
- example/add-dsl.rb
|
125
133
|
- example/lock-mgr.rb
|
@@ -134,6 +142,7 @@ files:
|
|
134
142
|
- example/message-bus.rb
|
135
143
|
- example/balance-xfer-locking.rb
|
136
144
|
- example/increment.rb
|
145
|
+
- example/child-of-child.rb
|
137
146
|
- example/custom-class.rb
|
138
147
|
- example/matching.rb
|
139
148
|
- example/custom-search.rb
|
@@ -145,6 +154,7 @@ files:
|
|
145
154
|
- example/boolean-match.rb
|
146
155
|
- example/load-balancer.rb
|
147
156
|
- example/take-many.rb
|
157
|
+
- example/deadlock.rb
|
148
158
|
- example/dphil.rb
|
149
159
|
- test/lib/testable-worker.rb
|
150
160
|
- test/lib/mock-seq.rb
|
@@ -154,6 +164,7 @@ files:
|
|
154
164
|
- test/lib/mock-client.rb
|
155
165
|
- test/system/test-archiver.rb
|
156
166
|
- test/unit/test-ops.rb
|
167
|
+
- test/unit/test-mock-client.rb
|
157
168
|
- test/unit/test-mock-seq.rb
|
158
169
|
- test/unit/test-mock-queue.rb
|
159
170
|
- test/stress/concurrent-transactions.rb
|
@@ -187,12 +198,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
198
|
version: '0'
|
188
199
|
requirements: []
|
189
200
|
rubyforge_project:
|
190
|
-
rubygems_version: 2.
|
201
|
+
rubygems_version: 2.1.3
|
191
202
|
signing_key:
|
192
203
|
specification_version: 4
|
193
204
|
summary: Distributed tuplespace
|
194
205
|
test_files:
|
195
206
|
- test/unit/test-ops.rb
|
207
|
+
- test/unit/test-mock-client.rb
|
196
208
|
- test/unit/test-mock-seq.rb
|
197
209
|
- test/unit/test-mock-queue.rb
|
198
210
|
has_rdoc:
|