summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-19 20:04:49 +0200
committerSimon Rettberg2015-08-19 20:04:49 +0200
commit4d4fe3b86f5c92ea791507fe45d500f796d0dfc8 (patch)
tree2e9ab2c97fd9e66f6bd2d9ab136036693345ef26 /dozentenmodul/src/main/java
parent[server] Make a copy of the chunk before passing it to the async hash checker (diff)
downloadtutor-module-4d4fe3b86f5c92ea791507fe45d500f796d0dfc8.tar.gz
tutor-module-4d4fe3b86f5c92ea791507fe45d500f796d0dfc8.tar.xz
tutor-module-4d4fe3b86f5c92ea791507fe45d500f796d0dfc8.zip
[client] Send block hashes to server (TODO: master sha1sum)
Diffstat (limited to 'dozentenmodul/src/main/java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java82
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java12
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java5
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java5
4 files changed, 98 insertions, 6 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
new file mode 100644
index 00000000..26b96cb6
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java
@@ -0,0 +1,82 @@
+package org.openslx.dozmod.filetransfer;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.apache.thrift.TException;
+import org.openslx.bwlp.thrift.iface.TInvalidTokenException;
+import org.openslx.filetransfer.util.FileChunk;
+import org.openslx.thrifthelper.ThriftManager;
+import org.openslx.util.Util;
+
+public class AsyncHashGenerator implements Runnable {
+
+ private static final Logger LOGGER = Logger.getLogger(AsyncHashGenerator.class);
+
+ private final File uploadFile;
+
+ private final String uploadToken;
+
+ public AsyncHashGenerator(String uploadToken, File uploadFile) {
+ this.uploadToken = uploadToken;
+ this.uploadFile = uploadFile;
+ }
+
+ @Override
+ public void run() {
+ MessageDigest digester;
+ try {
+ digester = MessageDigest.getInstance("SHA-1");
+ } catch (NoSuchAlgorithmException e1) {
+ LOGGER.warn("No SHA-1 MD available. Cannot hash file", e1);
+ return;
+ }
+ final RandomAccessFile file;
+ try {
+ file = new RandomAccessFile(uploadFile, "r");
+ } catch (FileNotFoundException e) {
+ LOGGER.warn("Could not open file for hash-checking. Will not send checksums to satellite", e);
+ return;
+ }
+ try {
+ List<FileChunk> list = new ArrayList<>();
+ FileChunk.createChunkList(list, uploadFile.length(), null);
+ byte[] buffer = new byte[(int) TransferTask.CHUNK_SIZE];
+ List<ByteBuffer> blockHashes = new ArrayList<>(list.size());
+ for (int i = 0; i < list.size(); i++) {
+ FileChunk chunk = list.get(i);
+ try {
+ file.seek(chunk.range.startOffset);
+ file.readFully(buffer, 0, chunk.range.getLength());
+ } catch (IOException e) {
+ LOGGER.warn("Could not read file chunk " + chunk.getChunkIndex() + ", skipping", e);
+ continue;
+ }
+ 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()) {
+ try {
+ ThriftManager.getSatClient().updateBlockHashes(uploadToken, blockHashes);
+ } catch (TInvalidTokenException e) {
+ LOGGER.warn("Cannot send hashList to satellite: Sat claims uploadToken is invalid!");
+ break;
+ } catch (TException e) {
+ LOGGER.warn("Unknown exception when submitting hashList to sat", e);
+ }
+ }
+ }
+ } finally {
+ Util.safeClose(file);
+ }
+ }
+
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java
index 72f4f6e0..fabf1d66 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java
@@ -54,8 +54,13 @@ public abstract class TransferTask implements Runnable {
TransferEvent event = getTransferEvent();
if (event != null) {
fireEvent(event);
- if (event.state == TransferState.ERROR || event.state == TransferState.FINISHED)
+ if (event.state == TransferState.ERROR) {
break;
+ }
+ if (event.state == TransferState.FINISHED) {
+ isComplete = true;
+ break;
+ }
}
ensureActivity();
Util.sleep(UPDATE_INTERVAL_MS);
@@ -205,8 +210,9 @@ public abstract class TransferTask implements Runnable {
endgame = true;
}
if (success && transfers.isEmpty()) {
- LOGGER.debug("Transfer finished");
- isComplete = true;
+ LOGGER.debug("Transfer might have finished");
+ lastConnectionAttempt = System.currentTimeMillis() + 3000; // Throttle reconnects
+ return; // Skip ensureActivity check
}
}
ensureActivity();
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java
index 976da6b8..8a25f409 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java
@@ -16,7 +16,7 @@ import org.openslx.thrifthelper.TransferStatusWrapper;
@SuppressWarnings("serial")
public class BlockProgressBar extends JPanel {
- private final Color[] blockColors = new Color[5];
+ private final Color[] blockColors = new Color[6];
private final TransferStatusWrapper blocks = new TransferStatusWrapper(null);
@@ -25,12 +25,13 @@ public class BlockProgressBar extends JPanel {
public BlockProgressBar(byte[] blocks) {
super();
setupListeners();
- // 0 = complete, 1 = missing, 2 = uploading, 3 = queued for copying, 4 = copying
+ // 0 = complete, 1 = missing, 2 = uploading, 3 = queued for copying, 4 = copying, 5 = hashing
blockColors[0] = Color.BLACK;
blockColors[1] = Color.RED;
blockColors[2] = Color.YELLOW;
blockColors[3] = Color.BLUE;
blockColors[4] = Color.GREEN;
+ blockColors[5] = Color.YELLOW.darker();
this.blocks.setBlocks(blocks);
}
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 2e4ce13e..1831a5d3 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
@@ -16,11 +16,12 @@ import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.TImageDataException;
import org.openslx.dozmod.Config;
+import org.openslx.dozmod.filetransfer.AsyncHashGenerator;
import org.openslx.dozmod.filetransfer.UploadTask;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
-import org.openslx.dozmod.gui.helper.QFileChooser;
import org.openslx.dozmod.gui.helper.MessageType;
+import org.openslx.dozmod.gui.helper.QFileChooser;
import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout;
import org.openslx.dozmod.state.UploadWizardState;
@@ -201,6 +202,8 @@ public class ImageUploadPage extends ImageUploadPageLayout {
+ state.diskFile.getAbsolutePath(), MessageType.ERROR, LOGGER, e);
return false;
}
+ new Thread(new AsyncHashGenerator(state.transferInformation.token, state.diskFile)).start();
+ Util.sleep(50); // A little ugly... Give the hash generator a head start
new Thread(state.uploadTask).start();
do {
Util.sleep(5);