diff options
author | Simon Rettberg | 2022-03-21 17:20:23 +0100 |
---|---|---|
committer | Simon Rettberg | 2022-03-21 17:20:23 +0100 |
commit | 4efd5a37d8489463f20a9865ba7211db0b31f4c5 (patch) | |
tree | 7e2945515e368b64416e4976e98aa67c74b223ee /src/main/java/org/openslx/filetransfer/Uploader.java | |
parent | Add more log output to file transfer classes (diff) | |
download | master-sync-shared-4efd5a37d8489463f20a9865ba7211db0b31f4c5.tar.gz master-sync-shared-4efd5a37d8489463f20a9865ba7211db0b31f4c5.tar.xz master-sync-shared-4efd5a37d8489463f20a9865ba7211db0b31f4c5.zip |
[FileTransfer] Log stack traces on error, some OOM handling
Try smaller buffers for uploading on OOM errors.
Log error reason instead of just sending to peer, and also
print a stack trace if applicable.
Diffstat (limited to 'src/main/java/org/openslx/filetransfer/Uploader.java')
-rw-r--r-- | src/main/java/org/openslx/filetransfer/Uploader.java | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/main/java/org/openslx/filetransfer/Uploader.java b/src/main/java/org/openslx/filetransfer/Uploader.java index 73445aa..ed6e972 100644 --- a/src/main/java/org/openslx/filetransfer/Uploader.java +++ b/src/main/java/org/openslx/filetransfer/Uploader.java @@ -136,6 +136,18 @@ public class Uploader extends Transfer this.close( "Could not open given file for reading.", callback, true ); return false; } + byte[] data = null; + // Cannot go above 500000 for backwards compat + for ( int bufsiz = 500; bufsiz >= 100 && data == null; bufsiz -= 100 ) { + try { + data = new byte[ bufsiz * 1000 ]; + } catch ( OutOfMemoryError e ) { + } + } + if ( data == null ) { + this.close( "Could not allocate buffer for reading.", callback, true ); + return false; + } while ( !Thread.currentThread().isInterrupted() ) { // Loop as long as remote peer is requesting chunks from this file // Read meta data of remote peer - either new range, or it's telling us it's done MetaData meta = readMetaData(); @@ -158,14 +170,14 @@ public class Uploader extends Transfer return false; } } catch ( IOException e ) { - this.close( "Could not get current length of file " + filename, callback, false ); + this.close( "Could not get current length of file " + filename, callback, false, e ); return false; } // Seek to requested chunk try { file.seek( requestedRange.startOffset ); } catch ( IOException e ) { - this.close( "Could not seek to start of requested range in given file (" + requestedRange.startOffset + ")", callback, true ); + this.close( "Could not seek to start of requested range in given file (" + requestedRange.startOffset + ")", callback, true, e ); return false; } // Send confirmation of range and compression mode we're about to send @@ -185,7 +197,6 @@ public class Uploader extends Transfer return false; } // Finally send requested chunk - byte[] data = new byte[ 500000 ]; // 500kb int hasRead = 0; int length = requestedRange.getLength(); while ( hasRead < length ) { @@ -193,7 +204,7 @@ public class Uploader extends Transfer try { ret = file.read( data, 0, Math.min( length - hasRead, data.length ) ); } catch ( IOException e ) { - this.close( "Error reading from file ", callback, true ); + this.close( "Error reading from file ", callback, true, e ); return false; } if ( ret == -1 ) { @@ -204,7 +215,7 @@ public class Uploader extends Transfer try { outStr.write( data, 0, ret ); } catch ( IOException e ) { - this.close( "Sending payload failed" ); + this.close( "Sending payload failed", e ); return false; } if ( callback != null ) |