summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-20 12:47:02 +0200
committerSimon Rettberg2015-08-20 12:47:02 +0200
commit86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd (patch)
tree9065390705e6e7de745bbe868b99752b3fd7aee3
parentMerge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1 (diff)
downloadtutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.tar.gz
tutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.tar.xz
tutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.zip
[client] Cancel hash generator if upload fails
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java12
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java10
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java10
3 files changed, 28 insertions, 4 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
index 26b96cb6..0361631c 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
@@ -25,6 +25,8 @@ public class AsyncHashGenerator implements Runnable {
private final String uploadToken;
+ private volatile boolean isCanceled = false;
+
public AsyncHashGenerator(String uploadToken, File uploadFile) {
this.uploadToken = uploadToken;
this.uploadFile = uploadFile;
@@ -52,6 +54,8 @@ public class AsyncHashGenerator implements Runnable {
byte[] buffer = new byte[(int) TransferTask.CHUNK_SIZE];
List<ByteBuffer> blockHashes = new ArrayList<>(list.size());
for (int i = 0; i < list.size(); i++) {
+ if (isCanceled)
+ break;
FileChunk chunk = list.get(i);
try {
file.seek(chunk.range.startOffset);
@@ -60,10 +64,14 @@ public class AsyncHashGenerator implements Runnable {
LOGGER.warn("Could not read file chunk " + chunk.getChunkIndex() + ", skipping", e);
continue;
}
+ if (isCanceled)
+ break;
digester.update(buffer, 0, chunk.range.getLength());
byte[] hash = digester.digest();
blockHashes.add(ByteBuffer.wrap(hash));
if (i <= 5 || i % 20 == 0 || i + 1 == list.size()) {
+ if (isCanceled)
+ break;
try {
ThriftManager.getSatClient().updateBlockHashes(uploadToken, blockHashes);
} catch (TInvalidTokenException e) {
@@ -79,4 +87,8 @@ public class AsyncHashGenerator implements Runnable {
}
}
+ public void cancel() {
+ isCanceled = true;
+ }
+
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
index 173d11c8..84a9da10 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
@@ -14,6 +14,7 @@ import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.log4j.Logger;
+import org.apache.thrift.TException;
import org.openslx.bwlp.thrift.iface.TImageDataException;
import org.openslx.dozmod.Config;
import org.openslx.dozmod.filetransfer.AsyncHashGenerator;
@@ -26,6 +27,7 @@ import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout;
import org.openslx.dozmod.state.UploadWizardState;
import org.openslx.dozmod.thrift.Session;
+import org.openslx.dozmod.thrift.ThriftError;
import org.openslx.dozmod.thrift.cache.MetaDataCache;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.Util;
@@ -190,6 +192,8 @@ public class ImageUploadPage extends ImageUploadPageLayout {
state.transferInformation = ThriftManager.getSatClient().requestImageVersionUpload(
Session.getSatelliteToken(), state.uuid, state.diskFile.length(), null,
state.meta.getFilteredDefinition());
+ } catch (TException e) {
+ ThriftError.showMessage(this, LOGGER, e, "Fehler beim Aushandeln des Uploads");
} catch (Exception e) {
Gui.showMessageBox(this, "Fehler beim Aushandeln des Uploads", MessageType.ERROR, LOGGER, e);
return false;
@@ -207,10 +211,11 @@ public class ImageUploadPage extends ImageUploadPageLayout {
+ state.diskFile.getAbsolutePath(), MessageType.ERROR, LOGGER, e);
return false;
}
- new Thread(new AsyncHashGenerator(state.transferInformation.token, state.diskFile)).start();
+ state.hashGen = new AsyncHashGenerator(state.transferInformation.token, state.diskFile);
+ new Thread(state.hashGen).start();
Util.sleep(50); // A little ugly... Give the hash generator a head start
new Thread(state.uploadTask).start();
- do {
+ do { // Even more ugly - block the GUI thread so we know whether the upload started, and only then switch to the next page
Util.sleep(5);
} while (state.uploadTask.getFailCount() == 0 && state.uploadTask.getTransferCount() == 0
&& !state.uploadTask.isCanceled());
@@ -219,6 +224,7 @@ public class ImageUploadPage extends ImageUploadPageLayout {
if (state.uploadTask.getTransferCount() == 0) {
Gui.showMessageBox(this, "Aufbau der Verbindung zum Hochladen fehlgeschlagen", MessageType.ERROR,
LOGGER, null);
+ state.hashGen.cancel();
state.uploadTask.cancel();
state.uploadTask = null;
return false;
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java b/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
index 24894dab..c3686c78 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/state/UploadWizardState.java
@@ -7,6 +7,7 @@ import org.openslx.bwlp.thrift.iface.ImagePermissions;
import org.openslx.bwlp.thrift.iface.OperatingSystem;
import org.openslx.bwlp.thrift.iface.ShareMode;
import org.openslx.bwlp.thrift.iface.TransferInformation;
+import org.openslx.dozmod.filetransfer.AsyncHashGenerator;
import org.openslx.dozmod.filetransfer.UploadTask;
import org.openslx.util.vm.VmMetaData;
@@ -37,7 +38,7 @@ public class UploadWizardState {
public boolean isRestricted = true;
// flags an image as a template
public boolean isTemplate = false;
-
+
// -- Objects returned by thrift calls --
// UUID given returned by the satellite after creating the image
public String uuid = null;
@@ -47,9 +48,14 @@ public class UploadWizardState {
* The upload task representing this new VM
*/
public UploadTask uploadTask = null;
-
+
/**
* Meta data (description file content) of this VM
*/
public VmMetaData meta = null;
+
+ /**
+ * Hash calculator
+ */
+ public AsyncHashGenerator hashGen;
}