-
Notifications
You must be signed in to change notification settings - Fork 136
chore(spanner): track precommit token for R/W multiplexed session #3411
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
a2aa260
3f9e5ec
d14e5c8
9981932
741f016
12b7c04
e5d0ca4
d80fda0
3942a7a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -54,6 +54,7 @@ | |
| import com.google.spanner.v1.GetSessionRequest; | ||
| import com.google.spanner.v1.ListSessionsRequest; | ||
| import com.google.spanner.v1.ListSessionsResponse; | ||
| import com.google.spanner.v1.MultiplexedSessionPrecommitToken; | ||
| import com.google.spanner.v1.PartialResultSet; | ||
| import com.google.spanner.v1.Partition; | ||
| import com.google.spanner.v1.PartitionOptions; | ||
|
|
@@ -197,10 +198,12 @@ private static class PartialResultSetsIterator implements Iterator<PartialResult | |
| private boolean hasNext; | ||
| private boolean first = true; | ||
| private int currentRow = 0; | ||
| private boolean isMultiplexedSession = false; | ||
|
|
||
| private PartialResultSetsIterator(ResultSet resultSet) { | ||
| private PartialResultSetsIterator(ResultSet resultSet, boolean isMultiplexedSession) { | ||
| this.resultSet = resultSet; | ||
| this.hasNext = true; | ||
| this.isMultiplexedSession = isMultiplexedSession; | ||
| } | ||
|
|
||
| @Override | ||
|
|
@@ -227,6 +230,9 @@ public PartialResultSet next() { | |
| } | ||
| builder.setResumeToken(ByteString.copyFromUtf8(String.format("%09d", currentRow))); | ||
| hasNext = currentRow < resultSet.getRowsCount(); | ||
| if (this.isMultiplexedSession) { | ||
| builder.setPrecommitToken(getPartialResultSetPrecommitToken()); | ||
| } | ||
| return builder.build(); | ||
| } | ||
|
|
||
|
|
@@ -1020,7 +1026,11 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp | |
| throw result.getException(); | ||
| case RESULT_SET: | ||
| returnResultSet( | ||
| result.getResultSet(), transactionId, request.getTransaction(), responseObserver); | ||
| result.getResultSet(), | ||
| transactionId, | ||
| request.getTransaction(), | ||
| responseObserver, | ||
| session); | ||
| break; | ||
| case UPDATE_COUNT: | ||
| if (isPartitionedDmlTransaction(transactionId)) { | ||
|
|
@@ -1033,7 +1043,7 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp | |
| .build()) | ||
| .build()); | ||
| } else { | ||
| responseObserver.onNext( | ||
| ResultSet.Builder resultSetBuilder = | ||
| ResultSet.newBuilder() | ||
| .setStats( | ||
| ResultSetStats.newBuilder() | ||
|
|
@@ -1045,8 +1055,11 @@ public void executeSql(ExecuteSqlRequest request, StreamObserver<ResultSet> resp | |
| ignoreNextInlineBeginRequest.getAndSet(false) | ||
| ? Transaction.getDefaultInstance() | ||
| : Transaction.newBuilder().setId(transactionId).build()) | ||
| .build()) | ||
| .build()); | ||
| .build()); | ||
| if (session.getMultiplexed()) { | ||
| resultSetBuilder.setPrecommitToken(getResultSetPrecommitToken()); | ||
| } | ||
| responseObserver.onNext(resultSetBuilder.build()); | ||
| } | ||
| break; | ||
| default: | ||
|
|
@@ -1064,7 +1077,8 @@ private void returnResultSet( | |
| ResultSet resultSet, | ||
| ByteString transactionId, | ||
| TransactionSelector transactionSelector, | ||
| StreamObserver<ResultSet> responseObserver) { | ||
| StreamObserver<ResultSet> responseObserver, | ||
| Session session) { | ||
| ResultSetMetadata metadata = resultSet.getMetadata(); | ||
| if (transactionId != null) { | ||
| metadata = | ||
|
|
@@ -1080,6 +1094,9 @@ private void returnResultSet( | |
| metadata = metadata.toBuilder().setTransaction(transaction).build(); | ||
| } | ||
| resultSet = resultSet.toBuilder().setMetadata(metadata).build(); | ||
| if (session.getMultiplexed()) { | ||
| resultSet = resultSet.toBuilder().setPrecommitToken(getResultSetPrecommitToken()).build(); | ||
| } | ||
harshachinta marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| responseObserver.onNext(resultSet); | ||
| } | ||
|
|
||
|
|
@@ -1174,6 +1191,9 @@ public void executeBatchDml( | |
| .build()); | ||
| } | ||
| builder.setStatus(status); | ||
| if (session.getMultiplexed()) { | ||
| builder.setPrecommitToken(getExecuteBatchDmlResponsePrecommitToken()); | ||
| } | ||
| responseObserver.onNext(builder.build()); | ||
| responseObserver.onCompleted(); | ||
| } catch (StatusRuntimeException e) { | ||
|
|
@@ -1242,7 +1262,8 @@ public void executeStreamingSql( | |
| transactionId, | ||
| request.getTransaction(), | ||
| responseObserver, | ||
| getExecuteStreamingSqlExecutionTime()); | ||
| getExecuteStreamingSqlExecutionTime(), | ||
| session.getMultiplexed()); | ||
| break; | ||
| case UPDATE_COUNT: | ||
| if (isPartitioned) { | ||
|
|
@@ -1612,7 +1633,7 @@ public void read(final ReadRequest request, StreamObserver<ResultSet> responseOb | |
| cols); | ||
| StatementResult res = getResult(statement); | ||
| returnResultSet( | ||
| res.getResultSet(), transactionId, request.getTransaction(), responseObserver); | ||
| res.getResultSet(), transactionId, request.getTransaction(), responseObserver, session); | ||
| responseObserver.onCompleted(); | ||
| } catch (StatusRuntimeException e) { | ||
| responseObserver.onError(e); | ||
|
|
@@ -1670,7 +1691,8 @@ public void streamingRead( | |
| transactionId, | ||
| request.getTransaction(), | ||
| responseObserver, | ||
| getStreamingReadExecutionTime()); | ||
| getStreamingReadExecutionTime(), | ||
| session.getMultiplexed()); | ||
| } catch (StatusRuntimeException e) { | ||
| responseObserver.onError(e); | ||
| } catch (Throwable t) { | ||
|
|
@@ -1683,7 +1705,8 @@ private void returnPartialResultSet( | |
| ByteString transactionId, | ||
| TransactionSelector transactionSelector, | ||
| StreamObserver<PartialResultSet> responseObserver, | ||
| SimulatedExecutionTime executionTime) | ||
| SimulatedExecutionTime executionTime, | ||
| boolean isMultiplexedSession) | ||
| throws Exception { | ||
| ResultSetMetadata metadata = resultSet.getMetadata(); | ||
| if (transactionId == null) { | ||
|
|
@@ -1700,7 +1723,8 @@ private void returnPartialResultSet( | |
| .build(); | ||
| } | ||
| resultSet = resultSet.toBuilder().setMetadata(metadata).build(); | ||
| PartialResultSetsIterator iterator = new PartialResultSetsIterator(resultSet); | ||
| PartialResultSetsIterator iterator = | ||
| new PartialResultSetsIterator(resultSet, isMultiplexedSession); | ||
| long index = 0L; | ||
| while (iterator.hasNext()) { | ||
| SimulatedExecutionTime.checkStreamException( | ||
|
|
@@ -2447,4 +2471,23 @@ Session getSession(String name) { | |
| } | ||
| return null; | ||
| } | ||
|
|
||
| static MultiplexedSessionPrecommitToken getResultSetPrecommitToken() { | ||
| return getPrecommitToken("ResultSetPrecommitToken", 1); | ||
|
||
| } | ||
|
|
||
| static MultiplexedSessionPrecommitToken getPartialResultSetPrecommitToken() { | ||
| return getPrecommitToken("PartialResultSetPrecommitToken", 3); | ||
| } | ||
|
|
||
| static MultiplexedSessionPrecommitToken getExecuteBatchDmlResponsePrecommitToken() { | ||
| return getPrecommitToken("ExecuteBatchDmlResponsePrecommitToken", 2); | ||
| } | ||
|
|
||
| static MultiplexedSessionPrecommitToken getPrecommitToken(String value, int seqNo) { | ||
| return MultiplexedSessionPrecommitToken.newBuilder() | ||
| .setPrecommitToken(ByteString.copyFromUtf8(value)) | ||
| .setSeqNum(seqNo) | ||
| .build(); | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.