Skip to content

Commit 0fac4a2

Browse files
Edison SuEdison Su
authored andcommitted
bug 10380: after finishing download template, caculate checksum and report to mgt server
status 10380: resolved fixed
1 parent cb6f1b6 commit 0fac4a2

5 files changed

Lines changed: 76 additions & 9 deletions

File tree

agent-simulator/src/com/cloud/agent/manager/MockStorageManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ public DownloadAnswer Download(DownloadCommand cmd) {
325325
volume.setStatus(Status.DOWNLOAD_IN_PROGRESS);
326326
volume = _mockVolumeDao.persist(volume);
327327

328-
return new DownloadAnswer(String.valueOf(volume.getId()), 0, "Downloading", Status.DOWNLOAD_IN_PROGRESS, cmd.getName(), cmd.getName(), volume.getSize(), volume.getSize());
328+
return new DownloadAnswer(String.valueOf(volume.getId()), 0, "Downloading", Status.DOWNLOAD_IN_PROGRESS, cmd.getName(), cmd.getName(), volume.getSize(), volume.getSize(), null);
329329
}
330330

331331
@Override

api/src/com/cloud/agent/api/storage/DownloadAnswer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public class DownloadAnswer extends Answer {
3333
private String installPath;
3434
private long templateSize = 0L;
3535
private long templatePhySicalSize = 0L;
36+
private String checkSum;
37+
38+
public String getCheckSum() {
39+
return checkSum;
40+
}
3641

3742
public int getDownloadPct() {
3843
return downloadPct;
@@ -72,7 +77,7 @@ public DownloadAnswer(String errorString, Status status) {
7277
}
7378

7479
public DownloadAnswer(String jobId, int downloadPct, String errorString,
75-
Status downloadStatus, String fileSystemPath, String installPath, long templateSize, long templatePhySicalSize ) {
80+
Status downloadStatus, String fileSystemPath, String installPath, long templateSize, long templatePhySicalSize, String checkSum) {
7681
super();
7782
this.jobId = jobId;
7883
this.downloadPct = downloadPct;
@@ -83,6 +88,7 @@ public DownloadAnswer(String jobId, int downloadPct, String errorString,
8388
this.installPath = fixPath(installPath);
8489
this.templateSize = templateSize;
8590
this.templatePhySicalSize = templatePhySicalSize;
91+
this.checkSum = checkSum;
8692
}
8793

8894
public DownloadAnswer(String jobId, int downloadPct, Command command,

core/src/com/cloud/storage/template/DownloadManagerImpl.java

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@
1919

2020
import java.io.BufferedReader;
2121
import java.io.File;
22+
import java.io.FileInputStream;
2223
import java.io.IOException;
24+
import java.io.InputStream;
25+
import java.math.BigInteger;
2326
import java.net.URI;
2427
import java.net.URISyntaxException;
28+
import java.security.MessageDigest;
29+
import java.security.NoSuchAlgorithmException;
2530
import java.text.SimpleDateFormat;
2631
import java.util.ArrayList;
2732
import java.util.Date;
@@ -39,6 +44,7 @@
3944

4045
import org.apache.log4j.Logger;
4146

47+
import com.cloud.agent.api.Answer;
4248
import com.cloud.agent.api.storage.DownloadAnswer;
4349
import com.cloud.agent.api.storage.DownloadCommand;
4450
import com.cloud.agent.api.storage.DownloadProgressCommand;
@@ -196,6 +202,10 @@ public void setTemplatePhysicalSize(long templatePhysicalSize) {
196202
public long getTemplatePhysicalSize() {
197203
return templatePhysicalSize;
198204
}
205+
206+
public void setCheckSum(String checksum) {
207+
this.checksum = checksum;
208+
}
199209
}
200210

201211
public static final Logger s_logger = Logger.getLogger(DownloadManagerImpl.class);
@@ -262,6 +272,37 @@ public void setDownloadStatus(String jobId, Status status) {
262272
break;
263273
}
264274
}
275+
276+
private String computeCheckSum(File f) {
277+
byte[] buffer = new byte[8192];
278+
int read = 0;
279+
MessageDigest digest;
280+
String checksum = null;
281+
InputStream is = null;
282+
try {
283+
digest = MessageDigest.getInstance("MD5");
284+
is = new FileInputStream(f);
285+
while( (read = is.read(buffer)) > 0) {
286+
digest.update(buffer, 0, read);
287+
}
288+
byte[] md5sum = digest.digest();
289+
BigInteger bigInt = new BigInteger(1, md5sum);
290+
checksum = bigInt.toString(16);
291+
return checksum;
292+
}catch(IOException e) {
293+
return null;
294+
}catch (NoSuchAlgorithmException e) {
295+
return null;
296+
}
297+
finally {
298+
try {
299+
if(is != null)
300+
is.close();
301+
} catch (IOException e) {
302+
return null;
303+
}
304+
}
305+
}
265306

266307
/**
267308
* Post download activity (install and cleanup). Executed in context of downloader thread
@@ -355,7 +396,10 @@ private String postDownload(String jobId) {
355396
break;
356397
}
357398
}
358-
399+
400+
String checkSum = computeCheckSum(downloadedTemplate);
401+
dnld.setCheckSum(checkSum);
402+
359403
if (!loc.save()) {
360404
s_logger.warn("Cleaning up because we're unable to save the formats");
361405
loc.purge();
@@ -450,6 +494,14 @@ public long getDownloadTemplateSize(String jobId) {
450494
}
451495
return 0;
452496
}
497+
498+
public String getDownloadCheckSum(String jobId) {
499+
DownloadJob dj = jobs.get(jobId);
500+
if (dj != null) {
501+
return dj.getChecksum();
502+
}
503+
return null;
504+
}
453505

454506
public long getDownloadTemplatePhysicalSize(String jobId) {
455507
DownloadJob dj = jobs.get(jobId);
@@ -536,7 +588,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D
536588
return new DownloadAnswer("Internal Error", VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR);
537589
}
538590
return new DownloadAnswer(jobId, getDownloadPct(jobId), getDownloadError(jobId), getDownloadStatus2(jobId), getDownloadLocalPath(jobId), getInstallPath(jobId),
539-
getDownloadTemplateSize(jobId), getDownloadTemplateSize(jobId));
591+
getDownloadTemplateSize(jobId), getDownloadTemplateSize(jobId), getDownloadCheckSum(jobId));
540592
}
541593

542594
private void sleep() {
@@ -578,14 +630,14 @@ private DownloadAnswer handleDownloadProgressCmd(SecondaryStorageResource resour
578630
case PURGE:
579631
td.stopDownload();
580632
answer = new DownloadAnswer(jobId, getDownloadPct(jobId), getDownloadError(jobId), getDownloadStatus2(jobId), getDownloadLocalPath(jobId),
581-
getInstallPath(jobId), getDownloadTemplateSize(jobId), getDownloadTemplatePhysicalSize(jobId));
633+
getInstallPath(jobId), getDownloadTemplateSize(jobId), getDownloadTemplatePhysicalSize(jobId), getDownloadCheckSum(jobId));
582634
jobs.remove(jobId);
583635
return answer;
584636
default:
585637
break; // TODO
586638
}
587639
return new DownloadAnswer(jobId, getDownloadPct(jobId), getDownloadError(jobId), getDownloadStatus2(jobId), getDownloadLocalPath(jobId),
588-
getInstallPath(jobId), getDownloadTemplateSize(jobId), getDownloadTemplatePhysicalSize(jobId));
640+
getInstallPath(jobId), getDownloadTemplateSize(jobId), getDownloadTemplatePhysicalSize(jobId), getDownloadCheckSum(jobId));
589641
}
590642

591643
private String getInstallPath(String jobId) {

server/src/com/cloud/storage/download/DownloadListener.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.cloud.storage.VMTemplateHostVO;
4747
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
4848
import com.cloud.storage.VMTemplateVO;
49+
import com.cloud.storage.dao.VMTemplateDao;
4950
import com.cloud.storage.dao.VMTemplateHostDao;
5051
import com.cloud.storage.download.DownloadState.DownloadEvent;
5152
import com.cloud.utils.exception.CloudRuntimeException;
@@ -106,6 +107,7 @@ public void run() {
106107
private boolean downloadActive = true;
107108

108109
private VMTemplateHostDao vmTemplateHostDao;
110+
private VMTemplateDao _vmTemplateDao;
109111

110112
private final DownloadMonitorImpl downloadMonitor;
111113

@@ -123,7 +125,7 @@ public void run() {
123125
private final Map<String, DownloadState> stateMap = new HashMap<String, DownloadState>();
124126
private Long templateHostId;
125127

126-
public DownloadListener(HostVO ssAgent, HostVO host, VMTemplateVO template, Timer _timer, VMTemplateHostDao dao, Long templHostId, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd) {
128+
public DownloadListener(HostVO ssAgent, HostVO host, VMTemplateVO template, Timer _timer, VMTemplateHostDao dao, Long templHostId, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd, VMTemplateDao templateDao) {
127129
this.ssAgent = ssAgent;
128130
this.sserver = host;
129131
this.template = template;
@@ -136,6 +138,7 @@ public DownloadListener(HostVO ssAgent, HostVO host, VMTemplateVO template, Time
136138
this.timer = _timer;
137139
this.timeoutTask = new TimeoutTask(this);
138140
this.timer.schedule(timeoutTask, 3*STATUS_POLL_INTERVAL);
141+
this._vmTemplateDao = templateDao;
139142
updateDatabase(Status.NOT_DOWNLOADED, "");
140143
}
141144

@@ -261,6 +264,12 @@ public synchronized void updateDatabase(DownloadAnswer answer) {
261264
updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize());
262265

263266
vmTemplateHostDao.update(getTemplateHostId(), updateBuilder);
267+
268+
if (answer.getCheckSum() != null) {
269+
VMTemplateVO templateDaoBuilder = _vmTemplateDao.createForUpdate();
270+
templateDaoBuilder.setChecksum(answer.getCheckSum());
271+
_vmTemplateDao.update(template.getId(), templateDaoBuilder);
272+
}
264273
}
265274

266275
@Override

server/src/com/cloud/storage/download/DownloadMonitorImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public boolean copyTemplate(VMTemplateVO template, HostVO sourceServer, HostVO d
260260
s_logger.warn("There is no secondary storage VM for secondary storage host " + destServer.getName());
261261
return false;
262262
}
263-
DownloadListener dl = new DownloadListener(ssAhost, destServer, template, _timer, _vmTemplateHostDao, destTmpltHost.getId(), this, dcmd);
263+
DownloadListener dl = new DownloadListener(ssAhost, destServer, template, _timer, _vmTemplateHostDao, destTmpltHost.getId(), this, dcmd, _templateDao);
264264
if (downloadJobExists) {
265265
dl.setCurrState(destTmpltHost.getDownloadState());
266266
}
@@ -346,7 +346,7 @@ private void downloadTemplateToStorage(VMTemplateVO template, HostVO sserver) {
346346
s_logger.warn("There is no secondary storage VM for secondary storage host " + sserver.getName());
347347
return;
348348
}
349-
DownloadListener dl = new DownloadListener(ssAhost, sserver, template, _timer, _vmTemplateHostDao, vmTemplateHost.getId(), this, dcmd);
349+
DownloadListener dl = new DownloadListener(ssAhost, sserver, template, _timer, _vmTemplateHostDao, vmTemplateHost.getId(), this, dcmd, _templateDao);
350350
if (downloadJobExists) {
351351
dl.setCurrState(vmTemplateHost.getDownloadState());
352352
}

0 commit comments

Comments
 (0)