org.gudy.azureus2.core3.disk.impl
Class DiskManagerImpl

java.lang.Object
  extended by org.gudy.azureus2.core3.logging.LogRelation
      extended by org.gudy.azureus2.core3.disk.impl.DiskManagerImpl
All Implemented Interfaces:
DiskManager, DiskManagerHelper

public class DiskManagerImpl
extends LogRelation
implements DiskManagerHelper

The disk Wrapper.

Author:
Tdv_VgA, MjrTom 2005/Oct/08: new piece-picking support changes 2006/Jan/02: refactoring piece picking related code

Nested Class Summary
 
Nested classes/interfaces inherited from interface org.gudy.azureus2.core3.disk.DiskManager
DiskManager.GettingThere, DiskManager.OperationStatus
 
Field Summary
protected  DownloadManager download_manager
           
protected static ListenerManager<DiskManagerListener> listeners_aggregator
           
 
Fields inherited from interface org.gudy.azureus2.core3.disk.DiskManager
ALLOCATING, BLOCK_SIZE, BLOCK_SIZE_KB, CHECKING, ET_INSUFFICIENT_SPACE, ET_NONE, ET_OTHER, FAULTY, INITIALIZING, READY
 
Constructor Summary
DiskManagerImpl(TOTorrent _torrent, DownloadManager _dmanager)
           
 
Method Summary
 void accessModeChanged(DiskManagerFileInfoImpl file, int old_mode, int new_mode)
           
 void addListener(DiskManagerListener l)
           
 boolean checkBlockConsistencyForHint(java.lang.String originator, int pieceNumber, int offset, int length)
           
 boolean checkBlockConsistencyForRead(java.lang.String originator, boolean peer_request, int pieceNumber, int offset, int length)
          method for checking that the block details are sensible
 boolean checkBlockConsistencyForWrite(java.lang.String originator, int pieceNumber, int offset, DirectByteBuffer data)
          method for checking that the block details are sensible
 void checkFreePieceList(boolean force_discard)
           
 DiskManagerCheckRequest createCheckRequest(int pieceNumber, java.lang.Object user_data)
          Create a request to check a particular piece
 DiskManagerReadRequest createReadRequest(int pieceNumber, int offset, int length)
           
 DiskManagerWriteRequest createWriteRequest(int pieceNumber, int offset, DirectByteBuffer data, java.lang.Object user_data)
           
static void deleteDataFiles(TOTorrent torrent, java.lang.String torrent_save_dir, java.lang.String torrent_save_file, boolean force_no_recycle)
          Deletes all data files associated with torrent.
 void downloadEnded(DiskManager.OperationStatus op_status)
           
 void downloadRemoved()
           
 void enqueueCheckRequest(DiskManagerCheckRequest request, DiskManagerCheckRequestListener listener)
          enqueue an asynchronous single piece check
 void enqueueCompleteRecheckRequest(DiskManagerCheckRequest request, DiskManagerCheckRequestListener listener)
          recheck the entire torrent asynchronously, reporting each piece to the listener
 void enqueueReadRequest(DiskManagerReadRequest request, DiskManagerReadRequestListener listener)
          Enqueue an async disk read request.
 void enqueueWriteRequest(DiskManagerWriteRequest request, DiskManagerWriteRequestListener listener)
          enqueue an async write request
 boolean filesExist()
           
protected  boolean filesExist(java.lang.String root_dir)
           
 void generateEvidence(IndentWriter writer)
           
 long getAllocated()
           
 int getCacheMode()
           
 int getCompleteRecheckStatus()
          returns -1 if no recheck in progress, percentage complete in 1000 notation otherwise
