If a chunk has failed it needs to move the offset backwards,
otherwise this would misalign the stream, or make it possible
to call sendNextChunk() right after resend which could be
seen as the chunkTimer attempted to be started while already running.
Change-Id: I6d44195ae9bcb23075ffea9c4f1d1ab1d0540c93
Signed-off-by: Tomas Cere <tomas.cere@pantheon.tech>
(cherry picked from commit
6d4d0642f80555c2b5c8d2ff87681b600a22b4a0)
}
int incrementOffset() {
}
int incrementOffset() {
+ // if first chunk was retried, reset offset back to initial 0
+ if (offset == -1) {
+ offset = 0;
+ }
- // if prev chunk failed, we would want to sent the same chunk again
+ // if prev chunk failed, we would want to send the same chunk again
offset = offset + snapshotChunkSize;
}
return offset;
offset = offset + snapshotChunkSize;
}
return offset;
int incrementChunkIndex() {
if (replyStatus) {
int incrementChunkIndex() {
if (replyStatus) {
- // if prev chunk failed, we would want to sent the same chunk again
+ // if prev chunk failed, we would want to send the same chunk again
chunkIndex = chunkIndex + 1;
}
return chunkIndex;
chunkIndex = chunkIndex + 1;
}
return chunkIndex;
replyStatus = true;
lastChunkHashCode = nextChunkHashCode;
} else {
replyStatus = true;
lastChunkHashCode = nextChunkHashCode;
} else {
- // if the chunk sent was failure
- replyReceivedForOffset = offset;
+ // if the chunk sent was failure, revert offset to previous so we can retry
+ offset = replyReceivedForOffset;
replyStatus = false;
}
}
byte[] getNextChunk() throws IOException {
replyStatus = false;
}
}
byte[] getNextChunk() throws IOException {
+ // increment offset to indicate next chunk is in flight, canSendNextChunk() wont let us hit this again until,
+ // markSendStatus() is called with either success or failure
+ int start = incrementOffset();
if (replyStatus || currentChunk == null) {
if (replyStatus || currentChunk == null) {
- int start = incrementOffset();
int size = snapshotChunkSize;
if (snapshotChunkSize > snapshotSize) {
size = (int) snapshotSize;
int size = snapshotChunkSize;
if (snapshotChunkSize > snapshotSize) {
size = (int) snapshotSize;