Skip to content

Commit 0b6185a

Browse files
committed
fix
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 7989d58 commit 0b6185a

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

core/src/main/java/com/cloud/storage/template/HttpTemplateDownloader.java

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public class HttpTemplateDownloader extends ManagedContextRunnable implements Te
9292
"x-original-content-length",
9393
"x-oss-meta-content-length",
9494
"x-file-size");
95+
private static final long MIN_FORMAT_VERIFICATION_SIZE = 1024 * 1024;
9596

9697
public HttpTemplateDownloader(StorageLayer storageLayer, String downloadUrl, String toDir, DownloadCompleteCallback callback, long maxTemplateSizeInBytes,
9798
String user, String password, Proxy proxy, ResourceType resourceType) {
@@ -217,11 +218,9 @@ public long download(boolean resume, DownloadCompleteCallback callback) {
217218
RandomAccessFile out = new RandomAccessFile(file, "rw");
218219
) {
219220
out.seek(localFileSize);
220-
221-
logger.info("Starting download from " + downloadUrl + " to " + toFile + " remoteSize=" + toHumanReadableSize(remoteSize) + " , max size=" + toHumanReadableSize(maxTemplateSizeInBytes));
222-
221+
logger.info("Starting download from {} to {} remoteSize={} , max size={}",downloadUrl, toFile,
222+
toHumanReadableSize(remoteSize), toHumanReadableSize(maxTemplateSizeInBytes));
223223
boolean eof = copyBytes(file, in, out);
224-
225224
Date finish = new Date();
226225
checkDownloadCompletion(eof);
227226
downloadTime += finish.getTime() - start.getTime();
@@ -249,28 +248,32 @@ public long download(boolean resume, DownloadCompleteCallback callback) {
249248
}
250249

251250
private boolean copyBytes(File file, InputStream in, RandomAccessFile out) throws IOException {
252-
int bytes;
253-
byte[] block = new byte[CHUNK_SIZE];
251+
byte[] buffer = new byte[CHUNK_SIZE];
254252
long offset = 0;
255-
boolean done = false;
256253
VerifyFormat verifyFormat = new VerifyFormat(file);
257254
status = Status.IN_PROGRESS;
258-
while (!done && status != Status.ABORTED && offset <= remoteSize) {
259-
if ((bytes = in.read(block, 0, CHUNK_SIZE)) > -1) {
260-
offset = writeBlock(bytes, out, block, offset);
261-
if (!ResourceType.SNAPSHOT.equals(resourceType) &&
262-
!verifyFormat.isVerifiedFormat() &&
263-
(offset >= 1048576 || offset >= remoteSize)) { //let's check format after we get 1MB or full file
264-
verifyFormat.invoke();
265-
}
266-
} else {
267-
done = true;
255+
while (status != Status.ABORTED) {
256+
int bytesRead = in.read(buffer, 0, CHUNK_SIZE);
257+
if (bytesRead == -1) {
258+
logger.debug("Reached EOF on input stream");
259+
break;
260+
}
261+
offset = writeBlock(bytesRead, out, buffer, offset);
262+
if (!ResourceType.SNAPSHOT.equals(resourceType)
263+
&& !verifyFormat.isVerifiedFormat()
264+
&& (offset >= MIN_FORMAT_VERIFICATION_SIZE || offset >= remoteSize)) {
265+
verifyFormat.invoke();
266+
}
267+
if (offset >= remoteSize) {
268+
logger.debug("Reached expected remote size limit: {} bytes", remoteSize);
269+
break;
268270
}
269271
}
270272
out.getFD().sync();
271-
return !Status.ABORTED.equals(status) && done;
273+
return !Status.ABORTED.equals(status);
272274
}
273275

276+
274277
private long writeBlock(int bytes, RandomAccessFile out, byte[] block, long offset) throws IOException {
275278
out.write(block, 0, bytes);
276279
offset += bytes;
@@ -337,6 +340,8 @@ private boolean tryAndGetRemoteSize() {
337340
if (chunkedHeader != null && "chunked".equalsIgnoreCase(chunkedHeader.getValue())) {
338341
isChunkedTransfer = true;
339342
reportedRemoteSize = getRemoteSizeForChunkedTransfer();
343+
logger.debug("{} is using chunked transfer encoding, possible remote size: {}", downloadUrl,
344+
reportedRemoteSize);
340345
} else {
341346
status = Status.UNRECOVERABLE_ERROR;
342347
errorString = " Failed to receive length of download ";
@@ -352,9 +357,11 @@ private boolean tryAndGetRemoteSize() {
352357
return false;
353358
}
354359
}
355-
356360
if (remoteSize == 0) {
357361
remoteSize = reportedRemoteSize;
362+
if (remoteSize != 0) {
363+
logger.debug("Remote size for {} found to be {}", downloadUrl, toHumanReadableSize(remoteSize));
364+
}
358365
}
359366
return true;
360367
}

0 commit comments

Comments
 (0)