static DiskAccessController getDefaultDiskAccessController()
           
 DiskAccessController getDiskAccessController()
           
 DownloadManager getDownloadManager()
           
 DownloadManagerState getDownloadState()
           
 java.lang.String getErrorMessage()
           
 int getErrorType()
           
 DiskManagerFileInfo[] getFiles()
           
 DiskManagerFileInfoSet getFileSet()
           
 java.lang.String getInternalName()
           
 int getLastPieceLength()
           
 int getMoveProgress()
          When a download's data is moving (for completion or removal events) this gives the progress in 1000 notation.
 int getNbPieces()
           
 int getPercentDone()
          Get the percentage done during checking, allocation or initializing
 int getPercentDoneExcludingDND()
           
 DiskManagerPiece getPiece(int PieceNumber)
           
 byte[] getPieceHash(int piece_number)
           
 int getPieceLength()
           
 int getPieceLength(int piece_number)
           
 DMPieceList getPieceList(int piece_number)
           
 DMPieceMap getPieceMap()
          DON'T CACHE the DMPieceMap - as it is designed to be discarded when not in use
 DiskManagerPiece[] getPieces()
           
 long getPriorityChangeMarker()
           
 java.lang.Object[] getQueryableInterfaces()
          Query this class for a reference to another class that it may hold
 long[] getReadStats()
           
 DiskManagerRecheckScheduler getRecheckScheduler()
           
 java.lang.String getRelationText()
          A short description of what your class holds that can be printed by the logger
 long getRemaining()
          Get remaining bytes to completion *including* DND files
 long getRemainingExcludingDND()
           
 java.io.File getSaveLocation()
           
 long getSizeExcludingDND()
           
 int getState()
           
static java.lang.String getStorageType(DownloadManager download_manager, int fileIndex)
           
 java.lang.String getStorageType(int fileIndex)
           
 java.lang.String[] getStorageTypes()
           
static java.lang.String[] getStorageTypes(DownloadManager download_manager)
           
 TOTorrent getTorrent()
           
 long getTotalLength()
           
 boolean hasListener(DiskManagerListener l)
           
 boolean hasOutstandingCheckRequestForPiece(int piece_number)
           
 boolean hasOutstandingReadRequestForPiece(int piece_number)
           
 boolean hasOutstandingWriteRequestForPiece(int piece_number)
           
 boolean isDone(int pieceNumber)
           
 boolean isInteresting(int pieceNumber)
           
 boolean isStopped()
           
 void moveDataFiles(java.io.File new_parent_dir, java.lang.String new_name, DiskManager.OperationStatus op_status)
           
protected  void moveFiles(SaveLocationChange loc_change, boolean change_to_read_only, DiskManager.OperationStatus op_status)
           
 void priorityChanged(DiskManagerFileInfo file)
           
 DirectByteBuffer readBlock(int pieceNumber, int offset, int length)
           
 void removeListener(DiskManagerListener l)
           
 void saveResumeData(boolean interim_save)
           
 void saveState()
          Save the individual file priorities map to DownloadManager.getData( "file_priorities" ).
protected  void saveState(boolean persist)
           
 void setAllocated(long num)
           
 void setFailed(DiskManagerFileInfo file, java.lang.String reason)
           
 void setFailed(java.lang.String reason)
          Stops the disk manager and informs the download manager that things have gone wrong.
static void setFileLinks(DownloadManager download_manager, LinkFileMap links)
           
 void setPercentDone(int num)
           
 void setPieceCheckingEnabled(boolean enabled)
           
 void setPieceDone(DiskManagerPieceImpl dmPiece, boolean done)
          Called when status has CHANGED and should only be called by DiskManagerPieceImpl
protected  void setState(int _state)
           
 void skippedFileSetChanged(DiskManagerFileInfo file)
           
 void start()
          Start checking/allocating
 boolean stop(boolean closing)
          Stop can go async if the download is in a 'starting' state - if so this method returns true
protected static void storeFileDownloaded(DownloadManager download_manager, DiskManagerFileInfo[] files, boolean persist)
           
protected  void storeFilePriorities()
           
protected static void storeFilePriorities(DownloadManager download_manager, DiskManagerFileInfo[] files)
           
 
Methods inherited from class org.gudy.azureus2.core3.logging.LogRelation
propogatedRelationText, queryForClass, queryForClass
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

download_manager

protected final DownloadManager download_manager

listeners_aggregator

protected static final ListenerManager<DiskManagerListener> listeners_aggregator
Constructor Detail

DiskManagerImpl

public DiskManagerImpl(TOTorrent _torrent,
                       DownloadManager _dmanager)
Method Detail

getDefaultDiskAccessController

public static DiskAccessController getDefaultDiskAccessController()

start

public void start()
Description copied from interface: DiskManager
Start checking/allocating

Specified by:
start in interface DiskManager

stop

public boolean stop(boolean closing)
Description copied from interface: DiskManager
Stop can go async if the download is in a 'starting' state - if so this method returns true

Specified by:
stop in interface DiskManager
Returns:

isStopped

public boolean isStopped()
Specified by:
isStopped in interface DiskManager

filesExist

public boolean filesExist()
Specified by:
filesExist in interface DiskManager
Returns:
whether all files exist and sizes match

