Skip to content

Commit 54009ea

Browse files
authored
feat(spanner): add support of multiplexed session support in writeAtleastOnce mutations (#10646)
* feat(spanner): add support of multiplexed session support in mutations * fix tests * remove BatchWrite support * revert unrelated changes
1 parent 7797022 commit 54009ea

File tree

3 files changed

+58
-16
lines changed

3 files changed

+58
-16
lines changed

spanner/client_test.go

+36-12
Original file line numberDiff line numberDiff line change
@@ -3555,15 +3555,21 @@ func TestClient_ApplyAtLeastOnceReuseSession(t *testing.T) {
35553555
if err != nil {
35563556
t.Fatal(err)
35573557
}
3558+
expectedIdleSesions := sp.incStep
3559+
if isMultiplexEnabled {
3560+
expectedIdleSesions = 0
3561+
}
35583562
sp.mu.Lock()
3559-
if g, w := uint64(sp.idleList.Len())+sp.createReqs, sp.incStep; g != w {
3563+
if g, w := uint64(sp.idleList.Len())+sp.createReqs, expectedIdleSesions; g != w {
3564+
sp.mu.Unlock()
35603565
t.Fatalf("idle session count mismatch:\nGot: %v\nWant: %v", g, w)
35613566
}
3562-
expectedSessions := sp.incStep
3567+
expectedSessions := expectedIdleSesions
35633568
if isMultiplexEnabled {
35643569
expectedSessions++
35653570
}
35663571
if g, w := uint64(len(server.TestSpanner.DumpSessions())), expectedSessions; g != w {
3572+
sp.mu.Unlock()
35673573
t.Fatalf("server session count mismatch:\nGot: %v\nWant: %v", g, w)
35683574
}
35693575
sp.mu.Unlock()
@@ -3602,14 +3608,20 @@ func TestClient_ApplyAtLeastOnceInvalidArgument(t *testing.T) {
36023608
t.Fatal(err)
36033609
}
36043610
sp.mu.Lock()
3605-
if g, w := uint64(sp.idleList.Len())+sp.createReqs, sp.incStep; g != w {
3611+
expectedIdleSesions := sp.incStep
3612+
if isMultiplexEnabled {
3613+
expectedIdleSesions = 0
3614+
}
3615+
if g, w := uint64(sp.idleList.Len())+sp.createReqs, expectedIdleSesions; g != w {
3616+
sp.mu.Unlock()
36063617
t.Fatalf("idle session count mismatch:\nGot: %v\nWant: %v", g, w)
36073618
}
36083619
var countMuxSess uint64
36093620
if isMultiplexEnabled {
36103621
countMuxSess = 1
36113622
}
3612-
if g, w := uint64(len(server.TestSpanner.DumpSessions())), sp.incStep+countMuxSess; g != w {
3623+
if g, w := uint64(len(server.TestSpanner.DumpSessions())), expectedIdleSesions+countMuxSess; g != w {
3624+
sp.mu.Unlock()
36133625
t.Fatalf("server session count mismatch:\nGot: %v\nWant: %v", g, w)
36143626
}
36153627
sp.mu.Unlock()
@@ -6277,18 +6289,30 @@ func TestClient_ApplyAtLeastOnceExcludeTxnFromChangeStreams(t *testing.T) {
62776289
if err != nil {
62786290
t.Fatal(err)
62796291
}
6280-
requests := drainRequestsFromServer(server.TestSpanner)
6281-
if err := compareRequests([]interface{}{
6292+
6293+
expectedReqs := []interface{}{
62826294
&sppb.BatchCreateSessionsRequest{},
6283-
&sppb.CommitRequest{}}, requests); err != nil {
6284-
t.Fatal(err)
6295+
&sppb.CommitRequest{},
62856296
}
6286-
muxCreateBuffer := 0
62876297
if isMultiplexEnabled {
6288-
muxCreateBuffer = 1
6298+
expectedReqs = []interface{}{
6299+
&sppb.CreateSessionRequest{},
6300+
&sppb.CommitRequest{},
6301+
}
62896302
}
6290-
if !requests[1+muxCreateBuffer].(*sppb.CommitRequest).Transaction.(*sppb.CommitRequest_SingleUseTransaction).SingleUseTransaction.ExcludeTxnFromChangeStreams {
6291-
t.Fatal("Transaction is not set to be excluded from change streams")
6303+
requests := drainRequestsFromServer(server.TestSpanner)
6304+
if err := compareRequests(expectedReqs, requests); err != nil {
6305+
t.Fatal(err)
6306+
}
6307+
for _, req := range requests {
6308+
if request, ok := req.(*sppb.CommitRequest); ok {
6309+
if !request.Transaction.(*sppb.CommitRequest_SingleUseTransaction).SingleUseTransaction.ExcludeTxnFromChangeStreams {
6310+
t.Fatal("Transaction is not set to be excluded from change streams")
6311+
}
6312+
if !testEqual(isMultiplexEnabled, strings.Contains(request.GetSession(), "multiplexed")) {
6313+
t.Errorf("TestClient_ApplyAtLeastOnceExcludeTxnFromChangeStreams expected multiplexed session to be used, got: %v", request.GetSession())
6314+
}
6315+
}
62926316
}
62936317
}
62946318

spanner/transaction.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1890,7 +1890,7 @@ func (t *writeOnlyTransaction) applyAtLeastOnce(ctx context.Context, ms ...*Muta
18901890
for {
18911891
if sh == nil || sh.getID() == "" || sh.getClient() == nil {
18921892
// No usable session for doing the commit, take one from pool.
1893-
sh, err = t.sp.take(ctx)
1893+
sh, err = t.sp.takeMultiplexed(ctx)
18941894
if err != nil {
18951895
// sessionPool.Take already retries for session
18961896
// creations/retrivals.
@@ -1912,6 +1912,7 @@ func (t *writeOnlyTransaction) applyAtLeastOnce(ctx context.Context, ms ...*Muta
19121912
RequestOptions: createRequestOptions(t.commitPriority, "", t.transactionTag),
19131913
})
19141914
if err != nil && !isAbortedErr(err) {
1915+
// should not be the case with multiplexed sessions
19151916
if isSessionNotFoundError(err) {
19161917
// Discard the bad session.
19171918
sh.destroy()

spanner/transaction_test.go

+20-3
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,30 @@ func TestApply_Single(t *testing.T) {
163163
if _, e := client.Apply(ctx, ms, ApplyAtLeastOnce()); e != nil {
164164
t.Fatalf("applyAtLeastOnce retry on abort, got %v, want nil.", e)
165165
}
166-
167-
if _, err := shouldHaveReceived(server.TestSpanner, []interface{}{
166+
requests := drainRequestsFromServer(server.TestSpanner)
167+
expectedReqs := []interface{}{
168168
&sppb.BatchCreateSessionsRequest{},
169169
&sppb.CommitRequest{},
170-
}); err != nil {
170+
}
171+
if isMultiplexEnabled {
172+
expectedReqs = []interface{}{
173+
&sppb.CreateSessionRequest{},
174+
&sppb.CommitRequest{},
175+
}
176+
}
177+
if err := compareRequests(expectedReqs, requests); err != nil {
171178
t.Fatal(err)
172179
}
180+
for _, s := range requests {
181+
switch s.(type) {
182+
case *sppb.CommitRequest:
183+
req, _ := s.(*sppb.CommitRequest)
184+
// Validate the session is multiplexed
185+
if !testEqual(isMultiplexEnabled, strings.Contains(req.Session, "multiplexed")) {
186+
t.Errorf("TestApply_Single expected multiplexed session to be used, got: %v", req.Session)
187+
}
188+
}
189+
}
173190
}
174191

175192
// Transaction retries on abort.

0 commit comments

Comments
 (0)