Skip to content

Commit 3357c2c

Browse files
committed
chore: create multiplexed session at startup
1 parent 05c1980 commit 3357c2c

File tree

6 files changed

+52
-10
lines changed

6 files changed

+52
-10
lines changed

lib/activerecord_spanner_adapter/connection.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def initialize config
2121
@database_id = config[:database]
2222
@isolation_level = config[:isolation_level]
2323
@spanner = self.class.spanners config
24+
@mux_session = self.class.mux_sessions @spanner, config unless config[:skip_create_multiplexed_session]
2425
end
2526

2627
def self.spanners config
@@ -40,6 +41,18 @@ def self.spanners config
4041
end
4142
end
4243

44+
def self.mux_sessions spanner, config
45+
config = config.symbolize_keys
46+
instance_id = config[:instance]
47+
database_id = config[:database]
48+
@mux_sessions ||= {}
49+
@mutex ||= Mutex.new
50+
@mutex.synchronize do
51+
@mux_sessions[database_path(config)] ||=
52+
spanner.create_multiplexed_session instance_id, database_id
53+
end
54+
end
55+
4356
# Clears the cached information about the underlying information schemas.
4457
# Call this method if you drop and recreate a database with the same name
4558
# to prevent the cached information to be used for the new database.

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)