Skip to content

Commit 9f99e9b

Browse files
committed
chore: create multiplexed session at startup
1 parent 05c1980 commit 9f99e9b

File tree

6 files changed

+62
-11
lines changed

6 files changed

+62
-11
lines changed

lib/activerecord_spanner_adapter/connection.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,22 @@ class Connection
1717
attr_accessor :isolation_level
1818

1919
def initialize config
20+
config = config.symbolize_keys
21+
@config = config
2022
@instance_id = config[:instance]
2123
@database_id = config[:database]
2224
@isolation_level = config[:isolation_level]
2325
@spanner = self.class.spanners config
26+
begin
27+
@mux_session = self.class.mux_sessions @spanner, config unless config[:skip_create_multiplexed_session]
28+
rescue Google::Cloud::NotFoundError
29+
@mux_session = nil
30+
rescue Google::Cloud::UnimplementedError
31+
@mux_session_unimplemented = true
32+
end
2433
end
2534

2635
def self.spanners config
27-
config = config.symbolize_keys
2836
@spanners ||= {}
2937
@mutex ||= Mutex.new
3038
@mutex.synchronize do
@@ -40,6 +48,17 @@ def self.spanners config
4048
end
4149
end
4250

51+
def self.mux_sessions spanner, config
52+
instance_id = config[:instance]
53+
database_id = config[:database]
54+
@mux_sessions ||= {}
55+
@mutex ||= Mutex.new
56+
@mutex.synchronize do
57+
@mux_sessions[database_path(config)] ||=
58+
spanner.create_multiplexed_session instance_id, database_id
59+
end
60+
end
61+
4362
# Clears the cached information about the underlying information schemas.
4463
# Call this method if you drop and recreate a database with the same name
4564
# to prevent the cached information to be used for the new database.
@@ -96,6 +115,9 @@ def create_database
96115
job = spanner.create_database instance_id, database_id
97116
job.wait_until_done!
98117
raise Google::Cloud::Error.from_error job.error if job.error?
118+
unless @config[:skip_create_multiplexed_session] || @mux_session_unimplemented
119+
@mux_session = self.class.mux_sessions @spanner, @config
120+
end
99121
job.database
100122
end
101123

lib/spanner_client_ext.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,30 @@ def create_session instance_id, database_id, labels: nil
2020
)
2121
Session.from_grpc grpc, @service
2222
end
23+
24+
def create_multiplexed_session instance_id, database_id
25+
ensure_service!
26+
27+
grpc = @service._create_multiplexed_session(
28+
Admin::Database::V1::DatabaseAdmin::Paths.database_path(
29+
project: project, instance: instance_id, database: database_id
30+
)
31+
)
32+
Session.from_grpc grpc, @service
33+
end
34+
end
35+
36+
class Service
37+
def _create_multiplexed_session database_name, database_role: nil
38+
route_to_leader = LARHeaders.create_session
39+
opts = default_options session_name: database_name,
40+
route_to_leader: route_to_leader
41+
session = Google::Cloud::Spanner::V1::Session.new multiplexed: true,
42+
creator_role: database_role
43+
service.create_session(
44+
{ database: database_name, session: session }, opts
45+
)
46+
end
2347
end
2448

2549
class Session

test/activerecord_spanner_adapter/connection_mock_server_test.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ def create_connection
4747
_(row_count).must_equal 1
4848
connection.disconnect!
4949

50-
_(@mock.requests.length).must_equal 3
50+
_(@mock.requests.length).must_equal 4
5151
_(@mock.requests[0]).must_be_kind_of Google::Cloud::Spanner::V1::CreateSessionRequest
52-
_(@mock.requests[1]).must_be_kind_of Google::Cloud::Spanner::V1::ExecuteSqlRequest
53-
_(@mock.requests[2]).must_be_kind_of Google::Cloud::Spanner::V1::DeleteSessionRequest
52+
_(@mock.requests[1]).must_be_kind_of Google::Cloud::Spanner::V1::CreateSessionRequest
53+
_(@mock.requests[2]).must_be_kind_of Google::Cloud::Spanner::V1::ExecuteSqlRequest
54+
_(@mock.requests[3]).must_be_kind_of Google::Cloud::Spanner::V1::DeleteSessionRequest
5455
end
5556

5657
it "can execute random query" do
@@ -84,10 +85,11 @@ def create_connection
8485
end
8586
connection.disconnect!
8687

87-
_(@mock.requests.length).must_equal 3
88+
_(@mock.requests.length).must_equal 4
8889
_(@mock.requests[0]).must_be_kind_of Google::Cloud::Spanner::V1::CreateSessionRequest
89-
_(@mock.requests[1]).must_be_kind_of Google::Cloud::Spanner::V1::ExecuteSqlRequest
90-
_(@mock.requests[2]).must_be_kind_of Google::Cloud::Spanner::V1::DeleteSessionRequest
90+
_(@mock.requests[1]).must_be_kind_of Google::Cloud::Spanner::V1::CreateSessionRequest
91+
_(@mock.requests[2]).must_be_kind_of Google::Cloud::Spanner::V1::ExecuteSqlRequest
92+
_(@mock.requests[3]).must_be_kind_of Google::Cloud::Spanner::V1::DeleteSessionRequest
9193
end
9294

9395
it "can execute transaction" do

test/activerecord_spanner_adapter/connection_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ def test_create_connection
1313
project: project_id,
1414
instance: instance_id,
1515
database: database_id,
16-
credentials: credentials
16+
credentials: credentials,
17+
skip_create_multiplexed_session: true
1718
})
1819
end
1920

test/mock_server/spanner_mock_server.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ def push_error sql_or_method, error
4040

4141
def create_session request, _unused_call
4242
@requests << request
43-
do_create_session request.database
43+
multiplexed = request.session&.multiplexed
44+
do_create_session request.database, multiplexed: multiplexed
4445
end
4546

4647
def batch_create_sessions request, _unused_call
@@ -199,9 +200,9 @@ def validate_session session
199200
end
200201
end
201202

202-
def do_create_session database
203+
def do_create_session database, multiplexed: false
203204
name = "#{database}/sessions/#{SecureRandom.uuid}"
204-
session = Google::Cloud::Spanner::V1::Session.new name: name
205+
session = Google::Cloud::Spanner::V1::Session.new name: name, multiplexed: multiplexed
205206
@sessions[name] = session
206207
session
207208
end

test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def setup
5757
instance: instance_id,
5858
database: database_id,
5959
credentials: credentials,
60+
skip_create_multiplexed_session: true
6061
)
6162
end
6263
end

0 commit comments

Comments
 (0)