Skip to content

Commit e408b9a

Browse files
Address code review feedback
- Make getRetryStartOffset() delegate to getLastCompleteSegmentStart() - Add validation for negative remainingCount in BlobAsyncClientBase - Improve message formatting in createRetryableException() Co-authored-by: gunjansingh-msft <[email protected]>
1 parent e8669ff commit e408b9a

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/specialized/BlobAsyncClientBase.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,12 +1427,19 @@ Mono<BlobDownloadAsyncResponse> downloadStreamWithResponse(BlobRange range, Down
14271427
.parseRetryStartOffset(throwable.getMessage());
14281428
if (retryStartOffset >= 0) {
14291429
long remainingCount = finalCount - retryStartOffset;
1430-
retryRange = new BlobRange(initialOffset + retryStartOffset, remainingCount);
1431-
1432-
LOGGER.info(
1433-
"Structured message smart retry from exception: resuming from offset {} "
1434-
+ "(initial={}, parsed={})",
1435-
initialOffset + retryStartOffset, initialOffset, retryStartOffset);
1430+
// Validate remainingCount to avoid negative values
1431+
if (remainingCount <= 0) {
1432+
LOGGER.warning("Retry offset {} exceeds finalCount {}, using fallback",
1433+
retryStartOffset, finalCount);
1434+
retryRange = new BlobRange(initialOffset + offset, newCount);
1435+
} else {
1436+
retryRange = new BlobRange(initialOffset + retryStartOffset, remainingCount);
1437+
1438+
LOGGER.info(
1439+
"Structured message smart retry from exception: resuming from offset {} "
1440+
+ "(initial={}, parsed={})",
1441+
initialOffset + retryStartOffset, initialOffset, retryStartOffset);
1442+
}
14361443
} else {
14371444
// Fallback to normal retry logic if no offset found
14381445
retryRange = new BlobRange(initialOffset + offset, newCount);

sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/implementation/structuredmessage/StructuredMessageDecoder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,14 @@ public long getLastCompleteSegmentStart() {
130130
/**
131131
* Returns the canonical absolute byte index (0-based) that should be used to resume a failed/incomplete download.
132132
* This MUST be used directly as the Range header start value: "Range: bytes={retryStartOffset}-"
133+
*
134+
* <p>This is equivalent to {@link #getLastCompleteSegmentStart()} but provides a clearer semantic name
135+
* for the smart retry use case.</p>
133136
*
134137
* @return The absolute byte index for the retry start offset.
135138
*/
136139
public long getRetryStartOffset() {
137-
return lastCompleteSegmentStart;
140+
return getLastCompleteSegmentStart();
138141
}
139142

140143
/**

sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/policy/StorageContentValidationDecoderPolicy.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,12 @@ private IOException createRetryableException(DecoderState state, String message,
220220
long decodedSoFar = state.decoder.getTotalDecodedPayloadBytes();
221221
long expectedLength = state.decoder.getMessageLength();
222222

223+
// Build message components for clarity
224+
long displayExpected = expectedLength > 0 ? expectedLength : 0;
225+
String originalMessage = message != null ? message : "";
226+
223227
String fullMessage = String.format("Incomplete structured message: decoded %d of %d bytes. %s%d. %s",
224-
decodedSoFar, expectedLength > 0 ? expectedLength : 0, RETRY_OFFSET_TOKEN, retryOffset,
225-
message != null ? message : "");
228+
decodedSoFar, displayExpected, RETRY_OFFSET_TOKEN, retryOffset, originalMessage);
226229

227230
LOGGER.atInfo()
228231
.addKeyValue("retryOffset", retryOffset)

0 commit comments

Comments
 (0)