filesExist

protected boolean filesExist(java.lang.String root_dir)

getDiskAccessController

public DiskAccessController getDiskAccessController()
Specified by:
getDiskAccessController in interface DiskManagerHelper

enqueueReadRequest

public void enqueueReadRequest(DiskManagerReadRequest request,
                               DiskManagerReadRequestListener listener)
Description copied from interface: DiskManager
Enqueue an async disk read request.

Specified by:
enqueueReadRequest in interface DiskManager

hasOutstandingReadRequestForPiece

public boolean hasOutstandingReadRequestForPiece(int piece_number)
Specified by:
hasOutstandingReadRequestForPiece in interface DiskManager

getNbPieces

public int getNbPieces()
Specified by:
getNbPieces in interface DiskManager

getPercentDone

public int getPercentDone()
Description copied from interface: DiskManager
Get the percentage done during checking, allocation or initializing

Specified by:
getPercentDone in interface DiskManager
Returns:
percent done * 1000 (1000 = 100%)

setPercentDone

public void setPercentDone(int num)
Specified by:
setPercentDone in interface DiskManagerHelper

getRemaining

public long getRemaining()
Description copied from interface: DiskManager
Get remaining bytes to completion *including* DND files

Specified by:
getRemaining in interface DiskManager

getRemainingExcludingDND

public long getRemainingExcludingDND()
Specified by:
getRemainingExcludingDND in interface DiskManager

getSizeExcludingDND

public long getSizeExcludingDND()
Specified by:
getSizeExcludingDND in interface DiskManager

getPercentDoneExcludingDND

public int getPercentDoneExcludingDND()
Specified by:
getPercentDoneExcludingDND in interface DiskManager

getAllocated

public long getAllocated()
Specified by:
getAllocated in interface DiskManagerHelper

setAllocated

public void setAllocated(long num)
Specified by:
setAllocated in interface DiskManagerHelper

setPieceDone

public void setPieceDone(DiskManagerPieceImpl dmPiece,
                         boolean done)
Called when status has CHANGED and should only be called by DiskManagerPieceImpl

Specified by:
setPieceDone in interface DiskManagerHelper

accessModeChanged

public void accessModeChanged(DiskManagerFileInfoImpl file,
                              int old_mode,
                              int new_mode)
Specified by:
accessModeChanged in interface DiskManagerHelper

getPieces

public DiskManagerPiece[] getPieces()
Specified by:
getPieces in interface DiskManager

getPiece

public DiskManagerPiece getPiece(int PieceNumber)
Specified by:
getPiece in interface DiskManager

getPieceLength

public int getPieceLength()
Specified by:
getPieceLength in interface DiskManager

getPieceLength

public int getPieceLength(int piece_number)
Specified by:
getPieceLength in interface DiskManager

getTotalLength

public long getTotalLength()
Specified by:
getTotalLength in interface DiskManager

getLastPieceLength

public int getLastPieceLength()

getState

public int getState()
Specified by:
getState in interface DiskManager

setState

protected void setState(int _state)

getFiles

public DiskManagerFileInfo[] getFiles()
Specified by:
getFiles in interface DiskManager

getFileSet

public DiskManagerFileInfoSet getFileSet()
Specified by:
getFileSet in interface DiskManager

getErrorMessage

public java.lang.String getErrorMessage()
Specified by:
getErrorMessage in interface DiskManager

getErrorType

public int getErrorType()
Specified by:
getErrorType in interface DiskManager

setFailed

public void setFailed(java.lang.String reason)
Description copied from interface: DiskManagerHelper
Stops the disk manager and informs the download manager that things have gone wrong.

Specified by:
setFailed in interface DiskManagerHelper

setFailed

public void setFailed(DiskManagerFileInfo file,
                      java.lang.String reason)
Specified by:
setFailed in interface DiskManagerHelper

getCacheMode

public int getCacheMode()
Specified by:
getCacheMode in interface DiskManager

getReadStats

public long[] getReadStats()
Specified by:
getReadStats in interface DiskManager

getPieceMap

public DMPieceMap getPieceMap()
Description copied from interface: DiskManager
DON'T CACHE the DMPieceMap - as it is designed to be discarded when not in use

Specified by:
getPieceMap in interface DiskManager
Returns:

getPieceList

public DMPieceList getPieceList(int piece_number)
Specified by:
getPieceList in interface DiskManager
Specified by:
getPieceList in interface DiskManagerHelper

