diff options
| author | Simon Rettberg | 2015-08-20 12:47:02 +0200 |
|---|---|---|
| committer | Simon Rettberg | 2015-08-20 12:47:02 +0200 |
| commit | 86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd (patch) | |
| tree | 9065390705e6e7de745bbe868b99752b3fd7aee3 /dozentenmodul/src/main/java | |
| parent | Merge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1 (diff) | |
| download | tutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.tar.gz tutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.tar.xz tutor-module-86bb3209abe911407ae9ddd05cf34ffc5cf9dfcd.zip | |
[client] Cancel hash generator if upload fails
Diffstat (limited to 'dozentenmodul/src/main/java')
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; } |
