Skip to content

Commit 7682c94

Browse files
re-organize code: move row limit setting after the edge case, use local variable for request munging
1 parent 2a66413 commit 7682c94

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/readrows/ReadRowsResumptionStrategy.java

+20-18
Original file line numberDiff line numberDiff line change
@@ -83,39 +83,34 @@ public ReadRowsRequest getResumeRequest(ReadRowsRequest request) {
8383
if (lastKey.isEmpty()) {
8484
return request;
8585
}
86-
Builder builder = request.toBuilder();
8786

88-
if (request.getRowsLimit() > 0) {
89-
// NOTE: the edge case of request.getRowsLimit() == numProcessed is handled below
90-
Preconditions.checkState(
91-
request.getRowsLimit() >= numProcessed,
92-
"Detected too many rows for the current row limit during a retry.");
93-
builder.setRowsLimit(request.getRowsLimit() - numProcessed);
94-
}
95-
96-
// Reset rows to scan.
97-
builder.clearRows();
98-
99-
RowSet.Builder rowSetBuilder = RowSet.newBuilder();
87+
ReadRowsRequest originalRequest = request;
10088

101-
// Special case: empty query implies full table scan
89+
// Special case: empty query implies full table scan, make this explicit by adding an unbounded
90+
// range to the request
10291
if (request.getRows().getRowKeysList().isEmpty()
10392
&& request.getRows().getRowRangesList().isEmpty()) {
10493

105-
request =
94+
originalRequest =
10695
request
10796
.toBuilder()
10897
.setRows(RowSet.newBuilder().addRowRanges(RowRange.getDefaultInstance()))
10998
.build();
11099
}
111100

112-
for (ByteString key : request.getRows().getRowKeysList()) {
101+
// Start building the resume request. The keys & ranges are cleared and will be recomputed.
102+
Builder builder = originalRequest.toBuilder();
103+
builder.clearRows();
104+
105+
RowSet.Builder rowSetBuilder = RowSet.newBuilder();
106+
107+
for (ByteString key : originalRequest.getRows().getRowKeysList()) {
113108
if (ByteStringComparator.INSTANCE.compare(key, lastKey) > 0) {
114109
rowSetBuilder.addRowKeys(key);
115110
}
116111
}
117112

118-
for (RowRange rowRange : request.getRows().getRowRangesList()) {
113+
for (RowRange rowRange : originalRequest.getRows().getRowRangesList()) {
119114
RowRange.Builder rowRangeBuilder = RowRange.newBuilder();
120115

121116
switch (rowRange.getEndKeyCase()) {
@@ -170,10 +165,17 @@ public ReadRowsRequest getResumeRequest(ReadRowsRequest request) {
170165
// will be handled by ReadRowsRetryCompletedCallable. See docs in ReadRowsRetryCompletedCallable
171166
// for more details.
172167
if ((rowSetBuilder.getRowRangesCount() == 0 && rowSetBuilder.getRowKeysCount() == 0)
173-
|| (request.getRowsLimit() > 0 && request.getRowsLimit() == numProcessed)) {
168+
|| (originalRequest.getRowsLimit() > 0 && originalRequest.getRowsLimit() == numProcessed)) {
174169
return ReadRowsRetryCompletedCallable.FULFILLED_REQUEST_MARKER;
175170
}
176171

172+
if (originalRequest.getRowsLimit() > 0) {
173+
Preconditions.checkState(
174+
originalRequest.getRowsLimit() > numProcessed,
175+
"Detected too many rows for the current row limit during a retry.");
176+
builder.setRowsLimit(originalRequest.getRowsLimit() - numProcessed);
177+
}
178+
177179
builder.setRows(rowSetBuilder.build());
178180
return builder.build();
179181
}

0 commit comments

Comments
 (0)