checkFreePieceList

public void checkFreePieceList(boolean force_discard)

getPieceHash

public byte[] getPieceHash(int piece_number)
                    throws TOTorrentException
Specified by:
getPieceHash in interface DiskManagerHelper
Throws:
TOTorrentException

createReadRequest

public DiskManagerReadRequest createReadRequest(int pieceNumber,
                                                int offset,
                                                int length)
Specified by:
createReadRequest in interface DiskManager

createCheckRequest

public DiskManagerCheckRequest createCheckRequest(int pieceNumber,
                                                  java.lang.Object user_data)
Description copied from interface: DiskManager
Create a request to check a particular piece

Specified by:
createCheckRequest in interface DiskManager
Parameters:
pieceNumber - -1 for a complete recheck request
Returns:

hasOutstandingCheckRequestForPiece

public boolean hasOutstandingCheckRequestForPiece(int piece_number)
Specified by:
hasOutstandingCheckRequestForPiece in interface DiskManager

enqueueCompleteRecheckRequest

public void enqueueCompleteRecheckRequest(DiskManagerCheckRequest request,
                                          DiskManagerCheckRequestListener listener)
Description copied from interface: DiskManager
recheck the entire torrent asynchronously, reporting each piece to the listener

Specified by:
enqueueCompleteRecheckRequest in interface DiskManager

enqueueCheckRequest

public void enqueueCheckRequest(DiskManagerCheckRequest request,
                                DiskManagerCheckRequestListener listener)
Description copied from interface: DiskManager
enqueue an asynchronous single piece check

Specified by:
enqueueCheckRequest in interface DiskManager

getCompleteRecheckStatus

public int getCompleteRecheckStatus()
Description copied from interface: DiskManager
returns -1 if no recheck in progress, percentage complete in 1000 notation otherwise

Specified by:
getCompleteRecheckStatus in interface DiskManager
Returns:

getMoveProgress

public int getMoveProgress()
Description copied from interface: DiskManager
When a download's data is moving (for completion or removal events) this gives the progress in 1000 notation. -1 if nothing's going on

Specified by:
getMoveProgress in interface DiskManager
Returns:

setPieceCheckingEnabled

public void setPieceCheckingEnabled(boolean enabled)
Specified by:
setPieceCheckingEnabled in interface DiskManager

readBlock

public DirectByteBuffer readBlock(int pieceNumber,
                                  int offset,
                                  int length)
Specified by:
readBlock in interface DiskManager

createWriteRequest

public DiskManagerWriteRequest createWriteRequest(int pieceNumber,
                                                  int offset,
                                                  DirectByteBuffer data,
                                                  java.lang.Object user_data)
Specified by:
createWriteRequest in interface DiskManager

enqueueWriteRequest

public void enqueueWriteRequest(DiskManagerWriteRequest request,
                                DiskManagerWriteRequestListener listener)
Description copied from interface: DiskManager
enqueue an async write request

Specified by:
enqueueWriteRequest in interface DiskManager

hasOutstandingWriteRequestForPiece

public boolean hasOutstandingWriteRequestForPiece(int piece_number)
Specified by:
hasOutstandingWriteRequestForPiece in interface DiskManager

checkBlockConsistencyForWrite

public boolean checkBlockConsistencyForWrite(java.lang.String originator,
                                             int pieceNumber,
                                             int offset,
                                             DirectByteBuffer data)
Description copied from interface: DiskManager
method for checking that the block details are sensible

Specified by:
checkBlockConsistencyForWrite in interface DiskManager
Returns:

checkBlockConsistencyForRead

public boolean checkBlockConsistencyForRead(java.lang.String originator,
                                            boolean peer_request,
                                            int pieceNumber,
                                            int offset,
                                            int length)
Description copied from interface: DiskManager
method for checking that the block details are sensible

Specified by:
checkBlockConsistencyForRead in interface DiskManager
Returns:

checkBlockConsistencyForHint

public boolean checkBlockConsistencyForHint(java.lang.String originator,
                                            int pieceNumber,
                                            int offset,
                                            int length)
Specified by:
checkBlockConsistencyForHint in interface DiskManager

saveResumeData

public void saveResumeData(boolean interim_save)
                    throws java.lang.Exception
Specified by:
saveResumeData in interface DiskManager
Throws:
java.lang.Exception

downloadEnded

public void downloadEnded(DiskManager.OperationStatus op_status)
Specified by:
downloadEnded in interface DiskManager

