@@ -22,33 +22,26 @@ def test_ractor_safe
22
22
def test_ractor_share_database
23
23
skip ( "Requires Ruby with Ractors" ) unless SQLite3 . ractor_safe?
24
24
25
- db_receiver = Ractor . new do
26
- db = Ractor . receive
27
- Ractor . yield db . object_id
28
- begin
29
- db . execute ( "create table test_table ( b integer primary key)" )
30
- raise "Should have raised an exception in db.execute()"
31
- rescue => e
32
- Ractor . yield e
25
+ db = SQLite3 ::Database . open ( ":memory:" )
26
+
27
+ if RUBY_VERSION >= "3.3"
28
+ # after ruby/ruby@ce47ee00
29
+ ractor = Ractor . new do
30
+ Ractor . receive
33
31
end
32
+
33
+ assert_raises ( Ractor ::Error ) { ractor . send ( db ) }
34
+ else
35
+ # before ruby/ruby@ce47ee00 T_DATA objects could be copied
36
+ ractor = Ractor . new do
37
+ local_db = Ractor . receive
38
+ Ractor . yield local_db . object_id
39
+ end
40
+ ractor . send ( db )
41
+ copy_id = ractor . take
42
+
43
+ assert_not_equal db . object_id , copy_id
34
44
end
35
- db_creator = Ractor . new ( db_receiver ) do |db_receiver |
36
- db = SQLite3 ::Database . open ( ":memory:" )
37
- Ractor . yield db . object_id
38
- db_receiver . send ( db )
39
- sleep 0.1
40
- db . execute ( "create table test_table ( a integer primary key)" )
41
- end
42
- first_oid = db_creator . take
43
- second_oid = db_receiver . take
44
- assert_not_equal first_oid , second_oid
45
- ex = db_receiver . take
46
- # For now, let's assert that you can't pass database connections around
47
- # between different Ractors. Letting a live DB connection exist in two
48
- # threads that are running concurrently might expose us to footguns and
49
- # lead to data corruption, so we should avoid this possibility and wait
50
- # until connections can be given away using `yield` or `send`.
51
- assert_equal "prepare called on a closed database" , ex . message
52
45
end
53
46
54
47
def test_ractor_stress
0 commit comments