### Eclipse Workspace Patch 1.0 #P azureus2 Index: org/gudy/azureus2/core3/util/TorrentUtils.java =================================================================== RCS file: /cvsroot/azureus/azureus2/org/gudy/azureus2/core3/util/TorrentUtils.java,v retrieving revision 1.73 diff -u -r1.73 TorrentUtils.java --- org/gudy/azureus2/core3/util/TorrentUtils.java 4 Jun 2007 00:33:55 -0000 1.73 +++ org/gudy/azureus2/core3/util/TorrentUtils.java 15 Jun 2007 23:39:34 -0000 @@ -77,8 +77,7 @@ COConfigurationManager.addAndFireParameterListener("Save Torrent Backup", new ParameterListener() { public void parameterChanged(String parameterName) { - bSaveTorrentBackup = COConfigurationManager.getBooleanParameter( - parameterName, false); + bSaveTorrentBackup = COConfigurationManager.getBooleanParameter(parameterName); } }); @@ -116,6 +115,16 @@ * @throws TOTorrentException */ + public static ExtendedTorrent + readDelegateFromFile( + File file, + boolean force_initial_discard ) + + throws TOTorrentException + { + return((ExtendedTorrent)readFromFile( file, true, force_initial_discard )); + } + public static TOTorrent readFromFile( File file, @@ -240,11 +249,18 @@ try{ torrent.getMonitor().enter(); - // we've got to re-obtain the pieces here in case they've been thrown + // we've got to re-obtain the pieces etc. here in case they've been thrown // away to save memory *before* we rename the torrent file! - + torrent.getPieces(); + // restore fluff too + + if ( torrent_map_fluff != null ){ + + torrent.getAdditionalMapProperty( torrent_map_fluff ); + } + String str = torrent.getAdditionalStringProperty("torrent filename"); if (str == null){ @@ -259,7 +275,7 @@ File torrent_file = new File(str); - if ( ( force_backup ||COConfigurationManager.getBooleanParameter("Save Torrent Backup", false)) && + if ( ( force_backup ||COConfigurationManager.getBooleanParameter("Save Torrent Backup")) && torrent_file.exists()) { File torrent_file_bak = new File(str + ".bak"); @@ -335,20 +351,7 @@ throws TOTorrentException { - try{ - torrent.getMonitor().enter(); - - // we've got to re-obtain the pieces here in case they've been thrown - // away to save memory *before* we rename the torrent file! - - torrent.getPieces(); - - torrent.serialiseToBEncodedFile(file); - - }finally{ - - torrent.getMonitor().exit(); - } + torrent.serialiseToBEncodedFile(file); } public static void @@ -1338,16 +1341,51 @@ }); } - public static class + private static String torrent_map_fluff; + private static Map discarded_map = new HashMap(1); + + public static void + registerMapFluff( + String _fluff ) + { + synchronized( TorrentUtils.class ){ + + // lazyness - currently only one fluff item + + if ( torrent_map_fluff != null ){ + + Debug.out( "Excessive fluff detected" ); + + }else{ + + torrent_map_fluff = _fluff; + } + } + } + + public interface + ExtendedTorrent + extends TOTorrent + { + public byte[][] + peekPieces() + + throws TOTorrentException; + + public void + setDiscardFluff( + boolean discard ); + } + + private static class torrentDelegate extends LogRelation - implements TOTorrent + implements ExtendedTorrent { private TOTorrent delegate; private File file; private long last_pieces_read_time = SystemTime.getCurrentTime(); - private byte[][] pieces; protected torrentDelegate( @@ -1363,6 +1401,24 @@ } } + public void + setDiscardFluff( + boolean discard ) + { + if ( discard && torrent_map_fluff != null ){ + + try{ + getMonitor().enter(); + + delegate.setAdditionalMapProperty( torrent_map_fluff, discarded_map ); + + }finally{ + + getMonitor().exit(); + } + } + } + public byte[] getName() { @@ -1484,11 +1540,9 @@ try{ getMonitor().enter(); - TOTorrent temp = readFromFile( file, false ); - - res = temp.getPieces(); - - delegate.setPieces( res ); + restoreState( true, false ); + + res = delegate.getPieces(); }finally{ @@ -1499,6 +1553,58 @@ return( res ); } + /** + * monitor must be held before calling me + * @param do_pieces + * @param do_fluff + * @throws TOTorrentException + */ + + protected boolean[] + restoreState( + boolean do_pieces, + boolean do_fluff ) + + throws TOTorrentException + { + boolean had_pieces = delegate.getPieces() != null; + + boolean had_fluff = + torrent_map_fluff == null || + delegate.getAdditionalMapProperty( torrent_map_fluff ) != discarded_map; + + if ( had_pieces ){ + + do_pieces = false; + } + + if ( had_fluff ){ + + do_fluff = false; + } + + if ( do_pieces || do_fluff ){ + + TOTorrent temp = readFromFile( file, false ); + + if ( do_pieces ){ + + byte[][] res = temp.getPieces(); + + delegate.setPieces( res ); + } + + if ( do_fluff ){ + + delegate.setAdditionalMapProperty( + torrent_map_fluff, + temp.getAdditionalMapProperty( torrent_map_fluff )); + } + } + + return(new boolean[]{ do_pieces, do_fluff }); + } + /** * peeks the pieces, will return null if they are discarded * @return @@ -1658,6 +1764,35 @@ getAdditionalMapProperty( String name ) { + if ( torrent_map_fluff != null && name.equals( torrent_map_fluff )){ + + try{ + getMonitor().enter(); + + Map result = delegate.getAdditionalMapProperty( name ); + + if ( result == discarded_map ){ + + try{ + restoreState( false, true ); + + Map res = delegate.getAdditionalMapProperty( name ); + + System.out.println( "Retreived " + name + " -> " + res ); + + return( res ); + + }catch( Throwable e ){ + + Debug.out( "Property '" + name + " lost due to torrent read error", e ); + } + } + }finally{ + + getMonitor().exit(); + } + } + return( delegate.getAdditionalMapProperty( name )); } @@ -1681,15 +1816,13 @@ String name ) { delegate.removeAdditionalProperty( name ); - } - + } public void removeAdditionalProperties() { delegate.removeAdditionalProperties(); - } - + } public void serialiseToBEncodedFile( @@ -1701,17 +1834,20 @@ try{ getMonitor().enter(); + + boolean[] restored = restoreState( true, true ); - boolean had_pieces = delegate.getPieces() != null; - - getPieces(); - delegate.serialiseToBEncodedFile( target_file ); - if ( !had_pieces ){ + if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } + + if ( restored[1] ){ + + delegate.setAdditionalMapProperty( torrent_map_fluff, discarded_map ); + } }finally{ getMonitor().exit(); @@ -1729,17 +1865,20 @@ try{ getMonitor().enter(); - boolean had_pieces = delegate.getPieces() != null; - - getPieces(); + boolean[] restored = restoreState( true, true ); Map result = delegate.serialiseToMap(); - if ( !had_pieces ){ + if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } + if ( restored[1] ){ + + delegate.setAdditionalMapProperty( torrent_map_fluff, discarded_map ); + } + return( result ); }finally{ @@ -1751,7 +1890,7 @@ public void serialiseToXMLFile( - File target_file ) + File target_file ) throws TOTorrentException { @@ -1760,16 +1899,19 @@ try{ getMonitor().enter(); - boolean had_pieces = delegate.getPieces() != null; - - getPieces(); + boolean[] restored = restoreState( true, true ); delegate.serialiseToXMLFile( target_file ); - if ( !had_pieces ){ + if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } + + if ( restored[1] ){ + + delegate.setAdditionalMapProperty( torrent_map_fluff, discarded_map ); + } }finally{ getMonitor().exit(); Index: org/gudy/azureus2/core3/download/DownloadManagerState.java =================================================================== RCS file: /cvsroot/azureus/azureus2/org/gudy/azureus2/core3/download/DownloadManagerState.java,v retrieving revision 1.49 diff -u -r1.49 DownloadManagerState.java --- org/gudy/azureus2/core3/download/DownloadManagerState.java 12 Jun 2007 07:49:23 -0000 1.49 +++ org/gudy/azureus2/core3/download/DownloadManagerState.java 15 Jun 2007 23:39:34 -0000 @@ -284,6 +284,10 @@ public boolean hasAttribute(String name); public void + setActive( + boolean active ); + + public void save(); /** Index: org/gudy/azureus2/core3/download/impl/DownloadManagerImpl.java =================================================================== RCS file: /cvsroot/azureus/azureus2/org/gudy/azureus2/core3/download/impl/DownloadManagerImpl.java,v retrieving revision 1.329 diff -u -r1.329 DownloadManagerImpl.java --- org/gudy/azureus2/core3/download/impl/DownloadManagerImpl.java 10 May 2007 00:40:31 -0000 1.329 +++ org/gudy/azureus2/core3/download/impl/DownloadManagerImpl.java 15 Jun 2007 23:39:34 -0000 @@ -1409,6 +1409,8 @@ return; } + download_manager_state.setActive( true ); + try{ try{ this_mon.enter(); @@ -1561,7 +1563,13 @@ boolean remove_torrent, boolean remove_data ) { - controller.stopIt( state_after_stopping, remove_torrent, remove_data ); + try{ + controller.stopIt( state_after_stopping, remove_torrent, remove_data ); + + }finally{ + + download_manager_state.setActive( false ); + } } public boolean Index: org/gudy/azureus2/core3/download/impl/DownloadManagerStateImpl.java =================================================================== RCS file: /cvsroot/azureus/azureus2/org/gudy/azureus2/core3/download/impl/DownloadManagerStateImpl.java,v retrieving revision 1.66 diff -u -r1.66 DownloadManagerStateImpl.java --- org/gudy/azureus2/core3/download/impl/DownloadManagerStateImpl.java 12 Jun 2007 07:49:22 -0000 1.66 +++ org/gudy/azureus2/core3/download/impl/DownloadManagerStateImpl.java 15 Jun 2007 23:39:34 -0000 @@ -89,6 +89,8 @@ default_attributes.put( ATTRIBUTE_DEFAULTS[i][0], ATTRIBUTE_DEFAULTS[i][1] ); } + + TorrentUtils.registerMapFluff( TRACKER_CACHE_KEY ); } private static AEMonitor class_mon = new AEMonitor( "DownloadManagerState:class" ); @@ -99,7 +101,7 @@ private DownloadManagerImpl download_manager; - private TOTorrent torrent; + private TorrentUtils.ExtendedTorrent torrent; private boolean write_required; @@ -123,8 +125,8 @@ private static DownloadManagerState getDownloadState( DownloadManagerImpl download_manager, - TOTorrent original_torrent, - TOTorrent target_torrent ) + TOTorrent original_torrent, + TorrentUtils.ExtendedTorrent target_torrent ) throws TOTorrentException { @@ -179,14 +181,14 @@ // System.out.println( "getDownloadState: hash = " + ByteFormatter.encodeString(torrent_hash)); - TOTorrent saved_state = null; + TorrentUtils.ExtendedTorrent saved_state = null; File saved_file = getStateFile( torrent_hash ); if ( saved_file.exists()){ try{ - saved_state = TorrentUtils.readFromFile( saved_file, true ); + saved_state = TorrentUtils.readDelegateFromFile( saved_file, false ); }catch( Throwable e ){ @@ -200,7 +202,7 @@ TorrentUtils.copyToFile( original_torrent, saved_file ); - saved_state = TorrentUtils.readFromFile( saved_file, true ); + saved_state = TorrentUtils.readDelegateFromFile( saved_file, false ); } return( getDownloadState( null, original_torrent, saved_state )); @@ -211,7 +213,7 @@ DownloadManagerImpl download_manager, String torrent_file, byte[] torrent_hash, - boolean force_piece_discard ) + boolean inactive ) throws TOTorrentException { @@ -219,8 +221,8 @@ // System.out.println( "getDownloadState: hash = " + (torrent_hash==null?"null":ByteFormatter.encodeString(torrent_hash) + ", file = " + torrent_file )); - TOTorrent original_torrent = null; - TOTorrent saved_state = null; + TOTorrent original_torrent = null; + TorrentUtils.ExtendedTorrent saved_state = null; // first, if we already have the hash then see if we can load the saved state @@ -235,14 +237,15 @@ if ( cached_state != null ){ - CachedStateWrapper wrapper = new CachedStateWrapper( download_manager, torrent_file, torrent_hash, cached_state, force_piece_discard ); + CachedStateWrapper wrapper = new CachedStateWrapper( download_manager, torrent_file, torrent_hash, cached_state, inactive ); global_state_cache_wrappers.add( wrapper ); saved_state = wrapper; + }else{ - saved_state = TorrentUtils.readFromFile( saved_file, true, discard_pieces ); + saved_state = TorrentUtils.readDelegateFromFile( saved_file, discard_pieces ); } }catch( Throwable e ){ @@ -256,7 +259,7 @@ if ( saved_state == null ){ - original_torrent = TorrentUtils.readFromFile( new File(torrent_file), true, discard_pieces ); + original_torrent = TorrentUtils.readDelegateFromFile( new File(torrent_file), discard_pieces ); torrent_hash = original_torrent.getHash(); @@ -265,7 +268,7 @@ if ( saved_file.exists()){ try{ - saved_state = TorrentUtils.readFromFile( saved_file, true, discard_pieces ); + saved_state = TorrentUtils.readDelegateFromFile( saved_file, discard_pieces ); }catch( Throwable e ){ @@ -282,11 +285,18 @@ TorrentUtils.copyToFile( original_torrent, saved_file ); - saved_state = TorrentUtils.readFromFile( saved_file, true, discard_pieces ); + saved_state = TorrentUtils.readDelegateFromFile( saved_file, discard_pieces ); } } - return( getDownloadState( download_manager, original_torrent, saved_state )); + DownloadManagerState res = getDownloadState( download_manager, original_torrent, saved_state ); + + if ( inactive ){ + + res.setActive( false ); + } + + return( res ); } protected static File @@ -435,8 +445,8 @@ protected DownloadManagerStateImpl( - DownloadManagerImpl _download_manager, - TOTorrent _torrent ) + DownloadManagerImpl _download_manager, + TorrentUtils.ExtendedTorrent _torrent ) { download_manager = _download_manager; torrent = _torrent; @@ -670,6 +680,13 @@ } public void + setActive( + boolean active ) + { + torrent.setDiscardFluff( !active ); + } + + public void save() { boolean do_write; @@ -2391,6 +2408,11 @@ return( new CaseSensitiveFileMap()); } + public void + setActive(boolean active ) + { + } + public void save() { @@ -2453,8 +2475,8 @@ protected static class CachedStateWrapper - extends LogRelation - implements TOTorrent + extends LogRelation + implements TorrentUtils.ExtendedTorrent { private DownloadManagerImpl download_manager; @@ -2463,12 +2485,14 @@ private Map cache; private Map cache_attributes; - private TOTorrent delegate; - private TOTorrentException fixup_failure; + private TorrentUtils.ExtendedTorrent delegate; + private TOTorrentException fixup_failure; private boolean discard_pieces; private boolean logged_failure; + private volatile boolean discard_fluff; + protected CachedStateWrapper( DownloadManagerImpl _download_manager, @@ -2558,6 +2582,11 @@ delegate = loadRealState(); + if ( discard_fluff ){ + + delegate.setDiscardFluff( discard_fluff ); + } + if ( cache != null ){ Debug.out( "Cache miss forced fixup" ); @@ -2601,7 +2630,7 @@ return( false ); } - protected TOTorrent + protected TorrentUtils.ExtendedTorrent loadRealState() throws TOTorrentException @@ -2614,7 +2643,7 @@ try{ - return( TorrentUtils.readFromFile( saved_file, true, discard_pieces )); + return( TorrentUtils.readDelegateFromFile( saved_file, discard_pieces )); }catch( Throwable e ){ @@ -2633,7 +2662,7 @@ if ( saved_file.exists()){ try{ - return( TorrentUtils.readFromFile( saved_file, true, discard_pieces )); + return( TorrentUtils.readDelegateFromFile( saved_file, discard_pieces )); }catch( Throwable e ){ @@ -2648,7 +2677,7 @@ TorrentUtils.copyToFile( original_torrent, saved_file ); - return( TorrentUtils.readFromFile( saved_file, true, discard_pieces )); + return( TorrentUtils.readDelegateFromFile( saved_file, discard_pieces )); } @@ -2835,18 +2864,25 @@ throws TOTorrentException { if ( fixup()){ - - if ( delegate instanceof TorrentUtils.torrentDelegate ){ - - return(((TorrentUtils.torrentDelegate)delegate).peekPieces()); - } - - return( delegate.getPieces()); + + return( delegate.peekPieces()); } throw( fixup_failure ); } + public void + setDiscardFluff( + boolean discard ) + { + discard_fluff = discard; + + if ( delegate != null ){ + + delegate.setDiscardFluff( discard_fluff ); + } + } + public long getPieceLength() {