uringmachine 0.28.3 → 0.29.1
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/CHANGELOG.md +15 -1
- data/TODO.md +29 -35
- data/benchmark/common.rb +6 -6
- data/benchmark/gets.rb +49 -0
- data/benchmark/gets_concurrent.rb +122 -0
- data/benchmark/{read_each.rb → output.rb} +27 -24
- data/docs/design/buffer_pool.md +35 -0
- data/docs/um_api.md +2 -0
- data/ext/um/extconf.rb +6 -5
- data/ext/um/um.c +50 -16
- data/ext/um/um.h +102 -32
- data/ext/um/um_buffer_pool.c +248 -0
- data/ext/um/um_class.c +28 -16
- data/ext/um/um_op.c +29 -13
- data/ext/um/um_ssl.c +24 -27
- data/ext/um/um_stream.c +382 -150
- data/ext/um/um_stream_class.c +119 -63
- data/ext/um/um_utils.c +6 -6
- data/grant-2025/tasks.md +13 -7
- data/lib/uringmachine/fiber_scheduler.rb +36 -10
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +60 -19
- data/test/helper.rb +4 -0
- data/test/test_fiber.rb +93 -12
- data/test/test_fiber_scheduler.rb +8 -50
- data/test/test_stream.rb +466 -124
- data/test/test_um.rb +133 -49
- metadata +6 -4
- data/ext/um/um_buffer.c +0 -49
data/test/test_fiber.rb
CHANGED
|
@@ -109,6 +109,34 @@ class FiberJoinTest < UMBaseTest
|
|
|
109
109
|
assert_equal [:foo, :bar, :baz], res
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
+
def test_join_array
|
|
113
|
+
f1 = machine.spin do
|
|
114
|
+
:foo
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
f2 = machine.spin do
|
|
118
|
+
machine.sleep(0.001)
|
|
119
|
+
:bar
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
f3 = machine.spin do
|
|
123
|
+
:baz
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
res = machine.join([f1, f2, f3])
|
|
127
|
+
assert_equal [:foo, :bar, :baz], res
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_join_procs
|
|
131
|
+
res = machine.join(
|
|
132
|
+
->(_) { machine.snooze; :f1 },
|
|
133
|
+
->(_) { machine.sleep(0.01); :f2 },
|
|
134
|
+
->(_) { machine.sleep(0.02); :f3 }
|
|
135
|
+
)
|
|
136
|
+
assert_equal [:f1, :f2, :f3], res
|
|
137
|
+
assert machine.fiber_set.empty?
|
|
138
|
+
end
|
|
139
|
+
|
|
112
140
|
def test_join_cross_thread
|
|
113
141
|
q = UM::Queue.new
|
|
114
142
|
|
|
@@ -142,7 +170,7 @@ class FiberJoinTest < UMBaseTest
|
|
|
142
170
|
end
|
|
143
171
|
|
|
144
172
|
class WaitFibersTest < UMBaseTest
|
|
145
|
-
def
|
|
173
|
+
def test_await
|
|
146
174
|
q = UM::Queue.new
|
|
147
175
|
x = nil
|
|
148
176
|
|
|
@@ -163,19 +191,40 @@ class WaitFibersTest < UMBaseTest
|
|
|
163
191
|
machine.push q, 2
|
|
164
192
|
end
|
|
165
193
|
|
|
166
|
-
res = machine.
|
|
194
|
+
res = machine.await([f])
|
|
167
195
|
assert_equal 0, x
|
|
168
196
|
assert_equal 3, machine.shift(q)
|
|
169
197
|
assert_equal 1, res
|
|
170
198
|
|
|
171
199
|
done = nil
|
|
172
200
|
f = machine.spin { machine.snooze; done = true }
|
|
173
|
-
res = machine.
|
|
201
|
+
res = machine.await(f)
|
|
174
202
|
assert done
|
|
175
203
|
assert_equal 1, res
|
|
176
204
|
end
|
|
177
205
|
|
|
178
|
-
def
|
|
206
|
+
def test_await_multiple
|
|
207
|
+
f1 = machine.spin do
|
|
208
|
+
:foo
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
f2 = machine.spin do
|
|
212
|
+
machine.sleep(0.001)
|
|
213
|
+
:bar
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
f3 = machine.spin do
|
|
217
|
+
:baz
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
res = machine.await([f1, f2, f3])
|
|
221
|
+
assert_equal 3, res
|
|
222
|
+
assert_equal true, f1.done?
|
|
223
|
+
assert_equal true, f2.done?
|
|
224
|
+
assert_equal true, f3.done?
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def test_await_multiple_splat
|
|
179
228
|
f1 = machine.spin do
|
|
180
229
|
:foo
|
|
181
230
|
end
|
|
@@ -189,11 +238,43 @@ class WaitFibersTest < UMBaseTest
|
|
|
189
238
|
:baz
|
|
190
239
|
end
|
|
191
240
|
|
|
192
|
-
res = machine.
|
|
241
|
+
res = machine.await(f1, f2, f3)
|
|
242
|
+
assert_equal 3, res
|
|
243
|
+
assert_equal true, f1.done?
|
|
244
|
+
assert_equal true, f2.done?
|
|
245
|
+
assert_equal true, f3.done?
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def test_await_procs
|
|
249
|
+
buf = []
|
|
250
|
+
res = machine.await(
|
|
251
|
+
->(_) { machine.snooze; buf << :f1 },
|
|
252
|
+
->(_) { machine.sleep(0.01); buf << :f2 },
|
|
253
|
+
->(_) { machine.sleep(0.02); buf << :f3 }
|
|
254
|
+
)
|
|
255
|
+
assert_equal 3, res
|
|
256
|
+
assert_equal [:f1, :f2, :f3], buf
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def test_await_mixed
|
|
260
|
+
buf = []
|
|
261
|
+
|
|
262
|
+
f1 = machine.spin do
|
|
263
|
+
machine.sleep(0.01)
|
|
264
|
+
buf << :f1
|
|
265
|
+
end
|
|
266
|
+
f2 = ->(_) { buf << :f2_in; machine.sleep(0.02); buf << :f2_out }
|
|
267
|
+
f3 = machine.spin do
|
|
268
|
+
machine.sleep(0.005)
|
|
269
|
+
buf << :f3
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
res = machine.await(f1, f2, f3)
|
|
193
273
|
assert_equal 3, res
|
|
274
|
+
assert_equal [:f2_in, :f3, :f1, :f2_out], buf
|
|
194
275
|
end
|
|
195
276
|
|
|
196
|
-
def
|
|
277
|
+
def test_await_cross_thread
|
|
197
278
|
q = UM::Queue.new
|
|
198
279
|
|
|
199
280
|
t2 = Thread.new do
|
|
@@ -203,32 +284,32 @@ class WaitFibersTest < UMBaseTest
|
|
|
203
284
|
m2.snooze
|
|
204
285
|
:foo
|
|
205
286
|
end
|
|
206
|
-
m2.
|
|
287
|
+
m2.await(f)
|
|
207
288
|
end
|
|
208
289
|
|
|
209
290
|
f = machine.shift(q)
|
|
210
291
|
assert_kind_of Fiber, f
|
|
211
|
-
res = machine.
|
|
292
|
+
res = machine.await(f)
|
|
212
293
|
assert_equal 1, res
|
|
213
294
|
ensure
|
|
214
295
|
t2.join
|
|
215
296
|
end
|
|
216
297
|
|
|
217
|
-
def
|
|
298
|
+
def test_await_with_exception
|
|
218
299
|
f = machine.spin do
|
|
219
300
|
raise "Foobar"
|
|
220
301
|
end
|
|
221
302
|
|
|
222
|
-
res = machine.
|
|
303
|
+
res = machine.await(f)
|
|
223
304
|
assert_equal 1, res
|
|
224
305
|
end
|
|
225
306
|
|
|
226
|
-
def
|
|
307
|
+
def test_await_terminate
|
|
227
308
|
f1 = machine.spin { machine.sleep(1) }
|
|
228
309
|
f2 = machine.spin { machine.sleep(1) }
|
|
229
310
|
done = false
|
|
230
311
|
a = machine.spin do
|
|
231
|
-
machine.
|
|
312
|
+
machine.await([f1, f2])
|
|
232
313
|
rescue UM::Terminate
|
|
233
314
|
done = true
|
|
234
315
|
end
|
|
@@ -6,6 +6,7 @@ require 'securerandom'
|
|
|
6
6
|
require 'socket'
|
|
7
7
|
require 'net/http'
|
|
8
8
|
require 'json'
|
|
9
|
+
require 'timeout'
|
|
9
10
|
|
|
10
11
|
class MethodCallAuditor
|
|
11
12
|
attr_reader :calls
|
|
@@ -235,7 +236,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
235
236
|
assert_equal 'oba', buf
|
|
236
237
|
assert_equal({
|
|
237
238
|
fiber: 1,
|
|
238
|
-
blocking_operation_wait: 1,
|
|
239
239
|
io_pread: 1,
|
|
240
240
|
io_close: 1,
|
|
241
241
|
join: 1
|
|
@@ -261,7 +261,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
261
261
|
assert_equal 'fobazr', IO.read(fn)
|
|
262
262
|
assert_equal({
|
|
263
263
|
fiber: 1,
|
|
264
|
-
blocking_operation_wait: 1,
|
|
265
264
|
io_pwrite: 1,
|
|
266
265
|
io_close: 1,
|
|
267
266
|
join: 1
|
|
@@ -402,7 +401,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
402
401
|
assert_equal 'foobar', buf
|
|
403
402
|
assert_equal({
|
|
404
403
|
fiber: 2,
|
|
405
|
-
blocking_operation_wait: 2,
|
|
406
404
|
io_write: 1,
|
|
407
405
|
io_read: 2,
|
|
408
406
|
io_close: 2,
|
|
@@ -425,12 +423,11 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
425
423
|
sleep 0.001
|
|
426
424
|
File.open(fn, 'r') { buf = it.read }
|
|
427
425
|
end
|
|
428
|
-
assert_equal 2, machine.metrics[:total_ops]
|
|
429
426
|
@scheduler.join
|
|
427
|
+
assert_equal 8, machine.metrics[:total_ops]
|
|
430
428
|
assert_equal 'foobar', buf
|
|
431
429
|
assert_equal({
|
|
432
430
|
fiber: 2,
|
|
433
|
-
blocking_operation_wait: 2,
|
|
434
431
|
io_write: 1,
|
|
435
432
|
io_read: 2,
|
|
436
433
|
io_close: 2,
|
|
@@ -452,7 +449,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
452
449
|
assert_equal 'foo', IO.read(fn)
|
|
453
450
|
assert_equal({
|
|
454
451
|
fiber: 1,
|
|
455
|
-
blocking_operation_wait: 1,
|
|
456
452
|
io_write: 1,
|
|
457
453
|
io_close: 1,
|
|
458
454
|
join: 1
|
|
@@ -472,7 +468,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
472
468
|
assert_equal 'foobar', IO.read(fn)
|
|
473
469
|
assert_equal({
|
|
474
470
|
fiber: 1,
|
|
475
|
-
blocking_operation_wait: 1,
|
|
476
471
|
io_write: 2,
|
|
477
472
|
io_close: 1,
|
|
478
473
|
join: 1
|
|
@@ -492,7 +487,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
492
487
|
# assert_equal 'foo', IO.read(fn)
|
|
493
488
|
assert_equal({
|
|
494
489
|
fiber: 1,
|
|
495
|
-
blocking_operation_wait: 1, # open
|
|
496
490
|
io_write: 1,
|
|
497
491
|
io_close: 1,
|
|
498
492
|
join: 1
|
|
@@ -667,7 +661,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
667
661
|
fiber: 1,
|
|
668
662
|
io_write: 2,
|
|
669
663
|
io_read: 1,
|
|
670
|
-
blocking_operation_wait: 1,
|
|
671
664
|
process_wait: 1,
|
|
672
665
|
join: 1
|
|
673
666
|
}, scheduler_calls_tally)
|
|
@@ -718,7 +711,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
718
711
|
fiber: 1,
|
|
719
712
|
io_read: 2,
|
|
720
713
|
io_close: 1,
|
|
721
|
-
blocking_operation_wait: 1,
|
|
722
714
|
address_resolve: 1,
|
|
723
715
|
join: 1
|
|
724
716
|
}, scheduler_calls_tally)
|
|
@@ -727,16 +719,15 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
727
719
|
def test_fiber_scheduler_timeout_after
|
|
728
720
|
res = nil
|
|
729
721
|
Fiber.schedule do
|
|
730
|
-
Timeout.timeout(0.
|
|
722
|
+
Timeout.timeout(0.1) do
|
|
731
723
|
sleep 1
|
|
732
724
|
end
|
|
733
725
|
res = true
|
|
734
|
-
rescue =>
|
|
735
|
-
res = e
|
|
726
|
+
rescue => res
|
|
736
727
|
end
|
|
737
728
|
@scheduler.join
|
|
738
|
-
assert_equal 3, machine.metrics[:total_ops]
|
|
739
729
|
assert_kind_of Timeout::Error, res
|
|
730
|
+
assert_equal 3, machine.metrics[:total_ops]
|
|
740
731
|
assert_equal({
|
|
741
732
|
fiber: 1,
|
|
742
733
|
timeout_after: 1,
|
|
@@ -764,30 +755,6 @@ class FiberSchedulerTest < UMBaseTest
|
|
|
764
755
|
r.close rescue nil
|
|
765
756
|
w.close rescue nil
|
|
766
757
|
end
|
|
767
|
-
|
|
768
|
-
def test_fiber_scheduler_blocking_operation_wait_single_issuer
|
|
769
|
-
buf = []
|
|
770
|
-
(1..10).each { |i|
|
|
771
|
-
op = -> { i * 10}
|
|
772
|
-
buf << @scheduler.blocking_operation_wait(op)
|
|
773
|
-
sleep 0.01
|
|
774
|
-
@machine.snooze
|
|
775
|
-
}
|
|
776
|
-
assert_equal (1..10).map { it * 10 }, buf
|
|
777
|
-
|
|
778
|
-
buf = []
|
|
779
|
-
(1..20).each { |i|
|
|
780
|
-
op = -> { i * 10}
|
|
781
|
-
Fiber.schedule do
|
|
782
|
-
sleep 0.001
|
|
783
|
-
buf << @scheduler.blocking_operation_wait(op)
|
|
784
|
-
sleep 0.001
|
|
785
|
-
end
|
|
786
|
-
}
|
|
787
|
-
@scheduler.join
|
|
788
|
-
|
|
789
|
-
assert_equal (1..20).map { it * 10 }, buf.sort
|
|
790
|
-
end
|
|
791
758
|
end
|
|
792
759
|
|
|
793
760
|
class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
@@ -816,7 +783,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
816
783
|
assert_equal({
|
|
817
784
|
fiber: 1,
|
|
818
785
|
io_read: 2,
|
|
819
|
-
blocking_operation_wait: 1,
|
|
820
786
|
io_close: 1,
|
|
821
787
|
join: 1
|
|
822
788
|
}, scheduler_calls_tally)
|
|
@@ -832,7 +798,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
832
798
|
assert_equal '==***', IO.read(@fn)
|
|
833
799
|
assert_equal({
|
|
834
800
|
fiber: 1,
|
|
835
|
-
blocking_operation_wait: 1,
|
|
836
801
|
io_write: 1,
|
|
837
802
|
io_close: 1,
|
|
838
803
|
join: 1
|
|
@@ -850,7 +815,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
850
815
|
assert_equal '===', IO.read(fn2)
|
|
851
816
|
assert_equal({
|
|
852
817
|
fiber: 1,
|
|
853
|
-
blocking_operation_wait: 3,
|
|
854
818
|
io_close: 2,
|
|
855
819
|
join: 1
|
|
856
820
|
}, scheduler_calls_tally)
|
|
@@ -868,7 +832,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
868
832
|
assert_equal({
|
|
869
833
|
fiber: 1,
|
|
870
834
|
io_read: 3,
|
|
871
|
-
blocking_operation_wait: 1,
|
|
872
835
|
io_close: 1,
|
|
873
836
|
join: 1
|
|
874
837
|
}, scheduler_calls_tally)
|
|
@@ -899,7 +862,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
899
862
|
assert_equal({
|
|
900
863
|
fiber: 1,
|
|
901
864
|
io_read: 2,
|
|
902
|
-
blocking_operation_wait: 1,
|
|
903
865
|
io_close: 1,
|
|
904
866
|
join: 1
|
|
905
867
|
}, scheduler_calls_tally)
|
|
@@ -915,7 +877,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
915
877
|
assert_equal({
|
|
916
878
|
fiber: 1,
|
|
917
879
|
io_read: 3,
|
|
918
|
-
blocking_operation_wait: 1,
|
|
919
880
|
io_close: 1,
|
|
920
881
|
join: 1
|
|
921
882
|
}, scheduler_calls_tally)
|
|
@@ -948,7 +909,6 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
|
|
|
948
909
|
assert_equal '==***', IO.read(@fn)
|
|
949
910
|
assert_equal({
|
|
950
911
|
fiber: 1,
|
|
951
|
-
blocking_operation_wait: 1,
|
|
952
912
|
io_write: 1,
|
|
953
913
|
io_close: 1,
|
|
954
914
|
join: 1
|
|
@@ -1459,7 +1419,6 @@ class FiberSchedulerNetHTTPTest < UMBaseTest
|
|
|
1459
1419
|
assert_equal C, calls[:fiber]
|
|
1460
1420
|
assert_equal C, calls[:io_close]
|
|
1461
1421
|
assert_in_range (C * 2)..(C * 4), calls[:io_wait]
|
|
1462
|
-
assert_in_range (C * 7)..(C * 20), calls[:blocking_operation_wait]
|
|
1463
1422
|
end
|
|
1464
1423
|
end
|
|
1465
1424
|
|
|
@@ -1534,9 +1493,9 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1534
1493
|
W.times {
|
|
1535
1494
|
fibers << Fiber.schedule { run_client(port) }
|
|
1536
1495
|
}
|
|
1537
|
-
@machine.
|
|
1496
|
+
@machine.await(fibers)
|
|
1538
1497
|
server.close
|
|
1539
|
-
@machine.
|
|
1498
|
+
@machine.await(server_fiber)
|
|
1540
1499
|
rescue Exception => e
|
|
1541
1500
|
p test_run_server: e
|
|
1542
1501
|
p e.backtrace
|
|
@@ -1598,7 +1557,7 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
|
|
|
1598
1557
|
run_server(port)
|
|
1599
1558
|
end
|
|
1600
1559
|
end
|
|
1601
|
-
@machine.
|
|
1560
|
+
@machine.await(fibers)
|
|
1602
1561
|
@calls = scheduler_calls_tally
|
|
1603
1562
|
ensure
|
|
1604
1563
|
# p ensure: ios
|
|
@@ -1653,7 +1612,6 @@ class FiberSchedulerErrorTest < UMBaseTest
|
|
|
1653
1612
|
assert_equal({
|
|
1654
1613
|
fiber: 1,
|
|
1655
1614
|
io_read: 1,
|
|
1656
|
-
blocking_operation_wait: 3,
|
|
1657
1615
|
io_close: 1,
|
|
1658
1616
|
join: 1
|
|
1659
1617
|
}, scheduler_calls_tally)
|