forked from I2P_Developers/i2p.i2p
i2psnark: Recreate deleted files on recheck/reopen (ticket #2125)
This commit is contained in:
@ -788,9 +788,29 @@ public class Storage implements Closeable
|
|||||||
{
|
{
|
||||||
if (_torrentFiles.isEmpty())
|
if (_torrentFiles.isEmpty())
|
||||||
throw new IOException("Storage not checked yet");
|
throw new IOException("Storage not checked yet");
|
||||||
for (TorrentFile tf : _torrentFiles) {
|
for (int i = 0; i < _torrentFiles.size(); i++) {
|
||||||
if (!tf.RAFfile.exists())
|
TorrentFile tf = _torrentFiles.get(i);
|
||||||
throw new IOException("File does not exist: " + tf);
|
if (!tf.RAFfile.exists()) {
|
||||||
|
// File should exist when we get here, but could have vanished
|
||||||
|
List<List<String>> files = metainfo.getFiles();
|
||||||
|
if (files != null) {
|
||||||
|
createFileFromNames(_base, files.get(i), _util.getFilesPublic());
|
||||||
|
} else {
|
||||||
|
if (!_base.createNewFile())
|
||||||
|
throw new IOException("File '" + tf.name + "' was deleted, unable to recreate");
|
||||||
|
}
|
||||||
|
synchronized(tf) {
|
||||||
|
tf.allocateFile();
|
||||||
|
// close as we go so we don't run out of file descriptors
|
||||||
|
try {
|
||||||
|
tf.closeRAF();
|
||||||
|
} catch (IOException ioe) {}
|
||||||
|
}
|
||||||
|
String msg = "File '" + tf.name + "' was deleted, must be downloaded again";
|
||||||
|
if (listener != null)
|
||||||
|
listener.addMessage(msg);
|
||||||
|
_log.error(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,18 +1043,32 @@ public class Storage implements Closeable
|
|||||||
// Make sure all files are available and of correct length
|
// Make sure all files are available and of correct length
|
||||||
// The files should all exist as they have been created with zero length by createFilesFromNames()
|
// The files should all exist as they have been created with zero length by createFilesFromNames()
|
||||||
long lengthProgress = 0;
|
long lengthProgress = 0;
|
||||||
for (TorrentFile tf : _torrentFiles)
|
for (int i = 0; i < _torrentFiles.size(); i++) {
|
||||||
{
|
TorrentFile tf = _torrentFiles.get(i);
|
||||||
long length = tf.RAFfile.length();
|
long length = tf.RAFfile.length();
|
||||||
lengthProgress += tf.length;
|
lengthProgress += tf.length;
|
||||||
if(tf.RAFfile.exists() && length == tf.length)
|
boolean exists = tf.RAFfile.exists();
|
||||||
{
|
if (exists && length == tf.length) {
|
||||||
if (listener != null)
|
if (listener != null)
|
||||||
listener.storageAllocated(this, length);
|
listener.storageAllocated(this, length);
|
||||||
_checkProgress.set(0);
|
_checkProgress.set(0);
|
||||||
resume = true; // XXX Could dynamicly check
|
resume = true; // XXX Could dynamicly check
|
||||||
|
} else if (length == 0) {
|
||||||
|
if (!exists) {
|
||||||
|
// File should exist when we get here, but could have vanished
|
||||||
|
// and we're now doing a recheck
|
||||||
|
List<List<String>> files = metainfo.getFiles();
|
||||||
|
if (files != null) {
|
||||||
|
createFileFromNames(_base, files.get(i), _util.getFilesPublic());
|
||||||
|
} else {
|
||||||
|
if (!_base.createNewFile())
|
||||||
|
throw new IOException("File '" + tf.name + "' was deleted, unable to recreate");
|
||||||
|
}
|
||||||
|
String msg = "File '" + tf.name + "' was deleted, must be downloaded again";
|
||||||
|
if (listener != null)
|
||||||
|
listener.addMessage(msg);
|
||||||
|
_log.error(msg);
|
||||||
}
|
}
|
||||||
else if (length == 0) {
|
|
||||||
changed = true;
|
changed = true;
|
||||||
synchronized(tf) {
|
synchronized(tf) {
|
||||||
allocateFile(tf);
|
allocateFile(tf);
|
||||||
@ -1506,6 +1540,8 @@ public class Storage implements Closeable
|
|||||||
* Sets isSparse[nr] = true. balloonFile(nr) should be called later to
|
* Sets isSparse[nr] = true. balloonFile(nr) should be called later to
|
||||||
* defrag the file.
|
* defrag the file.
|
||||||
*
|
*
|
||||||
|
* File MUST exist or will throw IOE
|
||||||
|
*
|
||||||
* This calls openRAF(); caller must synchronize and call closeRAF().
|
* This calls openRAF(); caller must synchronize and call closeRAF().
|
||||||
*/
|
*/
|
||||||
public synchronized void allocateFile() throws IOException {
|
public synchronized void allocateFile() throws IOException {
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
2018-07-14 zzz
|
||||||
|
* i2psnark: Recreate deleted files on recheck/reopen (ticket #2125)
|
||||||
|
|
||||||
2018-07-13 zzz
|
2018-07-13 zzz
|
||||||
* i2psnark: Add sequential order option (ticket #2234)
|
* i2psnark: Add sequential order option (ticket #2234)
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 11;
|
public final static long BUILD = 12;
|
||||||
|
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "";
|
public final static String EXTRA = "";
|
||||||
|
Reference in New Issue
Block a user