downloadRemoved

public void downloadRemoved()
Specified by:
downloadRemoved in interface DiskManager

moveDataFiles

public void moveDataFiles(java.io.File new_parent_dir,
                          java.lang.String new_name,
                          DiskManager.OperationStatus op_status)
Specified by:
moveDataFiles in interface DiskManager

moveFiles

protected void moveFiles(SaveLocationChange loc_change,
                         boolean change_to_read_only,
                         DiskManager.OperationStatus op_status)

getTorrent

public TOTorrent getTorrent()
Specified by:
getTorrent in interface DiskManager
Specified by:
getTorrent in interface DiskManagerHelper

addListener

public void addListener(DiskManagerListener l)
Specified by:
addListener in interface DiskManager

removeListener

public void removeListener(DiskManagerListener l)
Specified by:
removeListener in interface DiskManager

hasListener

public boolean hasListener(DiskManagerListener l)
Specified by:
hasListener in interface DiskManager

deleteDataFiles

public static void deleteDataFiles(TOTorrent torrent,
                                   java.lang.String torrent_save_dir,
                                   java.lang.String torrent_save_file,
                                   boolean force_no_recycle)
Deletes all data files associated with torrent. Currently, deletes all files, then tries to delete the path recursively if the paths are empty. An unexpected result may be that a empty directory that the user created will be removed. TODO: only remove empty directories that are created for the torrent


skippedFileSetChanged

public void skippedFileSetChanged(DiskManagerFileInfo file)
Specified by:
skippedFileSetChanged in interface DiskManagerHelper

priorityChanged

public void priorityChanged(DiskManagerFileInfo file)
Specified by:
priorityChanged in interface DiskManagerHelper

storeFilePriorities

protected void storeFilePriorities()

storeFilePriorities

protected static void storeFilePriorities(DownloadManager download_manager,
                                          DiskManagerFileInfo[] files)

storeFileDownloaded

protected static void storeFileDownloaded(DownloadManager download_manager,
                                          DiskManagerFileInfo[] files,
                                          boolean persist)

saveState

public void saveState()
Description copied from interface: DiskManager
Save the individual file priorities map to DownloadManager.getData( "file_priorities" ).

Specified by:
saveState in interface DiskManager

saveState

protected void saveState(boolean persist)

getDownloadManager

public DownloadManager getDownloadManager()

getInternalName

public java.lang.String getInternalName()
Specified by:
getInternalName in interface DiskManagerHelper

getDownloadState

public DownloadManagerState getDownloadState()
Specified by:
getDownloadState in interface DiskManagerHelper

getSaveLocation

public java.io.File getSaveLocation()
Specified by:
getSaveLocation in interface DiskManager

getStorageTypes

public java.lang.String[] getStorageTypes()
Specified by:
getStorageTypes in interface DiskManagerHelper

getStorageType

public java.lang.String getStorageType(int fileIndex)
Specified by:
getStorageType in interface DiskManagerHelper

getStorageTypes

public static java.lang.String[] getStorageTypes(DownloadManager download_manager)

getStorageType

public static java.lang.String getStorageType(DownloadManager download_manager,
                                              int fileIndex)

setFileLinks

public static void setFileLinks(DownloadManager download_manager,
                                LinkFileMap links)

getRelationText

public java.lang.String getRelationText()
Description copied from class: LogRelation
A short description of what your class holds that can be printed by the logger

Overrides:
getRelationText in class LogRelation
Returns:

getQueryableInterfaces

public java.lang.Object[] getQueryableInterfaces()
Description copied from class: LogRelation
Query this class for a reference to another class that it may hold

Overrides:
getQueryableInterfaces in class LogRelation
Returns:
If found, the class desired. Otherwise, null.

getRecheckScheduler

public DiskManagerRecheckScheduler getRecheckScheduler()
Specified by:
getRecheckScheduler in interface DiskManagerHelper

isInteresting

public boolean isInteresting(int pieceNumber)
Specified by:
isInteresting in interface DiskManager
Returns:
true if the pieceNumber is Needed and not Done

isDone

public boolean isDone(int pieceNumber)
Specified by:
isDone in interface DiskManager

getPriorityChangeMarker

public long getPriorityChangeMarker()
Specified by:
getPriorityChangeMarker in interface DiskManager

generateEvidence

public void generateEvidence(IndentWriter writer)
Specified by:
generateEvidence in interface DiskManager