tupelo 0.7 → 0.8
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 +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:
|