|
37 | 37 | import com.google.common.base.Stopwatch; |
38 | 38 | import com.google.common.collect.ImmutableList; |
39 | 39 | import com.google.protobuf.ByteString; |
40 | | -import com.google.spanner.v1.BeginTransactionRequest; |
41 | 40 | import com.google.spanner.v1.CommitRequest; |
42 | 41 | import com.google.spanner.v1.ExecuteSqlRequest; |
43 | 42 | import com.google.spanner.v1.RequestOptions.Priority; |
@@ -480,53 +479,96 @@ public void testWriteAtLeastOnceWithExcludeTxnFromChangeStreams() { |
480 | 479 | } |
481 | 480 |
|
482 | 481 | // TODO(sriharshach): Uncomment test once Lock order preservation proto is published |
483 | | - /* |
484 | | - @Test |
485 | | - public void testAbortedReadWriteTxnUsesPreviousTxnIdOnRetryWithInlineBegin() throws InterruptedException { |
486 | | - DatabaseClientImpl client = |
487 | | - (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); |
488 | | - // Force the Commit RPC to return Aborted the first time it is called. The exception is cleared |
489 | | - // after the first call, so the retry should succeed. |
490 | | - mockSpanner.setCommitExecutionTime( |
491 | | - SimulatedExecutionTime.ofException( |
492 | | - mockSpanner.createAbortedException(ByteString.copyFromUtf8("test")))); |
493 | | - Thread.sleep(10000); |
494 | | - TransactionRunner runner = client.readWriteTransaction(); |
495 | | - runner.run( |
496 | | - transaction -> { |
497 | | - try (ResultSet resultSet = |
498 | | - transaction.executeQuery(STATEMENT)) { |
499 | | - while (resultSet.next()) {} |
500 | | - } |
501 | | - return null; |
502 | | - }); |
503 | | -
|
504 | | - List<ExecuteSqlRequest> executeSqlRequests = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class); |
505 | | - assertEquals(2, executeSqlRequests.size()); |
506 | | -
|
507 | | - // Verify the requests are executed using multiplexed sessions |
508 | | - for (ExecuteSqlRequest request : executeSqlRequests) { |
509 | | - assertTrue(mockSpanner.getSession(request.getSession()).getMultiplexed()); |
510 | | - } |
| 482 | +/* |
| 483 | + @Test |
| 484 | + public void testAbortedReadWriteTxnUsesPreviousTxnIdOnRetryWithInlineBegin() |
| 485 | + throws InterruptedException { |
| 486 | + DatabaseClientImpl client = |
| 487 | + (DatabaseClientImpl) spanner.getDatabaseClient(DatabaseId.of("p", "i", "d")); |
| 488 | + // Force the Commit RPC to return Aborted the first time it is called. The exception is cleared |
| 489 | + // after the first call, so the retry should succeed. |
| 490 | + mockSpanner.setCommitExecutionTime( |
| 491 | + SimulatedExecutionTime.ofException( |
| 492 | + mockSpanner.createAbortedException(ByteString.copyFromUtf8("test")))); |
| 493 | + Thread.sleep(10000); |
| 494 | + TransactionRunner runner = client.readWriteTransaction(); |
| 495 | + AtomicReference<ByteString> validTransactionId = new AtomicReference<>(); |
| 496 | + runner.run( |
| 497 | + transaction -> { |
| 498 | + try (ResultSet resultSet = transaction.executeQuery(STATEMENT)) { |
| 499 | + while (resultSet.next()) {} |
| 500 | + } |
| 501 | +
|
| 502 | + TransactionContextImpl impl = (TransactionContextImpl) transaction; |
| 503 | + if (validTransactionId.get() == null) { |
| 504 | + // Track the first not-null transactionId. This transaction gets ABORTED during commit |
| 505 | + // operation and gets retried. |
| 506 | + validTransactionId.set(impl.transactionId); |
| 507 | + } |
| 508 | + return null; |
| 509 | + }); |
| 510 | +
|
| 511 | + List<ExecuteSqlRequest> executeSqlRequests = |
| 512 | + mockSpanner.getRequestsOfType(ExecuteSqlRequest.class); |
| 513 | + assertEquals(2, executeSqlRequests.size()); |
511 | 514 |
|
512 | | - // Verify that the first request uses inline begin, and the previous transaction ID is set to ByteString.EMPTY |
513 | | - assertTrue(executeSqlRequests.get(0).hasTransaction()); |
514 | | - assertTrue(executeSqlRequests.get(0).getTransaction().hasBegin()); |
515 | | - assertTrue(executeSqlRequests.get(0).getTransaction().getBegin().hasReadWrite()); |
516 | | - assertNotNull(executeSqlRequests.get(0).getTransaction().getBegin().getReadWrite() |
517 | | - .getMultiplexedSessionPreviousTransactionId()); |
518 | | - assertThat(executeSqlRequests.get(0).getTransaction().getBegin().getReadWrite().getMultiplexedSessionPreviousTransactionId()).isEqualTo(ByteString.EMPTY); |
519 | | -
|
520 | | - // Verify that the second request uses inline begin, and the previous transaction ID is set appropriately |
521 | | - assertTrue(executeSqlRequests.get(1).hasTransaction()); |
522 | | - assertTrue(executeSqlRequests.get(1).getTransaction().hasBegin()); |
523 | | - assertTrue(executeSqlRequests.get(1).getTransaction().getBegin().hasReadWrite()); |
524 | | - assertNotNull(executeSqlRequests.get(1).getTransaction().getBegin().getReadWrite() |
525 | | - .getMultiplexedSessionPreviousTransactionId()); |
526 | | - assertThat(executeSqlRequests.get(1).getTransaction().getBegin().getReadWrite().getMultiplexedSessionPreviousTransactionId()).isNotEqualTo(ByteString.EMPTY); |
| 515 | + // Verify the requests are executed using multiplexed sessions |
| 516 | + for (ExecuteSqlRequest request : executeSqlRequests) { |
| 517 | + assertTrue(mockSpanner.getSession(request.getSession()).getMultiplexed()); |
527 | 518 | } |
528 | | - */ |
529 | 519 |
|
| 520 | + // Verify that the first request uses inline begin, and the previous transaction ID is set to |
| 521 | + // ByteString.EMPTY |
| 522 | + assertTrue(executeSqlRequests.get(0).hasTransaction()); |
| 523 | + assertTrue(executeSqlRequests.get(0).getTransaction().hasBegin()); |
| 524 | + assertTrue(executeSqlRequests.get(0).getTransaction().getBegin().hasReadWrite()); |
| 525 | + assertNotNull( |
| 526 | + executeSqlRequests |
| 527 | + .get(0) |
| 528 | + .getTransaction() |
| 529 | + .getBegin() |
| 530 | + .getReadWrite() |
| 531 | + .getMultiplexedSessionPreviousTransactionId()); |
| 532 | + assertEquals( |
| 533 | + ByteString.EMPTY, |
| 534 | + executeSqlRequests |
| 535 | + .get(0) |
| 536 | + .getTransaction() |
| 537 | + .getBegin() |
| 538 | + .getReadWrite() |
| 539 | + .getMultiplexedSessionPreviousTransactionId()); |
| 540 | +
|
| 541 | + // Verify that the second request uses inline begin, and the previous transaction ID is set |
| 542 | + // appropriately |
| 543 | + assertTrue(executeSqlRequests.get(1).hasTransaction()); |
| 544 | + assertTrue(executeSqlRequests.get(1).getTransaction().hasBegin()); |
| 545 | + assertTrue(executeSqlRequests.get(1).getTransaction().getBegin().hasReadWrite()); |
| 546 | + assertNotNull( |
| 547 | + executeSqlRequests |
| 548 | + .get(1) |
| 549 | + .getTransaction() |
| 550 | + .getBegin() |
| 551 | + .getReadWrite() |
| 552 | + .getMultiplexedSessionPreviousTransactionId()); |
| 553 | + assertNotEquals( |
| 554 | + ByteString.EMPTY, |
| 555 | + executeSqlRequests |
| 556 | + .get(1) |
| 557 | + .getTransaction() |
| 558 | + .getBegin() |
| 559 | + .getReadWrite() |
| 560 | + .getMultiplexedSessionPreviousTransactionId()); |
| 561 | + assertEquals( |
| 562 | + validTransactionId.get(), |
| 563 | + executeSqlRequests |
| 564 | + .get(1) |
| 565 | + .getTransaction() |
| 566 | + .getBegin() |
| 567 | + .getReadWrite() |
| 568 | + .getMultiplexedSessionPreviousTransactionId()); |
| 569 | + } |
| 570 | +*/ |
| 571 | + |
530 | 572 | // TODO(sriharshach): Uncomment test once Lock order preservation proto is published |
531 | 573 | /* |
532 | 574 | @Test |
|
0 commit comments